如何列出表的索引及其对应的列?

时间:2018-11-01 15:29:41

标签: sql sql-server indexing

说我有表A。如何查找列A的索引。 那么在SELECT语句查询中引用该索引的语法是什么?

谢谢

2 个答案:

答案 0 :(得分:0)

SELECT语句不引用索引(除非您显式给出优化提示,这是不寻常的)。也就是说,索引是隐藏的,只是数据库的一部分。当优化器计算出最佳查询计划将使用索引时,它就由优化器使用。

所以,这就是“设置并忘记它”。

您可以使用系统表/视图来查找可用的索引。我建议从INFORMATION_SCHEMA.INDEXES开始。

答案 1 :(得分:0)

您可以在系统表sys.indexes,sys.index_columns和sys.columns中找到信息。 如果要在使用A列的表A上查找特定索引,可以在下面的查询中使用

select distinct i.name, STUFF((SELECT  ', ' + col.name

                                FROM    sys.indexes ind_col
                                    INNER JOIN sys.index_columns ind_col_detail
                                            ON ind_col.object_id = ind_col_detail.object_id
                                            AND ind_col.index_id = ind_col_detail.index_id
                                            INNER JOIN sys.columns col
                                            ON i.object_id = col.object_id
                                            AND ind_col_detail.column_id = col.column_id
                                WHERE   i.object_id = ind_col.object_id
                                            AND i.index_id = ind_col.index_id
                                            AND ind_col_detail.is_included_column = 0
                                ORDER BY ind_col_detail.key_ordinal
                                FOR XML PATH('')), 1, 2, '') AS key_column_list ,
                                STUFF((SELECT  ', ' + col.name

                                FROM    sys.indexes ind_col
                                    INNER JOIN sys.index_columns ind_col_detail
                                            ON ind_col.object_id = ind_col_detail.object_id
                                            AND ind_col.index_id = ind_col_detail.index_id
                                            INNER JOIN sys.columns col
                                            ON i.object_id = col.object_id
                                            AND ind_col_detail.column_id = col.column_id
                                WHERE   i.object_id = ind_col.object_id
                                            AND i.index_id = ind_col.index_id
                                            AND ind_col_detail.is_included_column = 1
                                ORDER BY ind_col_detail.key_ordinal
                                FOR XML PATH('')), 1, 2, '') AS included_column_list
                                from sys.indexes i
inner join sys.index_columns ic
on i.index_id = ic.index_id
and i.object_id = ic.object_id
and OBJECT_NAME(i.object_id) = 'Table A'
inner join sys.columns c
on c.column_id = ic.column_id
and c.object_id = i.object_id 
and c.name = 'Column A'

即使列A包含在列中,查询也会返回索引。有关包含的列的更多详细信息,是here

通常,SQL Server优化器会为您的查询计算最佳计划,并确定执行查询时是否使用索引。

但是有一个选项可以强制SQL Server优化器使用表提示INDEX使用特定索引。

有关表提示的Microsoft文档为here

Pinal Dave如何使用提示的示例是here