复合索引比单索引慢多少

时间:2018-08-10 15:36:35

标签: database database-indexes

我正在考虑删除索引(A)并创建复合索引(A,B),因为A和B经常在where子句中一起使用。

但是我不知道如果where子句中仅请求A会对查询产生什么影响。

您知道它如何在不同的数据库上运行吗?

(使用默认类型在例如1000万条记录表上创建索引)

1 个答案:

答案 0 :(得分:0)

找出答案的最好方法是实际进行:)

所以我创建了一个表:

CREATE TABLE TestTable (ID INT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
City VARCHAR(50))

然后插入100 xxx行:

INSERT INTO TestTable (ID,FirstName,LastName,City)
SELECT TOP 100000 ROW_NUMBER() OVER (ORDER BY a.name) RowID,
'Bob1',
CASE WHEN ROW_NUMBER() OVER (ORDER BY a.name)%2 = 1 THEN 'Smith2'
ELSE 'Brown3' END,
CASE WHEN ROW_NUMBER() OVER (ORDER BY a.name)%10 = 1 THEN 'New York4'
WHEN ROW_NUMBER() OVER (ORDER BY a.name)%10 = 5 THEN 'San Marino5'
WHEN ROW_NUMBER() OVER (ORDER BY a.name)%10 = 3 THEN 'Los Angeles6'
ELSE 'Houston7' END
FROM sys.all_objects a
CROSS JOIN sys.all_objects b

然后我创建了两个单独的索引:

CREATE INDEX IX_FirstName ON TestTable(FirstName)
GO
CREATE INDEX IX_LastName ON TestTable(LastName)
GO

查询:

SELECT FirstName,
     LastName,       
     COUNT(*) RowsCount
FROM dbo.TestTable
GROUP BY FirstName, LastName, City

具有两个单独索引的执行计划: enter image description here

一个综合索引:

CREATE INDEX IX_FirstName_LastName
ON TestTable(FirstName, LastName)
GO

查询:

SELECT FirstName,
     LastName,       
     COUNT(*) RowsCount
FROM dbo.TestTable
GROUP BY FirstName, LastName, City

具有一个综合索引的执行计划: enter image description here

结论:

它实际上取决于许多因素,例如数据库管理系统,数据库管理系统的版本。但是,可以看出,两个单独的索引和一个复合索引之间没有区别。

请注意,如果您想使用复合索引,则应在查询中使用复合索引的所有列。