2
INSERT INTO table3
SELECT
  tbl1.pk_1, tbl1.pk_2, tbl2.pk_3, tbl1.pk4
FROM
  table1 tbl1, table2 tbl2
WHERE
  tbl1.pk_1 = 'root' and
  NOT EXISTS 
    (SELECT 1 FROM table3 tbl3
     WHERE tbl3.pk_1 = tbl1.pk_1 and tbl3.pk_2 = tbl1.pk_2 and tbl3.pk_3 = tbl2.pk_3 and tbl3.pk_4 = tbl1.pk_4) 
;

我的 SQL 语句看起来像这样。table1 和 table3 有超过 1000000 行,table2 有 100 行。这个 SQL 语句很慢。完成需要100多秒。有什么办法可以改善吗?

4

3 回答 3

1

我发现很难提高这条 SQL 语句的性能。我测试了 MERGE,但是它需要 200 多秒。即使性能可以提高,我估计也只能提高1秒或2秒,这不符合我们的业务需求。(我有大约 20 条这样的 SQL 语句)。于是我回顾了我们的业务逻辑,发现这个SQL语句是没有必要的。我们只需要一个更仔细的算法来收集新数据,制作一个笛卡尔积,然后将这些新数据插入到 table3 中。这样,这条SQL语句就可以去掉了。而新的过程只需要几秒钟!我认为当我们改进一条 SQL 语句时,请首先确定这条 SQL 语句是绝对必要的。

于 2014-03-20T05:23:08.797 回答
1

使用 MERGE,它服务更快

merge into table3 tbl3
using (select tbl1.pk_1, tbl1.pk_2, tbl2.pk_3, tbl1.pk4
         from table1 tbl1, table2 tbl2
        where tbl1.pk_1 = 'root') tb1
   on (tbl3.pk_1 = tbl.pk_1 and tbl3.pk_2 = tbl.pk_2 and tbl3.pk_3 = tbl.pk_3 and tbl.pk_4 = tbl1.pk_4) 
when not matched then 
     insert (tbl3.pk_1, tbl3.pk_2, tbl3.pk_3, tbl3.pk_4)
     VALUES (tbl.pk_1, tbl.pk_2, tbl.pk_3, tbl.pk_4);
于 2014-03-19T09:04:09.757 回答
0

我很确定您的表表达式不完整:

FROM
  table1 tbl1, table2 tbl2

您(可能不小心)在 table1 和 table2 之间生成笛卡尔积,内存中有 1000000 x 100 条记录。您的表表达式可能应该是:

FROM
  table1 tbl1, table2 tbl2
WHERE
  tbl1.some_column = tbl2.some_column

甚至更好(以防止将来发生此类事情)

FROM
  table1 tbl1
JOIN
  table2 tbl2 ON tbl1.some_column = tbl2.some_column
于 2014-03-19T08:21:49.447 回答