下面的DELETE查询运行方式比同一个SELECT语句长。为了进行比较,SELECT查询运行1分钟,DELETE查询运行超过5分钟,实际超时。为什么会发生这种情况?如何防止这种情况发生?
选择查询(1分钟)
SELECT
*
FROM
company
WHERE
symbol IN (SELECT
`hd`.`symbol` AS `symbol`
FROM
(`stockton`.`historical_data` `hd`
JOIN (SELECT
MAX(`stockton`.`historical_data`.`histDate`) AS `maxhd`
FROM
`stockton`.`historical_data`) `m`)
GROUP BY `hd`.`symbol` , `m`.`maxhd`
HAVING (MAX(`hd`.`histDate`) < (NOW() - INTERVAL 7 DAY)));
删除查询(5分钟以上)
DELETE
FROM
company
WHERE
symbol IN (SELECT
`hd`.`symbol` AS `symbol`
FROM
(`stockton`.`historical_data` `hd`
JOIN (SELECT
MAX(`stockton`.`historical_data`.`histDate`) AS `maxhd`
FROM
`stockton`.`historical_data`) `m`)
GROUP BY `hd`.`symbol` , `m`.`maxhd`
HAVING (MAX(`hd`.`histDate`) < (NOW() - INTERVAL 7 DAY)));
答案 0 :(得分:0)
改进:您可能希望更改查询以在编程语言中计算ALTER ROLE postgreSQL NOLOGIN;
ERROR: role "postgresql" does not exist
,而不是在查询本身中计算。
删除花费更多时间:删除通常会花费更多时间,如果你将google,你会发现你并不孤单。原因是与Select相比,Delete是一项昂贵的操作,因为删除需要以下内容: 1)将记录与您的情况进行比较 2)从表中删除 3)从表上创建的一个或多个索引中删除引用 4)可能会也可能不会根据引擎更新表的元数据
而选择是: 1)将记录与您的条件进行比较,或者如果条件使用Index,则使用索引 2)返回结果值
考虑到你有更大的表,你可能会有更大的索引,与仅选择相比,操作需要时间。
但是你可以尝试建议的改进,并且应该及时看到一些改进。