約90万レコードのテーブルがあります。大きなデータを持つクエリを実行しようとしています (注: クエリは大きいです)
like <some query> and agt.item in (',productRange,.......<very large data, having around 2 lakh chars>)
これにより、クエリは構文エラーを言って失敗しています。ただし、クエリ内のアイテム数が少ないと実行されます。このような問題の対処法を教えてください。
ほとんどのDBMSは、大きなパラメータリストでひどく動作します。したがって、「IN」リストが大きい場合、たとえば
SELECT *
FROM foo
WHERE bar IN ('1','2','3','4'...,'500000')
選択するすべての値を含むテーブルを作成し、2つのテーブルを結合する場合と比較して、パフォーマンスが大幅に低下します。
CREATE TABLE baz (
bar VARCHAR
)
INSERT INTO baz(bar) VALUES ('1');
INSERT INTO baz(bar) VALUES ('2');
INSERT INTO baz(bar) VALUES ('3');
INSERT INTO baz(bar) VALUES ('4');
...
INSERT INTO baz(bar) VALUES ('500000');
SELECT *
FROM foo,
baz
WHERE foo.bar = baz.bar
したがって、MySQLにはテーブル値のパラメーターがないため、クエリにデータを入力するのではなく、一時テーブルにデータを格納するのが最善の策です。また、フィルタリングする値のインデックスが必要になることを忘れないでください(agt .itemあなたの場合)。
句内の valuesitemsitems がIN
別の以前のクエリから取得された場合は、サブクエリを使用できます。
現在のコードが次のようになっていると仮定します。
SELECT some_field FROM table1 WHERE condition1;
-- returns a long list and/or large strings
SELECT * FROM table2 WHERE condition2 AND item IN ( @records_from_previous_query );
次のように書き換えることができます。
SELECT *
FROM table2
JOIN table1 ON (table1.some_field = table2.item AND condition1)
WHERE condition2