दिलचस्प पोस्ट
किसी Windows निष्पादन योग्य में एक JRE एम्बेड करें? ऐप्लीकेशन में एएसपी.नेट असेंबलियों को जीवित कैसे रखना है? आशय – यदि गतिविधि चल रही है, उसे सामने लाएं, अन्यथा एक नया अधिसूचना शुरू करें (अधिसूचना से) कंसोल पर मुद्रण नहीं छपाई ईक्लिपस पर सी + + 11 पूर्ण समर्थन आईओएस में गैर आलसी छवि लोड हो रहा है कॉम्बो बॉक्स चयनितआइटम बनाम बना दिया वैल्यू एक .NET ऑब्जेक्ट की स्मृति ओवरहेड क्या है IPhone पर एक NSString के लिए एईएस एन्क्रिप्शन बिल्ड प्लान की गणना नहीं की जा सकी: प्लगइन org.apache.maven.plugins: maven-resources-plugin: 2.5 या इसके निर्भरता में से कोई भी हल नहीं किया जा सका IntelliJ IDEA में आंशिक संकलन को सक्षम करें कैसे textarea पर keypress दर्ज करने के लिए पकड़ लेकिन बदलाव नहीं + दर्ज करें? मैट्रिक्स के ब्लॉक-विकर्ण बाइंडिंग Django सीएसआरएफ फ्रेमवर्क अक्षम नहीं किया जा सकता है और मेरी साइट को तोड़ रहा है लिथियम / स्ट्राइकथ्रू को पूरी HTML तालिका पंक्ति से

SQL सर्वर डीबी में सभी सूचकांक और अनुक्रमणिका कॉलम की सूची

मैं SQL सर्वर 2005+ में सभी सूचकांक और अनुक्रमणिका कॉलमों की एक सूची कैसे प्राप्त करूं? निकटतम मुझे मिल सकता है:

select s.name, t.name, i.name, c.name from sys.tables t inner join sys.schemas s on t.schema_id = s.schema_id inner join sys.indexes i on i.object_id = t.object_id inner join sys.index_columns ic on ic.object_id = t.object_id inner join sys.columns c on c.object_id = t.object_id and ic.column_id = c.column_id where i.index_id > 0 and i.type in (1, 2) -- clustered & nonclustered only and i.is_primary_key = 0 -- do not include PK indexes and i.is_unique_constraint = 0 -- do not include UQ and i.is_disabled = 0 and i.is_hypothetical = 0 and ic.key_ordinal > 0 order by ic.key_ordinal 

जो वास्तव में मैं क्या चाहता हूँ नहीं है
मैं जो चाहता हूं, सभी उपयोगकर्ता-परिभाषित इंडेक्सस (सभी इंडेक्स की कोई अनुक्रमणिका नहीं, जो अद्वितीय बाधाओं और प्राथमिक कुंजी का समर्थन करता है) को सूचीबद्ध करने के लिए (सूचकांक परिभाषा में वे कैसे दिखाई देते हैं) प्लस जितना संभव हो उतना मेटाडेटा को सूचीबद्ध करना है।

Solutions Collecting From Web of "SQL सर्वर डीबी में सभी सूचकांक और अनुक्रमणिका कॉलम की सूची"

दो "sys" सूची दृश्य हैं जिन्हें आप परामर्श कर सकते हैं:

 select * from sys.indexes 

 select * from sys.index_columns 

वे आपको ऐसे किसी भी जानकारी के बारे में बताएंगे जो संभवतः आप सूचकांक और उनके कॉलम के बारे में चाहते हैं।

संपादित करें: आप जिन चीजों की तलाश कर रहे हैं, उनके बारे में यह पूछताछ सुंदर हो रही है:

 SELECT TableName = t.name, IndexName = ind.name, IndexId = ind.index_id, ColumnId = ic.index_column_id, ColumnName = col.name, ind.*, ic.*, col.* FROM sys.indexes ind INNER JOIN sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id INNER JOIN sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id INNER JOIN sys.tables t ON ind.object_id = t.object_id WHERE ind.is_primary_key = 0 AND ind.is_unique = 0 AND ind.is_unique_constraint = 0 AND t.is_ms_shipped = 0 ORDER BY t.name, ind.name, ind.index_id, ic.index_column_id; 

आप एक तालिका के सभी अनुक्रमणिका देखने के लिए sp_helpindex का उपयोग कर सकते हैं।

 EXEC sys.sp_helpindex @objname = N'User' -- nvarchar(77) 

और सभी अनुक्रमणिका के लिए, आप प्रत्येक तालिका के लिए सभी अनुक्रमणिका प्राप्त करने के लिए sys.objects को पार कर सकते हैं।

