我正在尝试清理一个旧的SQLite3数据库,从中删除大约30.000条旧记录 要删除它们,我正在使用此查询:
DELETE
FROM
ITEMS
WHERE
ITEMS_ID IN (
SELECT
ITEMS_ID
FROM
ITEMS
WHERE
LASTSALEDATE NOT LIKE '2014%'
AND LASTSALEDATE NOT LIKE '2013%'
AND LASTSALEDATE NOT LIKE '2012%'
AND ITEMS_ID != 1
AND ITEMS_ID != 4
);
问题是我注意到这个查询非常慢,或者更好,速度太慢以至于需要很长时间而且我要中止它因为看起来很困难。
我认为问题是IN()
语句中的SELECT
被删除的每一行重复。
如何修复此查询?
答案 0 :(得分:2)
为什么你有IN
呢?
DELETE
FROM
ITEMS
WHERE
LASTSALEDATE NOT LIKE '2014%'
AND LASTSALEDATE NOT LIKE '2013%'
AND LASTSALEDATE NOT LIKE '2012%'
AND ITEMS_ID != 1
AND ITEMS_ID != 4
编辑:
假设一个更复杂的结构,你没有详细说明,这可能比IN
更有效......
DELETE
ITEMS
FROM
(
SELECT
ITEMS_ID
FROM
ITEMS
WHERE
LASTSALEDATE NOT LIKE '2014%'
AND LASTSALEDATE NOT LIKE '2013%'
AND LASTSALEDATE NOT LIKE '2012%'
AND ITEMS_ID != 1
AND ITEMS_ID != 4
GROUP BY
ITEMS_ID
)
AS lookup
WHERE
lookup.ITEMS_ID = ITEMS.ITEMS_ID
此外,根据LASTSALEDATE
的数据类型,请尝试此WHERE
子句。
WHERE
LASTSALEDATE < '2012-01-01'
AND ITEMS_ID <> 1
AND ITEMS_ID <> 4
答案 1 :(得分:1)
在进行大量删除之前,请确保没有在幕后运行的删除触发器,这可能会导致delete
语句显着减慢。
我认为在SqlLite中暂时禁用触发器是不可能的,就像在其他DBMS中一样。所以,你必须:
此外,在禁用它们之前,请尝试了解这些删除触发器正在执行的操作。他们可能会做一些重要的事情,例如数据审计或对维护数据完整性至关重要的更改在这种情况下,可能需要耐心等待一段时间才能完成删除。