我正在考虑删除索引(A)并创建复合索引(A,B),因为A和B经常在where子句中一起使用。
但是我不知道如果where子句中仅请求A会对查询产生什么影响。
您知道它如何在不同的数据库上运行吗?
(使用默认类型在例如1000万条记录表上创建索引)
答案 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
一个综合索引:
CREATE INDEX IX_FirstName_LastName
ON TestTable(FirstName, LastName)
GO
查询:
SELECT FirstName,
LastName,
COUNT(*) RowsCount
FROM dbo.TestTable
GROUP BY FirstName, LastName, City
结论:
它实际上取决于许多因素,例如数据库管理系统,数据库管理系统的版本。但是,可以看出,两个单独的索引和一个复合索引之间没有区别。
请注意,如果您想使用复合索引,则应在查询中使用复合索引的所有列。