假设我们有以下表格: r(a,b,c) 其中a是一个整数,表有50行 s(d,e,f,a) s.a是t.a上的外键。 每个元组是400字节,s是多集,因为这是一个SQL数据库。 s拥有大约100万个元组。 添加表时,数据库服务器会自动在表中的主键列上创建索引,例如t在a上有索引。但是,Oracle不会在作为外键的列上创建索引。所以s没有索引。 我们想从t中删除15行。所以我们这样做: 1)我们从s中删除具有相同t值的行。这需要10分钟。 2)然后我们运行语句DELETE FROM t WHERE IN(我们试图删除的值,其中15个是准确的) 这大约需要6个小时。
所以我的猜测是第二步需要很长时间,因为对于t中的每个元组,我们将a的值与查询列表中的每个值进行比较。那么我们如何优化这个查询以获得相同的结果,但更快!?
答案 0 :(得分:0)
如果使用连接对于CRUD操作将更快而不是使用IN或子查询
例如:
DELETE FROM t
INNER JOIN S ON t.a = S.a
希望这有帮助