2017-04-05 9 views
0

3つの列が一致する限り、av.UnitTypeをut.unittypeの値に設定しようとしていますが、このステートメントのどの部分が不思議ですそれはそう長く取ることが原因とされていますこの更新クエリが遅い理由と改善方法

SET SQL_SAFE_UPDATES=0; 
UPDATE `db`.`table_av` av, `db`.`table_ut` ut 
SET av.UnitType = ut.unittype 
WHERE TRIM(LEADING '0' FROM av.id) = ut.id 
AND av.veh = ut.veh 
AND av.date LIKE CONCAT('%', ut.Year); 
+2

クエリを遅くする可能性のあるリストでは、 "TRIM()"や "CONCAT()"のような関数で、 "ワイルドカードを指すLIKE条件"というように、 .... "とし、文法的には、"カンマ結合 "表記を使用することは時代遅れであり、文字通り何十年もの間好まれていませんでした。 – Uueerdo

+0

関連する行を見つけ出す' SELECT'クエリに変更し、 'EXPLAIN'を – Barmar

+0

2つのテーブルのスキーマとは何ですか?なぜ1つのIDに先行ゼロがあり、それに関連するものはゼロでないのですか? –

答えて

1

変更、現在の構文(可能ならば)最後の行は、日付関数の代わりのように使用する必要があります

SET SQL_SAFE_UPDATES=0; 

UPDATE `db`.`table_av` av, 
    JOIN `db`.`table_ut` ut 
     ON TRIM(LEADING '0' FROM av.id) = ut.id 
      AND av.veh = ut.veh 
      AND av.date LIKE CONCAT('%', ut.Year); 
    SET av.UnitType = ut.unittype 

を使用して参加します。さらに、2つの列が各テーブルの 互換型であることを確認してください(つまり、TIMESTAMP、またはintまたはvarcharで少なくとも4桁の年)。

+0

ありがとうございました。セットがジョインの上にあるためエラーが発生しましたが、ポジションを切り替えると機能しています。 – user2817749

+1

私は答えに加えた変更のように? –

+0

これはパフォーマンスに何らかの影響を与えるとは考えにくいです。私は、MySQLは単にある構文から別の構文に変換すると思う。 – Barmar

関連する問題