Как мне перечислить индексы таблицы с соответствующим столбцом? - PullRequest
0 голосов
/ 01 ноября 2018

Скажем, у меня есть таблица A. Как мне найти индексы столбца A. Тогда каков синтаксис ссылки на этот индекс в запросе оператора SELECT?

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы можете найти информацию в системных таблицах 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 включен столбец. Более подробная информация о включенном столбце здесь

Как правило, оптимизатор SQL-сервера рассчитывает лучший план для вашего запроса и решает, будет ли индекс использоваться или не использоваться во время выполнения запроса.

Но есть опция, заставляющая оптимизатор SQL-сервера использовать определенный индекс, используя табличную подсказку INDEX.

Документация Microsoft о табличных подсказках здесь

И пример того, как Пинал Дэйв может использовать подсказку, это здесь

0 голосов
/ 01 ноября 2018

Оператор SELECT не относится к индексу (если вы явно не даете подсказку по оптимизации, что необычно). То есть индекс скрыт, только часть базы данных. Он используется оптимизатором, когда оптимизатор рассчитывает, что лучший план запроса будет использовать индекс.

Итак, это что-то вроде "установи и забудь".

Вы можете посмотреть, какие индексы доступны, используя системные таблицы / представления. Я бы порекомендовал начать с INFORMATION_SCHEMA.INDEXES.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...