我有简单的查询:
SELECT * FROM MH.APPOINTMENT WHERE DOCTOR_INC_ID = 1391791151
当我检查执行计划时,我看到使用索引
检索数据但是以下查询:
SELECT * FROM MH.APPOINTMENT WHERE DOCTOR_INC_ID NOT IN (1391791151)
没有从我们的索引中受益。我们正在使用Oracle 11g Release2。欢迎任何建议。感谢
答案 0 :(得分:15)
当你住在美国,要求“纽约”和“华盛顿”时,你会很容易识别出位置。因为,它们被记录在你的记忆中。在被问到除“纽约”以外的所有城市时,您仍然需要从记忆中取出所有城市,这显然不像以前那么容易!
可能听起来很有趣,但这是索引扫描和全表扫描的概念。
答案 1 :(得分:7)
它只是不会为这种查询使用索引而付出代价 - 它没有足够的选择性。 如果期望查询检索一行(或者与表大小相比较少的行,假设为1%),则可以通过首先搜索索引,然后从实际表中返回关联的行来非常快速地找到这些值。但是如果期望查询返回99%的行,那么在idex中搜索它们然后检索关联的行是没有意义的 - 这是太多的工作。而是引擎直接进行表扫描。