是否可以编写一个查询,该查询返回所有聚簇索引不基于身份密钥的表?用于查找聚簇索引的SQL Server查询
6
A
回答
9
如何:
SELECT
TableName = t.name,
ClusteredIndexName = i.name,
ColumnName = c.Name
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.object_id = i.object_id
INNER JOIN
sys.index_columns ic ON i.index_id = ic.index_id AND i.object_id = ic.object_id
INNER JOIN
sys.columns c ON ic.column_id = c.column_id AND ic.object_id = c.object_id
WHERE
i.index_id = 1 -- clustered index
AND c.is_identity = 0
AND EXISTS (SELECT *
FROM sys.columns c2
WHERE ic.object_id = c2.object_id AND c2.is_identity = 1)
OK,这个查询将列出有一列是不身份的主键,但那里也附加在主键约束第二列IS和IDENTITY
列。
+0
Marc,不,我想知道那些由身份密钥和其他东西组成的聚集索引 – DevilDog
+0
@DevilDog :更新了我的回复 - 现在应该处理您的要求 –
5
SELECT s.name AS schema_name, o.name AS object_name, i.name AS index_name
FROM sys.indexes i
JOIN sys.objects o ON i.object_id = o.object_id
JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE i.type = 1 -- Clustered index
--AND o.is_ms_shipped = 0 -- Uncomment if you want to see only user objects
AND NOT EXISTS (
SELECT *
FROM sys.index_columns ic INNER JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id
WHERE ic.object_id = i.object_id AND ic.index_id = i.index_id
AND c.is_identity = 1 -- Is identity column
)
ORDER BY schema_name, object_name, index_name;
样本输出(AdventureWorks2008R2):
schema_name object_name index_name
-------------- --------------------------- --------------------------------------------------------------------
HumanResources Employee PK_Employee_BusinessEntityID
HumanResources EmployeeDepartmentHistory PK_EmployeeDepartmentHistory_BusinessEntityID_StartDate_DepartmentID
HumanResources EmployeePayHistory PK_EmployeePayHistory_BusinessEntityID_RateChangeDate
Person BusinessEntityAddress PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID
Person BusinessEntityContact PK_BusinessEntityContact_BusinessEntityID_PersonID_ContactTypeID
0
以下查询会给你所有的用户表,列,数据类型,如果该列是聚簇索引的一部分,它将返回列的顺序/在crusted的索引中订购,否则它将返回NULL。
SELECT U.name [OWNER],O.name [TABLE_NAME],C.name [COLUMN_NAME],T.name [DATA_TYPE],C.length [DATA_LENGTH], x.keyno [Primary_Key_order]
FROM syscolumns C
inner join sysobjects O on O.Id=C.Id and o.xtype='U' -- User Tables
inner join sysusers U on O.Uid=U.UID
inner join systypes T on C.xtype=T.xtype
left outer join (Select O.name [TABLE_NAME] , C.name [COLUMN_NAME], IK.keyno
from syscolumns C
inner join sysobjects O on O.Id=C.Id and O.xtype='U' -- User Tables
join sysindexkeys IK on O.id=IK.ID and C.colid=IK.COLID and Indid=1 -- Only Clustered Index
) x
on x.TABLE_NAME=O.name and X.COLUMN_NAME=C.name
order by U.name
相关问题
- 1. SQL Server非聚簇索引
- 2. 如何用非聚集索引查找或聚簇索引查找替换聚簇索引扫描?
- 3. SQL Server - 如何查找聚簇索引是否存在
- 4. SQL Server 2005聚簇索引查询速度
- 5. 尽管有聚簇索引,SQL Server仍在使用非聚簇索引
- 6. 如何执行非聚簇索引查找而不是聚簇索引扫描
- 7. 聚簇索引和非聚簇索引
- 8. 并行SQL Server聚簇索引创建
- 9. 聚簇索引
- 10. SQL Server性能:非聚簇索引+ INCLUDE列与聚簇索引 - 等效吗?
- 11. SQL空间索引和聚簇索引
- 12. SQL Server索引 - HEAP上的非聚簇索引
- 13. SQL Server:如何使用昂贵的非聚簇索引来改进3连接查询寻找
- 14. 群集索引和非聚簇索引 - SQL Server和Oracle?
- 15. SQL Server中唯一标识符列上的聚簇/非聚簇索引
- 16. 为什么SQL索引视图始终使用聚簇索引
- 17. 数据库如何使用聚簇索引查找记录?
- 18. 为什么在此查询中使用聚簇索引扫描?
- 19. 非主键列上的聚簇索引或非聚簇索引?
- 20. SQL Server引擎如何基于聚簇索引加载内存中的数据?
- 21. 为什么我的查询在索引时执行聚簇索引扫描
- 22. 具有非聚簇索引但没有聚簇索引
- 23. 非唯一列上的SQL Server聚簇索引
- 24. 非唯一键上的sql server聚簇索引
- 25. 非唯一列上的SQL Server聚簇索引
- 26. SQL Server 2005聚簇索引删除运行时间很长,没有非聚簇索引存在
- 27. 全文索引vs %%和聚簇索引
- 28. SQL服务器行不聚簇索引
- 29. 获取SQL Server使用索引查找+键查找,而不是聚集索引扫描,而不(FORCESEEK)
- 30. Sql Server,复合主键和聚簇索引
你还尝试过任何东西。元表sys.indexes和sys.index_columns和sys.columns将成为开始的地方。 –
你能澄清吗?你是否想要所有没有聚集在仅* IDENTITY列上的表,或所有没有在聚集索引中的任何位置包含IDENTITY列的表? –
Aaron,我想我感兴趣的是任何不仅仅是一个身份密钥的聚集索引 – DevilDog