उपरोक्त में से कोई भी मेरे लिए काम नहीं किया, लेकिन यह ऐसा करता है:

 -- KDF9's concise index list for SQL Server 2005+ (see below for 2000) -- includes schemas and primary keys, in easy to read format -- with unique, clustered, and all ascending/descendings in a single column -- Needs simple manual add or delete to change maximum number of key columns -- but is easy to understand and modify, with no UDFs or complex logic -- SELECT schema_name(schema_id) as SchemaName, OBJECT_NAME(si.object_id) as TableName, si.name as IndexName, (CASE is_primary_key WHEN 1 THEN 'PK' ELSE '' END) as PK, (CASE is_unique WHEN 1 THEN '1' ELSE '0' END)+' '+ (CASE si.type WHEN 1 THEN 'C' WHEN 3 THEN 'X' ELSE 'B' END)+' '+ -- B=basic, C=Clustered, X=XML (CASE INDEXKEY_PROPERTY(si.object_id,index_id,1,'IsDescending') WHEN 0 THEN 'A' WHEN 1 THEN 'D' ELSE '' END)+ (CASE INDEXKEY_PROPERTY(si.object_id,index_id,2,'IsDescending') WHEN 0 THEN 'A' WHEN 1 THEN 'D' ELSE '' END)+ (CASE INDEXKEY_PROPERTY(si.object_id,index_id,3,'IsDescending') WHEN 0 THEN 'A' WHEN 1 THEN 'D' ELSE '' END)+ (CASE INDEXKEY_PROPERTY(si.object_id,index_id,4,'IsDescending') WHEN 0 THEN 'A' WHEN 1 THEN 'D' ELSE '' END)+ (CASE INDEXKEY_PROPERTY(si.object_id,index_id,5,'IsDescending') WHEN 0 THEN 'A' WHEN 1 THEN 'D' ELSE '' END)+ (CASE INDEXKEY_PROPERTY(si.object_id,index_id,6,'IsDescending') WHEN 0 THEN 'A' WHEN 1 THEN 'D' ELSE '' END)+ '' as 'Type', INDEX_COL(schema_name(schema_id)+'.'+OBJECT_NAME(si.object_id),index_id,1) as Key1, INDEX_COL(schema_name(schema_id)+'.'+OBJECT_NAME(si.object_id),index_id,2) as Key2, INDEX_COL(schema_name(schema_id)+'.'+OBJECT_NAME(si.object_id),index_id,3) as Key3, INDEX_COL(schema_name(schema_id)+'.'+OBJECT_NAME(si.object_id),index_id,4) as Key4, INDEX_COL(schema_name(schema_id)+'.'+OBJECT_NAME(si.object_id),index_id,5) as Key5, INDEX_COL(schema_name(schema_id)+'.'+OBJECT_NAME(si.object_id),index_id,6) as Key6 FROM sys.indexes as si LEFT JOIN sys.objects as so on so.object_id=si.object_id WHERE index_id>0 -- omit the default heap and OBJECTPROPERTY(si.object_id,'IsMsShipped')=0 -- omit system tables and not (schema_name(schema_id)='dbo' and OBJECT_NAME(si.object_id)='sysdiagrams') -- omit sysdiagrams ORDER BY SchemaName,TableName,IndexName ------------------------------------------------------------------- -- or to generate creation scripts put a simple wrapper around that SELECT SchemaName, TableName, IndexName, (CASE pk WHEN 'PK' THEN 'ALTER '+ 'TABLE '+SchemaName+'.'+TableName+' ADD CONSTRAINT '+IndexName+' PRIMARY KEY'+ (CASE substring(Type,3,1) WHEN 'C' THEN ' CLUSTERED' ELSE '' END) ELSE 'CREATE '+ (CASE substring(Type,1,1) WHEN '1' THEN 'UNIQUE ' ELSE '' END)+ (CASE substring(Type,3,1) WHEN 'C' THEN 'CLUSTERED ' ELSE '' END)+ 'INDEX '+IndexName+' ON '+SchemaName+'.'+TableName END)+ ' ('+ (CASE WHEN Key1 is null THEN '' ELSE Key1+(CASE substring(Type,4+1,1) WHEN 'D' THEN ' DESC' ELSE '' END) END)+ (CASE WHEN Key2 is null THEN '' ELSE ', '+Key2+(CASE substring(Type,4+2,1) WHEN 'D' THEN ' DESC' ELSE '' END) END)+ (CASE WHEN Key3 is null THEN '' ELSE ', '+Key3+(CASE substring(Type,4+3,1) WHEN 'D' THEN ' DESC' ELSE '' END) END)+ (CASE WHEN Key4 is null THEN '' ELSE ', '+Key4+(CASE substring(Type,4+4,1) WHEN 'D' THEN ' DESC' ELSE '' END) END)+ (CASE WHEN Key5 is null THEN '' ELSE ', '+Key5+(CASE substring(Type,4+5,1) WHEN 'D' THEN ' DESC' ELSE '' END) END)+ (CASE WHEN Key6 is null THEN '' ELSE ', '+Key6+(CASE substring(Type,4+6,1) WHEN 'D' THEN ' DESC' ELSE '' END) END)+ ')' as CreateIndex FROM ( ... ...listing SQL same as above minus the ORDER BY... ... ) as indexes ORDER BY SchemaName,TableName,IndexName ---------------------------------------------------------- -- For SQL Server 2000 the following should work -- change table names to sysindexes and sysobjects (no dots) -- change object_id => id, index_id => indid, -- change is_primary_key => (select count(constid) from sysconstraints as sc where sc.id=si.id and sc.status&15=1) -- change is_unique => INDEXPROPERTY(si.id,si.name,'IsUnique') -- change si.type => INDEXPROPERTY(si.id,si.name,'IsClustered') -- remove all references to schemas including schema name qualifiers, and the XML type -- add select where indid<255 and si.status&64=0 (to omit the text/image index and autostats) 

यदि आपके नामों में रिक्त स्थान शामिल हैं, तो निर्माण स्क्रिप्ट्स में उनके चारों ओर वर्ग कोष्ठक जोड़ें।

जब अंतिम कुंजी कॉलम सभी नल है, तो आप जानते हैं कि कोई भी गायब नहीं है।

प्राथमिक कुंजी आदि को छानने के लिए मूल अनुरोध के रूप में तुच्छ है।

नोट: इस समाधान के साथ सावधानी बरतें क्योंकि यह अनुक्रमित और शामिल कॉलम में अंतर नहीं करता है।

