我有一个表Relations(Friend,minutes),其中分钟在[0; 500]。考虑一个 条件B≥250的查询。为了优化此查询,我在几分钟内创建了一个非聚集索引。但是,系统更喜欢不使用索引。为什么?
朋友是主键
答案 0 :(得分:0)
您的查询条件不是选择性的。它触及一半的记录。查询优化器认为表扫描的性能更好。
答案 1 :(得分:0)
查询中索引的主要目的之一是减少正在访问的数据页的数量。每个数据页通常包含许多记录-数十或数百。
使用索引会产生开销:
如果您要访问一半的记录,那么您仍在访问所有数据页。结果,数据库优化程序决定将它们全部读取并进行比较比调用索引便宜。
你能做什么?一种选择是建立一个覆盖您的查询的索引。也就是说,不是索引(minutes)
,而是索引(minutes, friend)
。因为所有列都在索引中,所以不需要访问数据页。
第二种可能性是使用minutes
作为第一个键来创建聚簇索引。您可能不保证使用聚集索引,但是这也将数据库限制为仅读取所需的数据。