聚簇索引不适用于IN和OR子句

时间:2018-05-03 15:38:42

标签: sql sql-server

我已经聚集在(PK)例如表用户。

当我按特定用户ID搜索时,它使用索引搜索。

SELECT * 
FROM user 
WHERE user.user_id = 1;

如果我添加OR或更改为IN子句,它将开始使用索引扫描

SELECT * 
FROM user 
WHERE user.user_id = 1 
or user.user_id = 2

SELECT * 
FROM user 
WHERE user.user_id  in (1,2);

是否有一些选项可以强制使用搜索索引而不是扫描? 如果有人知道我会感激任何解释的原因?

1 个答案:

答案 0 :(得分:0)

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

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

用户ID为1和2的行数是多少?你有多少总行数?