–छोटा एवं सुन्दर:

 SELECT OBJECT_SCHEMA_NAME(T.[object_id],DB_ID()) AS [Schema], T.[name] AS [table_name], I.[name] AS [index_name], AC.[name] AS [column_name], I.[type_desc], I.[is_unique], I.[data_space_id], I.[ignore_dup_key], I.[is_primary_key], I.[is_unique_constraint], I.[fill_factor], I.[is_padded], I.[is_disabled], I.[is_hypothetical], I.[allow_row_locks], I.[allow_page_locks], IC.[is_descending_key], IC.[is_included_column] FROM sys.[tables] AS T INNER JOIN sys.[indexes] I ON T.[object_id] = I.[object_id] INNER JOIN sys.[index_columns] IC ON I.[object_id] = IC.[object_id] INNER JOIN sys.[all_columns] AC ON T.[object_id] = AC.[object_id] AND IC.[column_id] = AC.[column_id] WHERE T.[is_ms_shipped] = 0 AND I.[type_desc] <> 'HEAP' ORDER BY T.[name], I.[index_id], IC.[key_ordinal] 

निम्नलिखित क्या देता है जैसे sp_helpindex tablename

 select T.name as TableName, I.name as IndexName, AC.Name as ColumnName, I.type_desc as IndexType from sys.tables as T inner join sys.indexes as I on T.[object_id] = I.[object_id] inner join sys.index_columns as IC on IC.[object_id] = I.[object_id] and IC.[index_id] = I.[index_id] inner join sys.all_columns as AC on IC.[object_id] = AC.[object_id] and IC.[column_id] = AC.[column_id] order by T.name, I.name 

हे लोग, मैं नहीं गया था लेकिन मूल लेखक द्वारा पोस्ट की गयी क्वेरी में मुझे क्या चाहिए था।

मैंने अपनी आवश्यकता के लिए इसे (बिना शर्त / फिल्टर) का उपयोग किया था लेकिन इसे गलत परिणाम दिया

मुख्य समस्या यह रही थी कि इंडेक्स_आईडी पर हालत में शामिल होने के बिना पार उत्पाद प्राप्त हो रहा है

 SELECT S.NAME SCHEMA_NAME,T.NAME TABLE_NAME,I.NAME INDEX_NAME,C.NAME COLUMN_NAME FROM SYS.TABLES T INNER JOIN SYS.SCHEMAS S ON T.SCHEMA_ID = S.SCHEMA_ID INNER JOIN SYS.INDEXES I ON I.OBJECT_ID = T.OBJECT_ID INNER JOIN SYS.INDEX_COLUMNS IC ON IC.OBJECT_ID = T.OBJECT_ID INNER JOIN SYS.COLUMNS C ON C.OBJECT_ID = T.OBJECT_ID **AND IC.INDEX_ID = I.INDEX_ID** AND IC.COLUMN_ID = C.COLUMN_ID WHERE 1=1 ORDER BY I.NAME,I.INDEX_ID,IC.KEY_ORDINAL 

यह काम करेगा:

 DECLARE @IndexInfo TABLE (index_name varchar(250) ,index_description varchar(250) ,index_keys varchar(250) ) INSERT INTO @IndexInfo exec sp_msforeachtable 'sp_helpindex ''?''' select * from @IndexInfo 

यह तालिका का नाम नहीं बदलता है और यदि आप एक सूचकांक के बिना सभी तालिकाओं के लिए चेतावनियां प्राप्त करेंगे, तो यह एक समस्या है, तो आप इन तालिकाओं में तालिकाओं पर लूप बना सकते हैं:

 DECLARE @IndexInfoTemp TABLE (index_name varchar(250) ,index_description varchar(250) ,index_keys varchar(250) ) DECLARE @IndexInfo TABLE (table_name sysname ,index_name varchar(250) ,index_description varchar(250) ,index_keys varchar(250) ) DECLARE @Tables Table (RowID int not null identity(1,1) ,TableName sysname ) DECLARE @MaxRow int DECLARE @CurrentRow int DECLARE @CurrentTable sysname INSERT INTO @Tables SELECT DISTINCT t.name FROM sys.indexes i INNER JOIN sys.tables t ON i.object_id = t.object_id WHERE i.Name IS NOT NULL SELECT @MaxRow=@@ROWCOUNT,@CurrentRow=1 WHILE @CurrentRow<=@MaxRow BEGIN SELECT @CurrentTable=TableName FROM @Tables WHERE RowID=@CurrentRow INSERT INTO @IndexInfoTemp exec sp_helpindex @CurrentTable INSERT INTO @IndexInfo (table_name , index_name , index_description , index_keys) SELECT @CurrentTable , index_name , index_description , index_keys FROM @IndexInfoTemp DELETE FROM @IndexInfoTemp SET @CurrentRow=@CurrentRow+1 END --WHILE SELECT * from @IndexInfo 

