多键索引的性能和用法

时间:2013-10-18 00:43:51

标签: sql sql-server

使用SQL Server,我得到了一个项目,其中一个表具有一个非聚集索引,其中包含两个键CompanyIDEmployeeID。我总是觉得我必须做一个查询,其中包含两个键以快速查找。

例如:

select * from tblTable where CompanyID = 100 and EmployeeID = 1234

但如果我只搜索一列,那么它不会正确使用这个索引吗?

select * from tblTable where CompanyID = 100

这是对的吗?我总是在印象中,我必须为我想要快速搜索的每一列创建一个单独的索引,并且多键索引是我需要对两个键进行独特组合。

2 个答案:

答案 0 :(得分:2)

不一定 - 它取决于索引中键的顺序。

在您的情况下,如果索引在(CompanyID, EmployeeID)上,那么该索引可能会用于包含这两列的查询,但可能仅对包含这些列的查询有用CompanyID条款WHERE

但是,永远不会能够用于仅在EmployeeID子句中使用WHERE列的查询。如果您对EmployeeID有很多疑问,则可以调查是否可以在EmployeeID上为这些查询添加单独的附加索引。

通常,多列索引可能对使用n个最左列有用,例如只有CompanyID(最左边一列)或CompanyIDEmployeeID(最左边两列)。

答案 1 :(得分:0)

SQL服务器将评估是否可以根据成本使用索引,并根据您的值的选择性估算成本。如果您筛选的列不是索引的第一列,则可以获取索引扫描,但不能获取索引搜索。但是当您使用SELECT *时,您可能最终会进行聚簇索引扫描。

CREATE TABLE dbo.x
(
a int,
b int,
c int,
d int
)
CREATE CLUSTERED INDEX ix1 ON dbo.X (a);
CREATE NONCLUSTERED INDEX ix2 ON dbo.X (b,c);
INSERT INTO dbo.X (a,b,c) VALUES(1,1,1);
SELECT * FROM dbo.X WHERE b=1 --will probably use a clustered index scan
SELECT a FROM dbo.X WHERE b=1 --can use a non-clustered index seek (a is in the index as it's part of the clustered index key
SELECT a FROM dbo.X WHERE c=1 --will probably use a nonclustered index scan as c is not the first column
SELECT a,d FROM dbo.X WHERE b=1 --will probably use a clustered index scan as d is not part of the index