sql - 检查列上的索引
问题描述
无论如何我们可以检查表中的特定列是否有索引?我正在使用 SQL Server Management Studio 2016。我确实在网上搜索过,但所有解决方案都在谈论在整个表而不是一列上查找索引。
解决方案
是的,您可以通过探索系统视图sys.indexes和sys.index_columns来做到这一点。
例如,如果您想了解 AdventureWorks 数据库中表 'Production.BillOfMaterials' 中的 'StartDate' 列是否有索引,
您可以执行以下查询。
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;
…你会得到如下结果
根据您的评论,我创建了另外两个示例
首先——根据列名过滤
在下面的代码段中有一个答案,为什么你不能得到想要的结果。Object_Id 是基于模式的,因此只传递没有模式的表名会产生 NULL 值。
在示例中,我正在根据列“StartDate”过滤 AdvantureWorks2016 数据库中的系统视图
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]
结果如下图所示。
基于表列表的二次过滤
如果您想缩小表格的范围。假设您知道要检查的表的列表,您可以使用以下代码段。
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]
推荐阅读
- php - 第一次治疗后会话自动重置
- javascript - 使用客户端指纹编码 JWT 令牌?
- mongodb - Mongodb更新多个文档,如果不存在则插入
- mysql - 'AND columnName NOT IN' 在 mysql 中不起作用
- java - 如何通过命令行为 jfr 启用堆指标
- lumen - 流明路线参数不适用于点
- java - 在 IBM Websphere 上部署 WAR
- perl - .perldb(Perl 调试器)中用于表达式评估“x”的别名定义不起作用
- image - 如何将半径应用于颤动的图像?
- c# - 为什么默认系统日期时间与 PersianCalendar 之间的转换不起作用?