3

在使用 SQL Server 时,我得到了一个项目,其中一个表有一个带有两个键的非聚集索引,CompanyID并且EmployeeID. 我一直觉得我必须执行一个包含两个键的查询才能使查找快速。

例如:

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

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

select * from tblTable where CompanyID = 100

那是对的吗?我总是觉得我必须为我想快速搜索的每一列创建一个单独的索引,如果我需要对两个键进行唯一组合,那么多键索引就是这样。

4

2 回答 2

2

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

在您的情况下,如果索引为 on (CompanyID, EmployeeID),则该索引可能用于包含两列的查询,但它可能对仅包含CompanyID在其WHERE子句中的查询有用。

但是,它永远不能用于仅使用其子句中的EmployeeID列的查询。WHERE如果您对 有很多查询EmployeeID,您可能会调查是否有可能仅EmployeeID针对这些查询使用单独的附加索引。

通常,多列索引可能对使用最左侧的 n 列有用,例如仅CompanyID(最左侧的 1 列)或CompanyIDEmployeeID(最左侧的 2 列)。

于 2013-10-18T04:38:24.477 回答
0

SQL server 将根据成本评估是否可以使用索引,并根据您的价值的选择性来估算成本。如果您过滤的列不是和索引的第一列,则可以进行索引扫描,但不能进行索引查找。但是当您使用 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
于 2013-10-18T01:10:20.760 回答