संपादित करें
यदि आप चाहें, तो आप डेटा को फ़िल्टर कर सकते हैं, यहां कुछ उदाहरण हैं (या तो विधि के लिए ये काम):

 SELECT * FROM @IndexInfo WHERE index_description NOT LIKE '%primary key%' SELECT * FROM @IndexInfo WHERE index_description NOT LIKE '%nonclustered%' AND index_description LIKE '%clustered%' SELECT * FROM @IndexInfo WHERE index_description LIKE '%unique%' 
 with connect(schema_name,table_name,index_name,index_column_id,column_name) as ( select s.name schema_name, t.name table_name, i.name index_name, index_column_id, cast(c.name as varchar(max)) column_name from sys.tables t inner join sys.schemas s on t.schema_id = s.schema_id inner join sys.indexes i on i.object_id = t.object_id inner join sys.index_columns ic on ic.object_id = t.object_id and ic.index_id=i.index_id inner join sys.columns c on c.object_id = t.object_id and ic.column_id = c.column_id where index_column_id=1 union all select s.name schema_name, t.name table_name, i.name index_name, ic.index_column_id, cast(connect.column_name + ',' + c.name as varchar(max)) column_name from sys.tables t inner join sys.schemas s on t.schema_id = s.schema_id inner join sys.indexes i on i.object_id = t.object_id inner join sys.index_columns ic on ic.object_id = t.object_id and ic.index_id=i.index_id inner join sys.columns c on c.object_id = t.object_id and ic.column_id = c.column_id join connect on connect.index_column_id+1 = ic.index_column_id and connect.schema_name = s.name and connect.table_name = t.name and connect.index_name = i.name) select connect.schema_name,connect.table_name,connect.index_name,connect.column_name from connect join (select schema_name,table_name,index_name,MAX(index_column_id) index_column_id from connect group by schema_name,table_name,index_name) mx on connect.schema_name = mx.schema_name and connect.table_name = mx.table_name and connect.index_name = mx.index_name and connect.index_column_id = mx.index_column_id order by 1,2,3 

मुझे विशेष अनुक्रमणिका, उनके सूचकांक कॉलम और उनके शामिल किए गए कॉलमों को भी प्राप्त करने की आवश्यकता है। यहाँ मैंने उपयोग किया है क्वेरी है:

 SELECT INX.[name] AS [Index Name] ,TBL.[name] AS [Table Name] ,DS1.[IndexColumnsNames] ,DS2.[IncludedColumnsNames] FROM [sys].[indexes] INX INNER JOIN [sys].[tables] TBL ON INX.[object_id] = TBL.[object_id] CROSS APPLY ( SELECT STUFF ( ( SELECT ' [' + CLS.[name] + ']' FROM [sys].[index_columns] INXCLS INNER JOIN [sys].[columns] CLS ON INXCLS.[object_id] = CLS.[object_id] AND INXCLS.[column_id] = CLS.[column_id] WHERE INX.[object_id] = INXCLS.[object_id] AND INX.[index_id] = INXCLS.[index_id] AND INXCLS.[is_included_column] = 0 FOR XML PATH('') ) ,1 ,1 ,'' ) ) DS1 ([IndexColumnsNames]) CROSS APPLY ( SELECT STUFF ( ( SELECT ' [' + CLS.[name] + ']' FROM [sys].[index_columns] INXCLS INNER JOIN [sys].[columns] CLS ON INXCLS.[object_id] = CLS.[object_id] AND INXCLS.[column_id] = CLS.[column_id] WHERE INX.[object_id] = INXCLS.[object_id] AND INX.[index_id] = INXCLS.[index_id] AND INXCLS.[is_included_column] = 1 FOR XML PATH('') ) ,1 ,1 ,'' ) ) DS2 ([IncludedColumnsNames]) 

यह इंडेक्स में समर्थन का एक तरीका है। आप विखंडन का आकलन करने के लिए SHOWCONTIG का उपयोग कर सकते हैं। यह आंकड़ों के साथ-साथ डेटाबेस या तालिका के सभी सूचकांकों को सूचीबद्ध करेगा। मैं सावधानी बरतता हूं कि एक बड़े डेटाबेस पर, यह लंबे समय से चलने वाला हो सकता है मेरे लिए, इस दृष्टिकोण के लाभों में से एक यह है कि आपको इसका उपयोग करने के लिए एक व्यवस्थापक होना जरूरी नहीं है।

– डेटाबेस में सभी अनुक्रमणिकाओं पर विखंडन जानकारी दिखाएं

 SET NOCOUNT ON USE pubs DBCC SHOWCONTIG WITH ALL_INDEXES GO 

… जब किया जाए तो एनओसीएनेट वापस बंद करें

– तालिका पर सभी अनुक्रमणिकाओं पर विखंडन जानकारी दिखाएं

 SET NOCOUNT ON USE pubs DBCC SHOWCONTIG (authors) WITH ALL_INDEXES GO 

– एक विशिष्ट सूचकांक पर विखंडन जानकारी दिखाएं

 SET NOCOUNT ON USE pubs DBCC SHOWCONTIG (authors,aunmind) GO 

एसक्यूएल सर्वर 2014/2016 पर साथ ही साथ किसी भी माइक्रोसॉफ्ट Azure SQL डाटाबेस पर काम करता है

एक व्यापक परिणाम सेट का निर्माण करता है जो आसानी से नोटपैड / एक्सेल के लिए स्लिसिंग और डिसिंग के लिए निर्यात करता है और इसमें शामिल हैं

  1. तालिका नाम
  2. सूचकांक नाम
  3. सूचकांक विवरण
  4. अनुक्रमित कॉलम – क्रम में
  5. शामिल कॉलम – क्रम में
  SELECT '[' + s.NAME + '].[' + o.NAME + ']' AS 'table_name' ,+ i.NAME AS 'index_name' ,LOWER(i.type_desc) + CASE WHEN i.is_unique = 1 THEN ', unique' ELSE '' END + CASE WHEN i.is_primary_key = 1 THEN ', primary key' ELSE '' END AS 'index_description' ,STUFF(( SELECT ', [' + sc.NAME + ']' AS "text()" FROM syscolumns AS sc INNER JOIN sys.index_columns AS ic ON ic.object_id = sc.id AND ic.column_id = sc.colid WHERE sc.id = so.object_id AND ic.index_id = i1.indid AND ic.is_included_column = 0 ORDER BY key_ordinal FOR XML PATH('') ), 1, 2, '') AS 'indexed_columns' ,STUFF(( SELECT ', [' + sc.NAME + ']' AS "text()" FROM syscolumns AS sc INNER JOIN sys.index_columns AS ic ON ic.object_id = sc.id AND ic.column_id = sc.colid WHERE sc.id = so.object_id AND ic.index_id = i1.indid AND ic.is_included_column = 1 FOR XML PATH('') ), 1, 2, '') AS 'included_columns' FROM sysindexes AS i1 INNER JOIN sys.indexes AS i ON i.object_id = i1.id AND i.index_id = i1.indid INNER JOIN sysobjects AS o ON o.id = i1.id INNER JOIN sys.objects AS so ON so.object_id = o.id AND is_ms_shipped = 0 INNER JOIN sys.schemas AS s ON s.schema_id = so.schema_id WHERE so.type = 'U' AND i1.indid < 255 AND i1.STATUS & 64 = 0 --index with duplicates AND i1.STATUS & 8388608 = 0 --auto created index AND i1.STATUS & 16777216 = 0 --stats no recompute AND i.type_desc <> 'heap' AND so.NAME <> 'sysdiagrams' ORDER BY table_name ,index_name; 

