【发布时间】:2010-11-09 12:26:34
【问题描述】:
我有一个相当简单的查询:
SELECT
col1,
col2…
FROM
dbo.My_Table
WHERE
col1 = @col1 AND
col2 = @col2 AND
col3 <= @col3
它的表现很糟糕,所以我在 col1、col2、col3(int、bit 和 datetime)上添加了一个索引。当我检查查询计划时,它忽略了我的索引。我尝试在每个可能的配置中重新排序索引中的列,它总是忽略索引。当我运行查询时,它会执行聚集索引扫描(表大小在 700K 到 800K 行之间),需要 10-12 秒。当我强制它使用我的索引时,它会立即返回。我小心翼翼地清除了测试之间的缓存和缓冲区。
我尝试过的其他事情:
UPDATE STATISTICS dbo.My_Table
CREATE STATISTICS tmp_stats ON dbo.My_Table (col1, col2, col3) WITH FULLSCAN
我在这里遗漏了什么吗?我讨厌在存储过程中放置索引提示,但 SQL Server 似乎无法获得这方面的线索。任何人都知道可能会阻止 SQL Server 认识到使用索引是个好主意的任何其他事情吗?
编辑:返回的列之一是 TEXT 列,因此使用覆盖索引或 INCLUDE 将不起作用:(
【问题讨论】:
-
您在列列表中添加了一个省略号,您还选择了哪些其他列?如果只有 col1、col2 和 col3 怎么办?
-
克里斯,好点,但是“当我强制它使用我的索引时,它会立即返回”涵盖了这一点。
-
省略号是因为查询返回表中的所有列。我想我可以把 SELECT *
标签: sql-server sql-server-2005 performance indexing