Sql 聚集索引不';不能使用IN和OR子句
我已经聚集在(PK)中作为实例表用户 当我按特定的用户id搜索时,它使用索引搜索Sql 聚集索引不';不能使用IN和OR子句,sql,sql-server,Sql,Sql Server,我已经聚集在(PK)中作为实例表用户 当我按特定的用户id搜索时,它使用索引搜索 SELECT * FROM user WHERE user.user_id = 1; 若我在IN子句中添加或更改,它将开始使用索引扫描 SELECT * FROM user WHERE user.user_id = 1 or user.user_id = 2 SELECT * FROM user WHERE user.user_id in (1,2); 是否有强制使用搜索索引而不是扫描的选项?
SELECT *
FROM user
WHERE user.user_id = 1;
若我在IN子句中添加或更改,它将开始使用索引扫描
SELECT *
FROM user
WHERE user.user_id = 1
or user.user_id = 2
SELECT *
FROM user
WHERE user.user_id in (1,2);
是否有强制使用搜索索引而不是扫描的选项?
如果有人知道原因,我将非常感谢任何解释。索引扫描只不过是从第一页到最后一页对数据页进行扫描。如果表上有索引,并且查询涉及的数据量较大,这意味着查询检索的数据超过50%或90%,那么优化器将只扫描所有数据页以检索数据行。如果没有索引,那么您可能会在执行计划中看到表扫描(索引扫描) 索引搜索通常是高选择性查询的首选。这意味着查询只是请求更少的行数,或者只是检索表中其他10行(一些文档称为15%)
有多少行具有用户id 1和2?您总共有多少行?可以包含表定义吗?这在我的数据库中不会发生。此外,包括计划(请参阅:)可能会很有用。无论是索引搜索还是索引扫描,性能都不会受到影响。当SQL可以直接访问行时,将使用seek。如果涉及范围,则需要扫描。无论采用哪种方法,都将使用索引,并且不会影响性能。它与聚集索引无关。@SSteven我几乎102%是肯定的,这是不正确的。OP请提供计划(brent ozars的网站很好,正如DavidG发布的那样)。@JacobH,你指的是我评论的哪一方面?谢谢