मैं इस एक के साथ आया था, जो मुझे सटीक सिंहावलोकन दे रहा है जो मुझे चाहिए। क्या मदद करता है यह है कि आपको प्रति सूचकांक एक पंक्ति मिलती है जिसमें सूचकांक स्तंभ एकत्रित होते हैं।

 select o.name as ObjectName, i.name as IndexName, i.is_primary_key as [PrimaryKey], SUBSTRING(i.[type_desc],0,6) as IndexType, i.is_unique as [Unique], Columns.[Normal] as IndexColumns, Columns.[Included] as IncludedColumns from sys.indexes i join sys.objects o on i.object_id = o.object_id cross apply ( select substring ( ( select ', ' + co.[name] from sys.index_columns ic join sys.columns co on co.object_id = i.object_id and co.column_id = ic.column_id where ic.object_id = i.object_id and ic.index_id = i.index_id and ic.is_included_column = 0 order by ic.key_ordinal for xml path('') ) , 3 , 10000 ) as [Normal] , substring ( ( select ', ' + co.[name] from sys.index_columns ic join sys.columns co on co.object_id = i.object_id and co.column_id = ic.column_id where ic.object_id = i.object_id and ic.index_id = i.index_id and ic.is_included_column = 1 order by ic.key_ordinal for xml path('') ) , 3 , 10000 ) as [Included] ) Columns where o.[type] = 'U' --USER_TABLE order by o.[name], i.[name], i.is_primary_key desc 

क्या मैं इस संतृप्त प्रश्न का एक और जवाब दे सकता हूं?

यह @ मार्स_स के उत्तर का एक उदार पुनर्वर्ती है, @ टिम फोर्ड से कुछ सामान के साथ मिश्रित, एक क्लीनर और सरल परिणाम सेट और अंतिम प्रदर्शन और थोड़ा सा मेरे वर्तमान की आवश्यकता के लिए आदेश देने के लक्ष्य के साथ।

 SELECT OBJECT_SCHEMA_NAME(t.[object_id],DB_ID()) AS [Schema], t.[name] AS [TableName], ind.[name] AS [IndexName], col.[name] AS [ColumnName], ic.column_id AS [ColumnId], ind.[type_desc] AS [IndexTypeDesc], col.is_identity AS [IsIdentity], ind.[is_unique] AS [IsUnique], ind.[is_primary_key] AS [IsPrimaryKey], ic.[is_descending_key] AS [IsDescendingKey], ic.[is_included_column] AS [IsIncludedColumn] FROM sys.indexes ind INNER JOIN sys.index_columns ic ON ind.object_id = ic.object_id AND ind.index_id = ic.index_id INNER JOIN sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id INNER JOIN sys.tables t ON ind.object_id = t.object_id WHERE t.is_ms_shipped = 0 --ind.is_primary_key = 1 -- include or not pks, etc --AND ind.is_unique = 0 --AND ind.is_unique_constraint = 0 ORDER BY [Schema], TableName, IndexName, [ColumnId], ColumnName 

चूंकि आपकी प्रोफ़ाइल बताती है कि आप .NET का प्रयोग कर रहे हैं, आप सर्वर प्रबंधित ऑब्जेक्ट्स (एसएमओ) प्रोग्रामेटिक रूप से उपयोग कर सकते हैं … अन्यथा ऊपर दिए गए कोई भी उत्तर शानदार हैं

उपरोक्त समाधान सुरुचिपूर्ण है, लेकिन एमएस के अनुसार, INDEXKEY_PROPERTY नापसंद किया जा रहा है देखें: http://msdn.microsoft.com/en-us/library/ms186773.aspx

टिम फोर्ड कोड पर आधारित, यह सही उत्तर है:

  select tab.[name] as [table_name], idx.[name] as [index_name], allc.[name] as [column_name], idx.[type_desc], idx.[is_unique], idx.[data_space_id], idx.[ignore_dup_key], idx.[is_primary_key], idx.[is_unique_constraint], idx.[fill_factor], idx.[is_padded], idx.[is_disabled], idx.[is_hypothetical], idx.[allow_row_locks], idx.[allow_page_locks], idxc.[is_descending_key], idxc.[is_included_column], idxc.[index_column_id] from sys.[tables] as tab inner join sys.[indexes] idx on tab.[object_id] = idx.[object_id] inner join sys.[index_columns] idxc on idx.[object_id] = idxc.[object_id] and idx.[index_id] = idxc.[index_id] inner join sys.[all_columns] allc on tab.[object_id] = allc.[object_id] and idxc.[column_id] = allc.[column_id] where tab.[name] Like '%table_name%' and idx.[name] Like '%index_name%' order by tab.[name], idx.[index_id], idxc.[index_column_id] 

