2009-01-08 10 views
18

मुझे आश्चर्य है कि डेटाबेस में सभी तालिकाओं के लिए सभी इंडेक्स सूचीबद्ध करने के लिए तरीका सबसे आसान है।सभी इंडेक्स लिस्टिंग

क्या मुझे प्रत्येक तालिका के लिए sp_helpindex पर कॉल करना चाहिए और परिणामों को एक temp तालिका में संग्रहीत करना चाहिए, या क्या कोई आसान तरीका है?

क्या कोई बता सकता है कि sysobjects में बाधाओं को क्यों संग्रहीत किया जाता है लेकिन अनुक्रमणिका नहीं हैं?

उत्तर

6

आप संदर्भ सकता sysindexes

एक और चाल sp_helpindex का मूल पाठ को देखने के लिए देखने के लिए कि यह कैसे अंतर्निहित तालिकाओं से जानकारी reconstructs है।

sp_helptext 'sp_helpindex' 

मैं इस के लिए एक संदर्भ की जरूरत नहीं है, लेकिन मेरा मानना ​​है कि बाधाओं sysobjects में संग्रहीत नहीं हैं, क्योंकि वे बात की एक अलग तरह की हैं; sysindexes sysobjects में वस्तुओं के बारे में मेटा डेटा शामिल हैं।

4

आप अधिक जानकारी की जरूरत है, यहाँ एक अच्छा SQL स्क्रिप्ट है, जो मैं समय-समय पर उपयोग करते हैं:

select 
    i.name as IndexName, 
    o.name as TableName, 
    ic.key_ordinal as ColumnOrder, 
    ic.is_included_column as IsIncluded, 
    co.[name] as ColumnName 
from sys.indexes i 
join sys.objects o on i.object_id = o.object_id 
join sys.index_columns ic on ic.object_id = i.object_id 
    and ic.index_id = i.index_id 
join sys.columns co on co.object_id = i.object_id 
    and co.column_id = ic.column_id 
where i.[type] = 2 
and i.is_unique = 0 
and i.is_primary_key = 0 
and o.[type] = 'U' 
--and ic.is_included_column = 0 
order by o.[name], i.[name], ic.is_included_column, ic.key_ordinal 
; 

:

DECLARE @TabName varchar(100) 

CREATE TABLE #temp (
    TabName varchar(200), IndexName varchar(200), IndexDescr varchar(200), 
    IndexKeys varchar(200), IndexSize int 
) 

DECLARE cur CURSOR FAST_FORWARD LOCAL FOR 
    SELECT name FROM sysobjects WHERE xtype = 'U' 

OPEN cur 

FETCH NEXT FROM cur INTO @TabName 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     INSERT INTO #temp (IndexName, IndexDescr, IndexKeys) 
     EXEC sp_helpindex @TabName 

     UPDATE #temp SET TabName = @TabName WHERE TabName IS NULL 

     FETCH NEXT FROM cur INTO @TabName 
    END 

CLOSE cur 
DEALLOCATE cur 

DECLARE @ValueCoef int 
SELECT @ValueCoef = low FROM Master.dbo.spt_values WHERE number = 1 AND type = N'E' 

UPDATE #temp SET IndexSize = 
    ((CAST(sysindexes.used AS bigint) * @ValueCoef)/1024)/1024 
     FROM sysobjects INNER JOIN sysindexes ON sysobjects.id = sysindexes.id 
      INNER JOIN #temp T ON T.TabName = sysobjects.name AND T.IndexName = sysindexes.name 

SELECT * FROM #temp 
ORDER BY TabName, IndexName 

DROP TABLE #temp 
33

