加速非常慢的查询

时间:2014-04-28 12:50:57

标签: sql sqlite

我正在尝试清理一个旧的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被删除的每一行重复。

如何修复此查询?

2 个答案:

答案 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中一样。所以,你必须:

  1. 保存删除触发器脚本
  2. 删除删除触发器
  3. 运行删除查询
  4. 重新创建删除触发器
  5. 此外,在禁用它们之前,请尝试了解这些删除触发器正在执行的操作。他们可能会做一些重要的事情,例如数据审计或对维护数据完整性至关重要的更改在这种情况下,可能需要耐心等待一段时间才能完成删除。