ओरेकल में

 select CONNECYBY.SCHEMA_NAME,CONNECYBY.TABLE_NAME,CONNECYBY.INDEX_NAME,CONNECYBY.COLUMN_NAME from ( select TABLE_OWNER SCHEMA_NAME,TABLE_NAME,INDEX_NAME,COLUMN_POSITION,trim(',' from sys_connect_by_path(COLUMN_NAME,',')) COLUMN_NAME from DBA_IND_COLUMNS start with COLUMN_POSITION = 1 connect by TABLE_OWNER = prior TABLE_OWNER and TABLE_NAME = prior TABLE_NAME and INDEX_NAME = prior INDEX_NAME and COLUMN_POSITION = prior COLUMN_POSITION + 1) CONNECYBY join ( select TABLE_OWNER SCHEMA_NAME,TABLE_NAME,INDEX_NAME,max(COLUMN_POSITION) COLUMN_POSITION from DBA_IND_COLUMNS group by TABLE_OWNER,TABLE_NAME,INDEX_NAME) MAX_CONNECYBY on ( CONNECYBY.SCHEMA_NAME = MAX_CONNECYBY.SCHEMA_NAME and CONNECYBY.TABLE_NAME = MAX_CONNECYBY.TABLE_NAME and CONNECYBY.INDEX_NAME = MAX_CONNECYBY.INDEX_NAME and CONNECYBY.COLUMN_POSITION = MAX_CONNECYBY.COLUMN_POSITION) order by CONNECYBY.SCHEMA_NAME,CONNECYBY.TABLE_NAME,CONNECYBY.INDEX_NAME 

साथ एसक्यूएल सर्वर में

 CONNECTBY(SCHEMA_NAME,TABLE_NAME,INDEX_NAME,INDEX_COLUMN_ID,COLUMN_NAME) as ( select SCHEMAS.NAME SCHEMA_NAME , TABLES.NAME TABLE_NAME , INDEXES.NAME INDEX_NAME , INDEX_COLUMNS.INDEX_COLUMN_ID INDEX_COLUMN_ID , cast(COLUMNS.NAME AS VARCHAR(MAX)) COLUMN_NAME from SYS.INDEXES join SYS.TABLES on (INDEXES.OBJECT_ID = TABLES.OBJECT_ID) join SYS.SCHEMAS on (TABLES.SCHEMA_ID = SCHEMAS.SCHEMA_ID) join SYS.INDEX_COLUMNS on ( INDEXES.OBJECT_ID = INDEX_COLUMNS.OBJECT_ID and INDEX_COLUMNS.INDEX_ID = INDEXES.INDEX_ID) join SYS.COLUMNS on ( INDEXES.OBJECT_ID = COLUMNS.OBJECT_ID and INDEX_COLUMNS.COLUMN_ID = COLUMNS.COLUMN_ID) where INDEX_COLUMNS.INDEX_COLUMN_ID = 1 union all select SCHEMAS.NAME SCHEMA_NAME , TABLES.NAME TABLE_NAME , INDEXES.NAME INDEX_NAME , INDEX_COLUMNS.INDEX_COLUMN_ID INDEX_COLUMN_ID , cast(PRIOR.COLUMN_NAME + ',' + COLUMNS.NAME AS VARCHAR(MAX)) COLUMN_NAME from SYS.INDEXES join SYS.TABLES on (INDEXES.OBJECT_ID = TABLES.OBJECT_ID) join SYS.SCHEMAS on (TABLES.SCHEMA_ID = SCHEMAS.SCHEMA_ID) join SYS.INDEX_COLUMNS on ( INDEXES.OBJECT_ID = INDEX_COLUMNS.OBJECT_ID and INDEX_COLUMNS.INDEX_ID = INDEXES.INDEX_ID) join SYS.COLUMNS on ( INDEXES.OBJECT_ID = COLUMNS.OBJECT_ID and INDEX_COLUMNS.COLUMN_ID = COLUMNS.COLUMN_ID) join CONNECTBY as PRIOR on (SCHEMAS.NAME = PRIOR.SCHEMA_NAME and TABLES.NAME = PRIOR.TABLE_NAME and INDEXES.NAME = PRIOR.INDEX_NAME and INDEX_COLUMNS.INDEX_COLUMN_ID = PRIOR.INDEX_COLUMN_ID + 1)) select CONNECTBY.SCHEMA_NAME,CONNECTBY.TABLE_NAME,CONNECTBY.INDEX_NAME,CONNECTBY.COLUMN_NAME from CONNECTBY join ( select SCHEMA_NAME , TABLE_NAME , INDEX_NAME , MAX(INDEX_COLUMN_ID) INDEX_COLUMN_ID from CONNECTBY group by SCHEMA_NAME,TABLE_NAME,INDEX_NAME) MAX_CONNECTBY on (CONNECTBY.SCHEMA_NAME = MAX_CONNECTBY.SCHEMA_NAME and CONNECTBY.TABLE_NAME = MAX_CONNECTBY.TABLE_NAME and CONNECTBY.INDEX_NAME = MAX_CONNECTBY.INDEX_NAME and CONNECTBY.INDEX_COLUMN_ID = MAX_CONNECTBY.INDEX_COLUMN_ID) order by CONNECTBY.SCHEMA_NAME,CONNECTBY.TABLE_NAME,CONNECTBY.INDEX_NAME 

