Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 聚集索引不';不能使用IN和OR子句_Sql_Sql Server - Fatal编程技术网

Sql 聚集索引不';不能使用IN和OR子句

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); 是否有强制使用搜索索引而不是扫描的选项?

我已经聚集在(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);
是否有强制使用搜索索引而不是扫描的选项?
如果有人知道原因,我将非常感谢任何解释。

索引扫描只不过是从第一页到最后一页对数据页进行扫描。如果表上有索引,并且查询涉及的数据量较大,这意味着查询检索的数据超过50%或90%,那么优化器将只扫描所有数据页以检索数据行。如果没有索引,那么您可能会在执行计划中看到表扫描(索引扫描)

索引搜索通常是高选择性查询的首选。这意味着查询只是请求更少的行数,或者只是检索表中其他10行(一些文档称为15%)


有多少行具有用户id 1和2?您总共有多少行?

可以包含表定义吗?这在我的数据库中不会发生。此外,包括计划(请参阅:)可能会很有用。无论是索引搜索还是索引扫描,性能都不会受到影响。当SQL可以直接访问行时,将使用seek。如果涉及范围,则需要扫描。无论采用哪种方法,都将使用索引,并且不会影响性能。它与聚集索引无关。@SSteven我几乎102%是肯定的,这是不正确的。OP请提供计划(brent ozars的网站很好,正如DavidG发布的那样)。@JacobH,你指的是我评论的哪一方面?谢谢