列上的索引只有2个不同的值

Wil*_*ill 6 sql oracle indexing performance

我想知道这个指数的表现:

我有一个"无效"的varchar(1)列,它有2个值:NULL或'Y'我有一个索引(无效),以及(invalid,last_validated)Last_validated是一个日期时间(这用于一个不相关的SELECT查询)

我正在标记表中的少量项目(1-5%),并将其作为"要删除".
我是这样的

 DELETE FROM items WHERE invalid='Y'
Run Code Online (Sandbox Code Playgroud)

它不会对无效项执行全表扫描.

一个问题似乎是,实际的DELETE现在非常慢,可能是因为所有索引都被删除了.

位图索引会为此提供更好的性能吗?或者根本没有索引?

LBu*_*kin 1

对此有两个想法...

  1. 使用 NULL 来表示“Y”的相反值可能不是一个好主意。Null 意味着“我不知道这个值是什么”或“问题没有有意义的答案”。您确实应该使用“N”作为“Y”的反义词。这将消除搜索有效项的问题,因为当该列仅包含非空值时,Oracle 不会使用该列上的索引。

  2. 您可能需要考虑CHECK CONSTRAINT在此类列上添加 来确保仅输入合法值。

然而,这些更改都不一定对 DELETE 性能产生任何影响。

  • 从逻辑上讲,我同意你的观点#1;然而,在实践中,*在某些情况下*将列中不感兴趣的值表示为 NULL 具有显着的性能优势,因为 Oracle 不会在索引中存储全空行 - 如果对该列的查询几乎总是只感兴趣在罕见的“Y”值中,将非“Y”表示为 NULL 会对查询、更新和删除的性能产生巨大影响。 (2认同)