बस ध्यान दें कि यदि आप उपरोक्त किसी भी कामकाजी पूछताछ को अपनी अनुक्रमित करने के लिए उपयोग करने जा रहे हैं, तो आपको एसक्यूएल 2008+ में गैर-क्लस्टर वाले अनुक्रमित की फ़िल्टर परिभाषा के लिए अपने प्रश्नों में sys.indexes तालिका से filter_definition कॉलम को शामिल करना होगा।

AM

ऐसा करने का सबसे अच्छा तरीका यह है:

 SELECT sys.tables.object_id, sys.tables.name as table_name, sys.columns.name as column_name, sys.indexes.name as index_name, sys.indexes.is_unique, sys.indexes.is_primary_key FROM sys.tables, sys.indexes, sys.index_columns, sys.columns WHERE (sys.tables.object_id = sys.indexes.object_id AND sys.tables.object_id = sys.index_columns.object_id AND sys.tables.object_id = sys.columns.object_id AND sys.indexes.index_id = sys.index_columns.index_id AND sys.index_columns.column_id = sys.columns.column_id) AND sys.tables.name = 'your_table_name' 

मैं निहित जुड़ने का उपयोग करना पसंद करता हूं क्योंकि यह मेरे लिए समझने में आसान है आप ऑब्जेक्ट_आईड संदर्भ को निकाल सकते हैं, क्योंकि आपको इसकी आवश्यकता नहीं है।

चीयर्स।

सबसे पहले, कृपया ध्यान दें कि उपर्युक्त सभी प्रश्न सूचकांकों के शामिल कॉलम को भूल सकते हैं या गलत तरीके से शामिल कर सकते हैं। इसके अलावा कुछ में लापता कॉलम की उचित ऑर्डरिंग और / या एएससी / डीईएससी विकल्प है।

उपरोक्त क्वेरी को जेनो द्वारा संशोधित किया गया एक अलग के रूप में, मेरे द्वारा उपयोग किए जाने वाले कई डेटाबेस में, मैं अपना स्वयं का CLR CONCATENATE कुल फ़ंक्शन स्थापित करता हूं, इसलिए नीचे दिए गए कोड इस तरह मौजूद होने पर कुछ निर्भर करता है। उपरोक्त एसक्यूएल बयान अधिक निपुणता को कम करता है:

 SELECT s.[name] AS [schema_name] , t.[name] AS [table_name] , i.[name] AS [index_name] , dbo.Concatenate(CASE WHEN ic.[key_ordinal] > 0 AND ic.[is_descending_key] = 1 THEN c.[name] + ' DESC' WHEN key_ordinal > 0 THEN c.[name] ELSE NULL END,',',1) AS [columns] , dbo.Concatenate(CASE WHEN ic.[is_included_column] = 1 THEN c.[name] ELSE NULL END,',',1) AS [includes] FROM sys.tables t INNER JOIN sys.schemas s ON t.[schema_id] = s.[schema_id] INNER JOIN sys.indexes i ON i.[object_id] = t.[object_id] INNER JOIN sys.index_columns ic ON ic.[object_id] = t.[object_id] AND ic.index_id = i.index_id INNER JOIN sys.columns c ON c.[object_id] = t.[object_id] AND ic.column_id = c.column_id GROUP BY s.[name] , t.[name] , i.[name] ORDER BY s.[name] , t.[name] , i.[name] 

वहाँ बहुत सारी समाई समुच्चय हैं यदि आपका वातावरण CLR- आधारित फ़ंक्शंस को इसमें शामिल करने की अनुमति देता है।

सूचकांक के लिए अद्वितीय कॉलम के लिए:

 select s.name, t.name, i.name, i.index_id,c.name,c.column_id from sys.schemas s inner join sys.tables t on t.schema_id = s.schema_id inner join sys.indexes i on i.object_id = t.object_id inner join sys.index_columns ic on ic.object_id = t.object_id and ic.index_id=i.index_id inner join sys.columns c on c.object_id = t.object_id and ic.column_id = c.column_id where i.object_id = object_id('previous.account_1') order by index_id,column_id 

