sql - 使用/JOIN 查询更快地删除

标签 sql join oracle10g sql-delete

我在 Oracle 10g 中有这个查询:

 DELETE FROM "BMAN_TP1"."CELLS_ITEM" TABLE1
 WHERE EXISTS (
     SELECT "CELLS_ITEM".*
     FROM "BMAN_TP1"."CELLS_ITEM"
     INNER JOIN "BMAN_TP1"."CELLS" ON ("CELLS_ITEM"."SET_ID"="CELLS"."SET_ID") AND ("CELLS_ITEM"."META_CELL_ID"="CELLS"."META_CELL_ID")
     INNER JOIN "BMAN_TP1"."META_CELLS" ON ("CELLS"."META_CELL_ID"="META_CELLS"."META_CELL_ID")
     WHERE ("META_CELLS"."UDA_ID" = variable)
     AND (TABLE1."SET_ID" = "CELLS_ITEM"."SET_ID")
     AND (TABLE1."META_CELL_ID" = "CELLS_ITEM"."META_CELL_ID")
)

目前删除 50K 条记录需要大约 10 秒(表中大约有 100K 条记录)

我知道它会重复 100K 次选择查询,这会大大减慢速度。
而且TABLE1有两个字段PK,这使得事情变得更加复杂。

有什么办法可以让它更快吗?

编辑:

尝试过这个,但花费的时间几乎相同:

DELETE FROM "BMAN_TP1"."CELLS_ITEM" TABLE1
WHERE EXISTS (
    SELECT "META_CELL_ID"
    FROM "BMAN_TP1"."META_CELLS"
    WHERE ("META_CELLS"."UDA_ID"=55823)
    AND (TABLE1."META_CELL_ID" = "META_CELLS"."META_CELL_ID")
)

最佳答案

如果不知道您的架构,就很难判断,但在子查询中使用要删除的表似乎毫无用处。我会写:

DELETE FROM BMAN_TP1.CELLS_ITEM TABLE1
WHERE EXISTS (
    SELECT CELLS.META_CELL_ID
    FROM BMAN_TP1.CELLS 
    INNER JOIN BMAN_TP1.META_CELLS ON (CELLS.META_CELL_ID=META_CELLS.META_CELL_ID)
    WHERE (META_CELLS.UDA_ID = variable)
        AND (TABLE1.SET_ID = CELLS_ITEM.SET_ID)
        AND (TABLE1.META_CELL_ID = CELLS_ITEM.META_CELL_ID)
)

编辑:以上内容现已过时,因为您修改了 DELETE 语句。请忽略它。

但另一个想法是:如果 CELLS_ITEM 上定义了触发器,您可以尝试禁用它们。他们可以长时间咀嚼更大的删除,这是我的第一手资料。

关于sql - 使用/JOIN 查询更快地删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10814745/

相关文章:

sql - 更新时间存储过程更新错误

mysql - 出现两个或多个指定值的行数

sql - 在单行中获取不同的列值

sql - 采访: How to handle SQL NOT NULL constraint on the code end

mysql - 获取 2 个不同相关表中两个字段的总和

mysql - 检查 SQL 中是否存在值,如果不返回另一行

java - 将当前日期存储在数据库中

sql - 将使用加号 (+) 的 Oracle 连接语法转换为标准连接语法

mysql - 基于两个交叉引用表连接多个表

sql - 选择在连接表中没有相应连接的行