我正在使用这样的查询执行更新:
UPDATE (SELECT h.m_id,
m.id
FROM h
INNER JOIN m
ON h.foo = m.foo)
SET m_id = id
WHERE m_id IS NULL
一些信息:
- 表
h
大约有 500 万行 - 表中的所有行
h
都有NULL
值m_id
- 表
m
大约是 ~500,000 行 m_id
on table是h
指向表的索引外键id
m
id
on tablem
是主键- 有索引
m.foo
和h.foo
对于EXPLAIN PLAN
这个查询,表示哈希连接和全表扫描,但我不是 DBA,所以我不能很好地解释它。
查询本身运行了几个小时并没有完成。我原以为它会在几分钟内完成。我还尝试了以下查询重写:
UPDATE h
SET m_id = (SELECT id
FROM m
WHERE m.foo = h.foo)
WHERE m_id IS NULL
对于EXPLAIN PLAN
这个提到的 ROWID 查找和索引使用,它也持续了几个小时没有完成。我也一直认为这样的查询会导致对外部查询谓词的每个结果都执行子查询,所以无论如何我预计这种重写的性能会很差。
我的方法有什么问题,还是我的问题与索引、表空间或其他与查询无关的因素有关?
编辑:
我也从像这样的简单计数查询中获得了糟糕的表现:
SELECT COUNT(*)
FROM h
WHERE m_id IS NULL
这些查询需要大约 30 秒到有时大约 30 分钟(!)。
我注意到没有锁,但这些表的表空间现在处于 99.5% 的使用率(只有约 6MB 可用)。有人告诉我,只要使用索引,这无关紧要,但我不知道......