नीचे दिए गए प्रश्न में सभी स्तंभों के साथ उपयोगकर्ता-परिभाषित इंडेक्स, (अनन्य बाधाओं और प्राथमिक कुंजी के लिए कोई अनुक्रमित नहीं) के लिए सभी प्रासंगिक जानकारी शामिल हैं:

 SELECT I.name as IndexName, CASE WHEN I.is_unique = 1 THEN 'Yes' ELSE 'No' END as 'Unique', I.type_desc COLLATE DATABASE_DEFAULT as Index_Type, '[' + SCHEMA_NAME(T.schema_id) + ']' as 'Schema', '[' + T.name + ']' as TableName, STUFF((SELECT ', [' + C.name + CASE WHEN IC.is_descending_key = 0 THEN '] ASC' ELSE '] DESC' END FROM sys.index_columns IC INNER JOIN sys.columns C ON IC.object_id = C.object_id AND IC.column_id = C.column_id WHERE IC.is_included_column = 0 AND IC.object_id = I.object_id AND IC.index_id = I.Index_id FOR XML PATH('')), 1, 2, '') as Key_Columns, Included_Columns, I.filter_definition, CASE WHEN I.is_padded = 1 THEN 'ON' ELSE 'OFF' END as PAD_INDEX, CASE WHEN ST.no_recompute = 0 THEN 'OFF' ELSE 'ON' END as [Statistics_Norecompute], CONVERT(VARCHAR(5), CASE WHEN I.fill_factor = 0 THEN 100 ELSE I.fill_factor END) as [Fillfactor], CASE WHEN I.ignore_dup_key = 1 THEN 'ON' ELSE 'OFF' END as [Ignore_Dup_Key], CASE WHEN I.allow_row_locks = 1 THEN 'ON' ELSE 'OFF' END as [Allow_Row_Locks], CASE WHEN I.allow_page_locks = 1 THEN 'ON' ELSE 'OFF' END [Allow_Page_Locks] FROM sys.indexes I INNER JOIN sys.tables T ON T.object_id = I.object_id INNER JOIN sys.stats ST ON ST.object_id = I.object_id AND ST.stats_id = I.index_id INNER JOIN sys.data_spaces DS ON I.data_space_id = DS.data_space_id INNER JOIN sys.filegroups FG ON I.data_space_id = FG.data_space_id LEFT OUTER JOIN (SELECT * FROM (SELECT IC2.object_id, IC2.index_id, STUFF((SELECT ', ' + C.name FROM sys.index_columns IC1 INNER 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, '') as Included_Columns FROM sys.index_columns IC2 GROUP BY IC2.object_id, IC2.index_id) tmp1 WHERE Included_Columns 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; 

एक अतिरिक्त बोनस के रूप में, निम्न क्वेरी को सूचकांक बनाने और इंडेक्स स्क्रिप्ट ड्रॉप करने के लिए फ़ॉर्मेट किया गया है:

 SELECT I.name as IndexName, -- Uncommnent line below to include checking for index exists as part of the script --'IF NOT EXISTS (SELECT name FROM sysindexes WHERE name = '''+ I.name +''') ' + '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 + '] (' + STUFF( (SELECT ', [' + C.name + CASE WHEN IC.is_descending_key = 0 THEN '] ASC' ELSE '] DESC' END FROM sys.index_columns IC INNER JOIN sys.columns C ON IC.object_id = C.object_id AND IC.column_id = C.column_id WHERE IC.is_included_column = 0 AND IC.object_id = I.object_id AND IC.index_id = I.Index_id FOR XML PATH('')), 1, 2, '') + ') ' + ISNULL(' INCLUDE (' + IncludedColumns + ') ', '') + ISNULL(' WHERE ' + I.filter_definition, '') + 'WITH (PAD_INDEX = ' + CASE WHEN I.is_padded = 1 THEN 'ON' ELSE 'OFF' END + ', STATISTICS_NORECOMPUTE = ' + CASE WHEN ST.no_recompute = 0 THEN 'OFF' ELSE 'ON' END + ', SORT_IN_TEMPDB = OFF' + ', FILLFACTOR = ' + CONVERT(VARCHAR(5), CASE WHEN I.fill_factor = 0 THEN 100 ELSE I.fill_factor END) + ', IGNORE_DUP_KEY = ' + CASE WHEN I.ignore_dup_key = 1 THEN 'ON' ELSE 'OFF' END + ', ONLINE = OFF' + ', ALLOW_ROW_LOCKS = ' + CASE WHEN I.allow_row_locks = 1 THEN 'ON' ELSE 'OFF' END + ', ALLOW_PAGE_LOCKS = ' + CASE WHEN I.allow_page_locks = 1 THEN 'ON' ELSE 'OFF' END + ') ON [' + DS.name + '];' + CHAR(13) + CHAR(10) + 'GO' as [CreateIndex], 'DROP INDEX ['+ I.name +'] ON ['+ SCHEMA_NAME(T.schema_id) +'].['+ T.name +'];' + CHAR(13) + CHAR(10) + 'GO' AS [DropIndex] FROM sys.indexes I INNER JOIN sys.tables T ON T.object_id = I.object_id INNER JOIN sys.stats ST ON ST.object_id = I.object_id AND ST.stats_id = I.index_id INNER JOIN sys.data_spaces DS ON I.data_space_id = DS.data_space_id INNER JOIN sys.filegroups FG ON I.data_space_id = FG.data_space_id LEFT OUTER JOIN (SELECT * FROM (SELECT IC2.object_id, IC2.index_id, STUFF((SELECT ', ' + C.name FROM sys.index_columns IC1 INNER 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, '') as IncludedColumns FROM sys.index_columns IC2 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 

Using SQL Server 2016, this gives a complete list of all indexes, with an included dump of each table so you can see how the tables relate. It also shows columns included in covering indexes:

 select t.name TableName, i.name IdxName, c.name ColName , ic.index_column_id ColPosition , i.type_desc Type , case when i.is_primary_key = 1 then 'Yes' else '' end [Primary?] , case when i.is_unique = 1 then 'Yes' else '' end [Unique?] , case when ic.is_included_column = 0 then '' else 'Yes - Included' end [CoveredColumn?] , 'indexes >>>>' [*indexes*], i.*, 'index_columns >>>>' [*index_columns*] , ic.*, 'tables >>>>' [*tables*] , t.*, 'columns >>>>' [*columns*], c.* from sys.index_columns ic join sys.tables t on t.object_id = ic.object_id join sys.columns c on c.object_id = t.object_id and c.column_id = ic.column_id join sys.indexes i on i.object_id = t.object_id and i.index_id = ic.index_id order by TableName, IdxName, ColPosition 
 sELECT TableName = t.name, IndexName = ind.name, --IndexId = ind.index_id, ColumnId = ic.index_column_id, ColumnName = col.name, key_ordinal, ind.type_desc --ind.*, --ic.*, --col.* FROM sys.indexes ind INNER JOIN sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id INNER JOIN sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id INNER JOIN sys.tables t ON ind.object_id = t.object_id WHERE ind.is_primary_key = 0 AND ind.is_unique = 0 AND ind.is_unique_constraint = 0 AND t.is_ms_shipped = 0 and t.name='CompanyReconciliation' --table name and key_ordinal>0 ORDER BY t.name, ind.name, ind.index_id, ic.index_column_id