简体   繁体   English

当我的 SELECT 查询不需要时,为什么我的 UPDATE 查询需要这么长时间?

[英]Why does my UPDATE query take so long when my SELECT query doesn't?

I am trying to do the following: let's say I have the following SELECT query (please excuse the german column names):我正在尝试执行以下操作:假设我有以下 SELECT 查询(请原谅德语列名):

    SELECT  a1.aktivitäts_id, a1.herkunft_kontakt, a1.aktionsart,
            a1.aktionstyp, a2.aktivitäts_id, a2.herkunft_kontakt,
            a2.aktionsart, a2.aktionstyp, a2.datum
        FROM  Aktivitäten a1, Aktivitäten a2
        WHERE  a1.kunden_nr_aktivität = a2.kunden_nr_aktivität
          AND  a1.aktionsart = 'foo'
          AND  a2.herkunft_kontakt <> '' 

This query takes about 4 seconds (the database has about 1 million records total) and returns about 400 records.这个查询大约需要 4 秒(数据库总共有大约 100 万条记录)并返回大约 400 条记录。 However, when I want to UPDATE these same records with the following statement但是,当我想使用以下语句更新这些相同的记录时

    UPDATE  Aktivitäten a1, Aktivitäten a2
       SET a1.herkunft_kontakt = a2.herkunft_kontakt
        WHERE  a1.kunden_nr_aktivität = a2.kunden_nr_aktivität
          AND  a1.aktionsart = 'foo'
          AND  a2.herkunft_kontakt <> '' 

The query always times out after taking forever.查询总是在永远占用后超时。 Am I doing something wrong or is this behaviour to be expected?我做错了什么还是可以预期这种行为?

First, learn to JOIN ,.!首先,学会JOIN ,.! Second, the difference is probably that you are updating too many rows -- and probably one row multiple times.其次,不同之处可能在于您更新了太多行 - 并且可能多次更新一行。 I might suggest trying to aggregate before joining:我可能会建议在加入之前尝试聚合:

UPDATE Aktivitäten a1 JOIN
       (SELECT kunden_nr_aktivität, MAX(herkunft_kontakt) as herkunft_kontakt
        FROM Aktivitäten a2
        WHERE a2.herkunft_kontakt <> ''
        GROUP BY kunden_nr_aktivität
       ) a2
       USING (kunden_nr_aktivität)
     SET a1.herkunft_kontakt = a2.herkunft_kontakt 
WHERE a1.aktionsart = 'foo' ; 

Composite indexes that may help:可能有帮助的复合索引:

a1:  (aktionsart, kunden_nr_aktivit)   -- in this order
a2:  (kunden_nr_aktivit, herkunft_kontakt)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM