【发布时间】:2020-10-26 01:00:31
【问题描述】:
我正在 SQL Server 中准备一个存储过程。基本上,我这里有两个表,表 A 和 B,这两个表在 Col4 上连接。此存储过程将根据表 B 中的属性过滤表 A,例如 where 子句中的 Col41 和 Col42(Col41 和 Col42 都是 float 数据类型)。
表 A:
Col1 Col2 Col3 Col4
Row1 ** ** ** **
Row2 ** ** ** **
表 B:
Col5 Col4 Col41 Col42
Row1 ** ** ** **
Row2 ** ** ** **
两个表的记录很多,所以我打算用非聚集索引来帮助查询(两个表的第一列都设置为主键)。
当我如下图创建了这个非聚集索引,然后在存储过程(临时索引)中使用后将其丢弃,性能相当不错。
CREATE NONCLUSTERED INDEX IX_1 ON tableB (Col41, Col42)
DROP INDEX IF EXISTS IX_1 ON tableB
但是,如果我直接将相同的非聚集索引添加到tableB(永久索引)中,要么右键单击tableB的索引文件夹,要么运行以下代码,性能会差很多。好像非聚集索引虽然创建了,但是没有被使用过。
CREATE NONCLUSTERED INDEX IX_1 ON tableB (Col41, Col42)
无法弄清楚为什么运行结果会变成这样。任何人都可以就如何解决它提供任何想法吗?谢谢。
【问题讨论】:
-
创建索引并不意味着它会被使用。这取决于与您使用的值相关的数据分布
-
您是唯一执行此过程的人吗(例如,在开发环境中)?有没有其他人在那个环境中做任何事情?该过程是否带有任何参数?如果您是唯一一个运行/测试它的人,您是否总是使用相同的参数值运行它?
-
编辑您的问题以包含两个查询的actual execution plans - 答案将在其中。
-
嗨@Mitch Wheat,你能多谈谈数据分布吗,或者你能列出一些我可以通过的相关链接吗?谢谢
-
@allmhuran,嗨,Allmhuran,我确信我是迄今为止唯一使用此存储过程的人,我多次使用相同的参数尝试此 sp。
标签: sql sql-server non-clustered-index