क्वेरी का प्रकार का एक उदाहरण आप की जरूरत है यह एक निश्चित उद्देश्य के लिए कुछ हद तक विशिष्ट है (मैं डुप्लिकेट इंडेक्स खोजने और आउटपुट को प्रारूपित करने के लिए इसे थोड़ा सी # ऐप में उपयोग करता हूं ताकि यह वास्तव में मानव द्वारा पठनीय हो)। लेकिन आप इसे आसानी से अपनी जरूरतों के अनुरूप अनुकूलित कर सकते हैं।

+0

टाइप 2 गैर-क्लस्टर है, किसी अन्य कारण से आपने अन्य सभी इंडेक्स प्रकारों को फ़िल्टर किया है? सवाल की आवश्यकता नहीं है। एएनएसआई-संगतता के लिए https://msdn.microsoft.com/en-us/library/ms173760%28v=sql.110%29.aspx –

-1

अन्य उत्तर sysobjects या sys का उपयोग करते हुए SQL सर्वर विशिष्ट हैं। * कैटलॉग दृश्य - आप आईएसओ मानक INFORMATION_SCHEMA विचारों से परामर्श भी ले सकते हैं।

ये एकाधिक डेटाबेस विक्रेताओं में समर्थित हैं, उदा। एसक्यूएल सर्वर, MySQL, PostgreSQL और अधिक। सबसे अधिक संभावना है की तलाश कर रहे है:

SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 

जो बाहर अनूठा, प्राथमिक कुंजी और विदेशी कुंजी की कमी सूची जाएगा - सब कुछ एसक्यूएल सर्वर पर एक सूचकांक में बदल जाता है।

+0

+1 रेफरी करें! –

+12

एएनएसआई मानक दृश्य, 'INFORMATION_SCHEMA.TABLE_CONSTRAINTS' नियमित इंडेक्स नहीं दिखाएगा: यह केवल' UNIQUE', 'प्राथमिक कुंजी', 'विदेशी कुंजी' या 'चेक' के 'CONSTRAINT_TYPE' को प्रदर्शित करता है। देखें [प्रासंगिक अनुभाग फॉर्म "एसक्यूएल-99 पूर्ण, वास्तव में"] (https://mariadb.com/kb/en/sql-99-complete-really/16-sql-catalogs/the-information-chechema/information_schema -views/information_schematable_constraints /) –

3

यहां एक ऐसी स्क्रिप्ट है जो डेटाबेस में सभी अनुक्रमणिका को पुन: बनाने के लिए SQL कथन वापस कर देगी।

SELECT ' CREATE ' + 
     CASE 
      WHEN I.is_unique = 1 THEN ' UNIQUE ' 
      ELSE '' 
     END + 
     I.type_desc COLLATE DATABASE_DEFAULT + ' INDEX ' + 
     I.name + ' ON ' + 
     SCHEMA_NAME(T.schema_id) + '.' + T.name + ' (' + 
     KeyColumns + ') ' + 
     ISNULL(' INCLUDE (' + IncludedColumns + ') ', '') + 
     ISNULL(' WHERE ' + I.filter_definition, '') + ' WITH (' + 
     CASE 
      WHEN I.is_padded = 1 THEN ' PAD_INDEX = ON ' 
      ELSE ' PAD_INDEX = OFF ' 
     END + ',' + 
     'FILLFACTOR = ' + CONVERT(
      CHAR(5), 
      CASE 
       WHEN I.fill_factor = 0 THEN 100 
       ELSE I.fill_factor 
      END 
     ) + ',' + 
     -- default value 
     'SORT_IN_TEMPDB = OFF ' + ',' + 
     CASE 
      WHEN I.ignore_dup_key = 1 THEN ' IGNORE_DUP_KEY = ON ' 
      ELSE ' IGNORE_DUP_KEY = OFF ' 
     END + ',' + 
     CASE 
      WHEN ST.no_recompute = 0 THEN ' STATISTICS_NORECOMPUTE = OFF ' 
      ELSE ' STATISTICS_NORECOMPUTE = ON ' 
     END + ',' + 
     ' ONLINE = OFF ' + ',' + 
     CASE 
      WHEN I.allow_row_locks = 1 THEN ' ALLOW_ROW_LOCKS = ON ' 
      ELSE ' ALLOW_ROW_LOCKS = OFF ' 
     END + ',' + 
     CASE 
      WHEN I.allow_page_locks = 1 THEN ' ALLOW_PAGE_LOCKS = ON ' 
      ELSE ' ALLOW_PAGE_LOCKS = OFF ' 
     END + ') ON [' + 
     DS.name + ' ] ' + CHAR(13) + CHAR(10) + ' GO' [CreateIndexScript] 
FROM sys.indexes I 
     JOIN sys.tables T 
      ON T.object_id = I.object_id 
     JOIN sys.sysindexes SI 
      ON I.object_id = SI.id 
      AND I.index_id = SI.indid 
     JOIN (
       SELECT * 
       FROM (
          SELECT IC2.object_id, 
            IC2.index_id, 
            STUFF(
             (
              SELECT ' , ' + C.name + CASE 
                     WHEN MAX(CONVERT(INT, IC1.is_descending_key)) 
                      = 1 THEN 
                      ' DESC ' 
                     ELSE 
                      ' ASC ' 
                    END 
              FROM sys.index_columns IC1 
               JOIN sys.columns C 
                 ON C.object_id = IC1.object_id 
                 AND C.column_id = IC1.column_id 
                 AND IC1.is_included_column = 
                  0 
              WHERE IC1.object_id = IC2.object_id 
               AND IC1.index_id = IC2.index_id 
              GROUP BY 
               IC1.object_id, 
               C.name, 
               index_id 
              ORDER BY 
               MAX(IC1.key_ordinal) 
               FOR XML PATH('') 
            ), 
             1, 
             2, 
             '' 
           ) KeyColumns 
          FROM sys.index_columns IC2 
            --WHERE IC2.Object_id = object_id('Person.Address') --Comment for all tables 
          GROUP BY 
            IC2.object_id, 
            IC2.index_id 
         ) tmp3 
      )tmp4 
      ON I.object_id = tmp4.object_id 
      AND I.Index_id = tmp4.index_id 
     JOIN sys.stats ST 
      ON ST.object_id = I.object_id 
      AND ST.stats_id = I.index_id 
     JOIN sys.data_spaces DS 
      ON I.data_space_id = DS.data_space_id 
     JOIN sys.filegroups FG 
      ON I.data_space_id = FG.data_space_id 
     LEFT JOIN (
       SELECT * 
       FROM (
          SELECT IC2.object_id, 
            IC2.index_id, 
            STUFF(
             (
              SELECT ' , ' + C.name 
              FROM sys.index_columns IC1 
               JOIN sys.columns C 
                 ON C.object_id = IC1.object_id 
                 AND C.column_id = IC1.column_id 
                 AND IC1.is_included_column = 
                  1 
              WHERE IC1.object_id = IC2.object_id 
               AND IC1.index_id = IC2.index_id 
              GROUP BY 
               IC1.object_id, 
               C.name, 
               index_id 
               FOR XML PATH('') 
            ), 
             1, 
             2, 
             '' 
           ) IncludedColumns 
          FROM sys.index_columns IC2 
            --WHERE IC2.Object_id = object_id('Person.Address') --Comment for all tables 
          GROUP BY 
            IC2.object_id, 
            IC2.index_id 
         ) tmp1 
       WHERE IncludedColumns IS NOT NULL 
      ) tmp2 
      ON tmp2.object_id = I.object_id 
      AND tmp2.index_id = I.index_id 
WHERE I.is_primary_key = 0 
     AND I.is_unique_constraint = 0 
     --AND T.name NOT LIKE 'mt_%' 
     --AND I.name NOT LIKE 'mt_%' 
      --AND I.Object_id = object_id('Person.Address') --Comment for all tables 
      --AND I.name = 'IX_Address_PostalCode' --comment for all indexes 
संबंधित मुद्दे