SQL NOT IN语句不使用索引检索数据

cgo*_*gon 6 sql oracle indexing

我有简单的查询:

SELECT * FROM MH.APPOINTMENT WHERE DOCTOR_INC_ID = 1391791151
Run Code Online (Sandbox Code Playgroud)

当我检查执行计划时,我看到使用索引检索数据

但是以下查询:

SELECT * FROM MH.APPOINTMENT WHERE DOCTOR_INC_ID NOT IN (1391791151)
Run Code Online (Sandbox Code Playgroud)

没有受益于我们的指数.我们正在使用Oracle 11g Release2.欢迎任何建议.谢谢

Mah*_*kar 15

当你住在美国,要求"纽约"和"华盛顿"时,你将很容易识别出位置.因为,它们被记录在你的记忆中.当被问到除"纽约"之外的所有城市时,你仍然需要从你的记忆中取出所有的城市,这显然不像以前那么容易!

可能我听起来很有趣,但这是索引扫描和全表扫描的概念.


Ada*_*ski 7

它只是不会为这种查询使用索引付出代价 - 它没有足够的选择性.如果期望查询检索一行(或者与表大小相比较少的行,假设为1%),则可以通过首先搜索索引,然后从实际表中返回关联的行来非常快速地找到这些值.但是如果期望查询返回99%的行,那么在idex中搜索它们然后检索关联的行是没有意义的 - 这是太多的工作.相反,引擎直接进行表扫描.