0

約90万レコードのテーブルがあります。大きなデータを持つクエリを実行しようとしています (注: クエリは大きいです)

like <some query> and agt.item in (',productRange,.......<very large data, having around 2 lakh chars>)

これにより、クエリは構文エラーを言って失敗しています。ただし、クエリ内のアイテム数が少ないと実行されます。このような問題の対処法を教えてください。

4

2 に答える 2

3

ほとんどの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あなたの場合)。

于 2013-02-27T10:23:19.593 に答える
0

句内の 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
于 2013-02-27T14:47:00.777 に答える