【发布时间】:2009-06-03 14:26:17
【问题描述】:
我在 Microsoft SQL Server 2008 中遇到了一个奇怪的问题。 我有一个包含大约 10 个表的大型数据库(20 GB),我试图说明如何正确创建索引。
这是我的问题:在一些嵌套查询中,我得到了更快的结果没有使用索引!它很接近(一两秒),但在某些情况下,根本不使用索引似乎会使这些查询运行得更快......我正在运行 Checkpoiunt 和 DBCC dropcleanbuffers 以在运行脚本之前重置缓存,所以我我有点迷路了。
这可能是什么原因造成的? 我知道索引构造不佳(认为每个相关字段一个索引)的事实,重点是证明正确构造它们的重要性,但它应该永远比没有索引慢对吧?
编辑:这是有罪的查询之一:
SET STATISTICS TIME ON
SET STATISTICS IO ON
USE DBX;
GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO
DBCC FREEPROCCACHE;
GO
SELECT * FROM Identifier where CarId in (SELECT CarID from Car where ManufactId = 14) and DataTypeId = 1
标识符表: - IdentifierId int 不为空 - CarId int 不为空 - DataTypeId int 不为空 - 别名 nvarchar(300)
汽车桌: - CarId int 不为空 - ManufactId int 不为空 - (后面有几个字段,都是 nvarchar(100)
每个要点都有一个索引,以及一些同时存储其中两个的索引(例如 CarId 和 DataTypeId)。
最后,标识符表有超过百万的条目,而汽车表有两三百万
【问题讨论】:
-
感谢大家的回答!不幸的是,SQL Server 决定应该突然恢复数据库,所以恐怕我暂时被锁定了。 PS:我还在“无索引”方法中删除了主键,但在糟糕的索引中重建了它们
标签: sql-server sql-server-2008 indexing