私は奇妙なものを持っています。それが私の構文 (単純に見える) なのか、バグなのか (またはサポートされていないだけなのか) はわかりません。
動作するが不必要に遅いクエリは次のとおりです。
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のみが表示され、残りの行が に設定されます。の正確な複製です。ええ、奇妙です。UPDATEtable1table1column10table2viewtable2
を使用しない場合は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のパーセンタイルの合計に設定しようとしています。table2column1table2column2table2column3id
( 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(それは私には見えません)?