私は奇妙なものを持っています。それが私の構文 (単純に見える) なのか、バグなのか (またはサポートされていないだけなのか) はわかりません。
動作するが不必要に遅いクエリは次のとおりです。
UPDATE table1
SET table1column1 =
(SELECT COUNT(DISTINCT table2column1) FROM table2view WHERE table2column1 <= (SELECT table2column1 FROM table2 WHERE table2.id = table1.id) )
/
(SELECT COUNT(DISTINCT table2column1) FROM table2)
+ (SELECT COUNT(DISTINCT table2column2) FROM table2view WHERE table2column2 <= (SELECT table2column2 FROM table2 WHERE table2.id = table1.id) )
/
(SELECT COUNT(DISTINCT table2column2) FROM table2)
+ (SELECT COUNT(DISTINCT table2column3) FROM table2view WHERE table2column3 <= (SELECT table2column3 FROM table2 WHERE table2.id = table1.id) )
/ (SELECT COUNT(DISTINCT table2column3) FROM table2);
これは、重複を除いた 3 つのパーセンタイル (table2column1、table2column2、および table2column3) の合計です。
ここが変なところです。これがサブクエリで動作するようにするには、ビューを使用する必要があります。そうしないと、 の最初の行WHERE
のみが表示され、残りの行が に設定されます。の正確な複製です。ええ、奇妙です。UPDATE
table1
table1column1
0
table2view
table2
を使用しない場合はDISTINCT
、ビューなしで実行できます。それは理にかなっていますか? 注:DISTINCT
重複が多いため、持っている必要があります。
ビューからのみ作成しようとしましSELECT
たが、速度がさらに低下しました。
問題の内容と、このクエリを作り直してそれほど時間がかからないようにする最善の方法を知っている人はいますか? にTRIGGER
あり、更新されたデータはかなりオンデマンドです。
よろしくお願いします!
詳細
phpMyAdmin のコマンド ラインで速度をテストしています。
ビューが多く、実際に使用するテーブルが少ないほど、速度が低下するため、ビューが劣化していると確信しています。
なしDISTINCT
で行うと、超高速です。
ビューでのみ機能しますか?
のコピーをセットアップしましたtable2
。最初に、ビューをコピーに置き換えて元のクエリを実行しようとしました。立ち入り禁止。
ビューの代わりにコピーを使用して、以下のクエリを実行しようとしました。立ち入り禁止。
これらの定数の導入により、私がやろうとしていることをよりよく示すことができれば幸いです。
SET @table2column1_distinct_count = (SELECT COUNT(DISTINCT table2column1) FROM table2);
SET @table2column2_distinct_count = (SELECT COUNT(DISTINCT table2column2) FROM table2);
SET @table2column3_distinct_count = (SELECT COUNT(DISTINCT table2column3) FROM table2);
UPDATE table1, table2
SET table1.table1column1 = (SELECT COUNT(DISTINCT table2column1) FROM table2view WHERE table2column1 <= table2.table2column1) / @table2column1_distinct_count
+ (SELECT COUNT(DISTINCT table2column2) FROM table2view WHERE table2column2 <= table2.table2column2) / @table2column2_distinct_count
+ (SELECT COUNT(DISTINCT table2column3) FROM table2view WHERE table2column3 <= table2.table2column3) / @table2column3_distinct_count
WHERE table1.id = table2.id;
繰り返しますtable2
が、の代わりに使用するtable2view
と、最初の行のみが適切に更新され、他のすべての行の table1.table1column1 = が設定されます0
。
算数
= を、、およびbytable1.table1column1
のパーセンタイルの合計に設定しようとしています。table2column1
table2column2
table2column3
id
( a table2columnX
<= の個別の値を現在の までカウントする ) / (個別の s のtable2columnX
合計数)によってパーセンタイルを計算します。table2columnX
DISTINCT
過剰な重複を取り除くために使用します。
意見
これがビューのSELECT
です。これは役に立ちますか?
CREATE VIEW myTable.table2view AS SELECT
table2.table2column1 AS table2column1,
table2.table2column2 AS table2column2,
table2.table2column2 AS table2column3,
FROM table2
GROUP BY table2.id;
GROUP BY
この作業を行うビューの中に何か特別なものがありますかSELECT
(それは私には見えません)?