Проверить индекс по столбцу - PullRequest
1 голос
/ 14 октября 2019

В любом случае мы можем проверить, имеет ли определенный столбец в таблице индекс или нет? Я использую SQL Server Management Studio 2016. Я осуществлял поиск в Интернете, но все решения говорят о поиске индекса по всей таблице, а не по одному столбцу.

1 Ответ

2 голосов
/ 14 октября 2019

Да, вы можете сделать это, изучив системные представления sys.indexes и sys.index_columns .

Например, если вы хотите узнать, есть ли индекс в столбце «StartDate» в таблице «Production.BillOfMaterials» в базе данных AdventureWorks,

, вы можете выполнить следующий запрос,

DECLARE @colName AS SYSNAME = 'StartDate'
DECLARE @tableName AS NVARCHAR(256) = 'Production.BillOfMaterials'

SELECT i.name AS index_name, 
           COL_NAME(ic.object_id, ic.column_id) AS column_name, 
           ic.index_column_id, 
           ic.key_ordinal, 
           ic.is_included_column
    FROM sys.indexes AS i
         INNER JOIN sys.index_columns AS ic ON i.object_id = ic.object_id
                                               AND i.index_id = ic.index_id
    WHERE i.object_id = OBJECT_ID(@tableName)
          AND COL_NAME(ic.object_id, ic.column_id) = @colName;

… и вы получите следующий результат

enter image description here

На основе вашего комментария я создал еще два примера

Первый - фильтрация по имени столбца

В приведенном ниже фрагменте есть ответ, почему вы не можете получить желаемый результат. Object_Id основан на схеме, поэтому передача только имени таблицы без схемы дает значение NULL.

В этом примере я фильтрую системные представления в базе данных AdvantureWorks2016 на основе столбца «StartDate»

DECLARE @colName AS SYSNAME = 'StartDate'
--DECLARE @tableName AS NVARCHAR(256) = 'Production.BillOfMaterials'


SELECT i.name [Index Name], 
       OBJECT_SCHEMA_NAME(ic.object_id) + '.' + OBJECT_NAME(ic.object_id) [Table Name],
       COL_NAME(ic.object_id, ic.column_id) [Column Name], 
       ic.index_column_id, 
       ic.key_ordinal, 
       ic.is_included_column
FROM sys.indexes AS i
     INNER JOIN sys.index_columns AS ic ON i.object_id = ic.object_id
                                           AND i.index_id = ic.index_id
WHERE COL_NAME(ic.object_id, ic.column_id) = @colName
ORDER BY [Table Name]

Результат показан на рисунке ниже.

enter image description here

Вторая фильтрация на основе списка таблиц

Если вы хотите уменьшить область действия таблиц. Допустим, вы знаете список таблиц, которые вы хотите изучить, вы можете использовать следующий фрагмент.

DECLARE @tables AS TABLE 
(
TableName NVARCHAR(256)
)
INSERT INTO @tables
VALUES 
('HumanResources.EmployeeDepartmentHistory'),
('Production.BillOfMaterials'),
('Production.ProductCostHistory'),
('Production.ProductListPriceHistory')

SELECT i.name [Index Name], 
       OBJECT_SCHEMA_NAME(ic.object_id) + '.' + OBJECT_NAME(ic.object_id) [Table Name],
       COL_NAME(ic.object_id, ic.column_id) [Column Name], 
       ic.index_column_id, 
       ic.key_ordinal, 
       ic.is_included_column
FROM sys.indexes AS i
     INNER JOIN sys.index_columns AS ic ON i.object_id = ic.object_id
                                           AND i.index_id = ic.index_id

WHERE EXISTS 
(
SELECT * FROM @tables t WHERE t.TableName = OBJECT_SCHEMA_NAME(ic.object_id) + '.' + OBJECT_NAME(ic.object_id)
)
ORDER BY [Table Name]

И результат показан на рисунке ниже. enter image description here

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