我有两张表,一张名为 shots,有 9m 行,一张名为 holes,有 50k 行。 我的 DBMS 是 SQLite。
目标是用以下值替换镜头中x
、y
、z
的零值从漏洞返回值。
我有一整天都在运行以下查询:
UPDATE shots
SET x = h.hole_x,
y = h.hole_y,
z = h.hole_z
FROM holes h
LEFT OUTER JOIN shots s
ON h.tournament = s.tournament
AND h.course = s.course
AND h.year = s.year
AND h.round = s.round
AND h.hole = s.hole
WHERE s.end = 'hole'
AND s.x = '0.0'
AND s.y ='0.0'
AND s.z = '0.0'
AND h.hole_x != '0.0'
AND h.hole_y != '0.0'
AND h.hole_z != '0.0'
我正在阅读here 子查询
的速度比 JOIN
快 260 倍。
如何重写我的查询以使其变得更快?
最佳答案
这里的主要问题是您对必须删除的洞
进行了不必要的连接。
这是 SQLite 中类似连接的 UPDATE
语句的正确语法:
UPDATE shots AS s
SET x = h.hole_x,
y = h.hole_y,
z = h.hole_z
FROM holes AS h
WHERE h.tournament = s.tournament AND h.course = s.course
AND h.year = s.year AND h.round = s.round AND h.hole = s.hole
AND s.end = 'hole' AND s.x = '0.0' AND s.y = '0.0' AND s.z = '0.0'
AND h.hole_x <> '0.0' AND h.hole_y <> '0.0' AND h.hole_z <> '0.0';
另外,为什么要与 '0.0'
进行比较?
如果列 hole_?
是数字,那么您应该将它们与 0.0
或只是 0
进行比较。
关于sql - 将 JOIN 查询重写为子查询/更快的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73940128/