Database 有多少复合索引比单一索引慢

Database 有多少复合索引比单一索引慢,database,database-indexes,Database,Database Indexes,我正在考虑删除索引(A)并创建复合索引(A,B),因为A和B通常在where子句中一起使用 然而,我想知道如果where子句中只请求一个查询,它会对查询产生什么影响 你知道它在不同的数据库上是如何工作的吗 (索引是使用默认类型在例如1000万个记录表上创建的)最好的方法是实际操作:) 所以我创建了一个表: CREATE TABLE TestTable (ID INT, FirstName VARCHAR(50), LastName VARCHAR(50), City VARCHAR(50))

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

然而,我想知道如果where子句中只请求一个查询,它会对查询产生什么影响

你知道它在不同的数据库上是如何工作的吗


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

最好的方法是实际操作:)

所以我创建了一个表:

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
CREATE INDEX IX_FirstName_LastName
ON TestTable(FirstName, LastName)
GO
SELECT FirstName,
     LastName,       
     COUNT(*) RowsCount
FROM dbo.TestTable
GROUP BY FirstName, LastName, City
查询:

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
CREATE INDEX IX_FirstName_LastName
ON TestTable(FirstName, LastName)
GO
SELECT FirstName,
     LastName,       
     COUNT(*) RowsCount
FROM dbo.TestTable
GROUP BY FirstName, LastName, City
具有两个单独索引的执行计划:

一个综合指数:

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
CREATE INDEX IX_FirstName_LastName
ON TestTable(FirstName, LastName)
GO
SELECT FirstName,
     LastName,       
     COUNT(*) RowsCount
FROM dbo.TestTable
GROUP BY FirstName, LastName, City
查询:

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
CREATE INDEX IX_FirstName_LastName
ON TestTable(FirstName, LastName)
GO
SELECT FirstName,
     LastName,       
     COUNT(*) RowsCount
FROM dbo.TestTable
GROUP BY FirstName, LastName, City
具有一个复合索引的执行计划:

结论:

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
CREATE INDEX IX_FirstName_LastName
ON TestTable(FirstName, LastName)
GO
SELECT FirstName,
     LastName,       
     COUNT(*) RowsCount
FROM dbo.TestTable
GROUP BY FirstName, LastName, City
这实际上取决于许多因素,例如数据库管理系统、数据库管理系统的版本。然而,可以看出,两个单独的指数和一个复合指数之间没有区别

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