0

2つのテーブルitemとitems_sellersがあり、各アイテムは複数のセラーで利用できます。

ここで、別の手段からItemId、sellerIdのマッピングを取得します。ここで、これらすべてのアイテムの詳細が必要です。少なくとも5000のkey(sellerId)value(itemId)ペアを取得します。このマップを使用して、これら2つのテーブルから詳細を取得する必要があります。

結果を取得するにはここで私は以下のクエリを使用しました:

SELECT 
    table1.column1, 
    table1.column2, 
    table1.column3, 
    table2.column1, 
    table2.column2 
FROM 
    item as table1 
        INNER JOIN ( 
            select 
                key1 as ITEMID, 
                value1 as SELLERID 
            UNION ALL 
            select 
                key2, 
                value2  
            UNION ALL 
            select 
                key3 , 
                value3  
            UNION ALL 
            select 
                key4 , 
                value4 
            UNION ALL
            // ....5000 key value
            pairs
            ) as KEY_VALUE 
            ON table1.item_id = KEY_VALUE.ITEMID 
        INNER JOIN 
            item_sellers as table2 
            ON table1.item_id = table2.item_id 
            AND table2.seller_id = KEY_VALUE.SELLERID
WHERE table1.active = 1

このクエリは、3000〜4000のUNION ALLステートメントでは完全に正常に実行されますが、5000以上のキーと値のペア(5000以上のUNION ALLステートメント)ではエラー、つまりメモリ不足例外/クエリタイムアウト例外が発生します。

このクエリに問題はありますか?もしそうなら、それにいくつかの光を通してお願いしますか?

このクエリを最適化する方法はありますか?

PS:このクエリに5000個のキーと値のペアをすべて入力すると、クエリ文字は209950文字になりますか?クエリの文字数に制限はありますか?

4

2 に答える 2

0

一時テーブルを作成して挿入します。

create temporary table mytable (itemid integer, sellerid integer);
insert into mytable (itemid, sellerid) values
(1,2),(2,10)
;
SELECT 
    table1.column1, 
    table1.column2, 
    table1.column3, 
    table2.column1, 
    table2.column2 
FROM 
    item as table1 
        INNER JOIN mytable as KEY_VALUE 
            ON table1.item_id = KEY_VALUE.ITEMID 
        INNER JOIN 
            item_sellers as table2 
            ON table1.item_id = table2.item_id 
            AND table2.seller_id = KEY_VALUE.SELLERID
WHERE table1.active = 1
;
drop table mytable;

SQL 文字列の長さははるかに短くなります。最後にドロップします。

于 2012-09-20T12:53:08.440 に答える
0

サブクエリにfrom句がないようです。

select 
    key1 as ITEMID, 
    value1 as SELLERID 
UNION ALL 
select 
    key2, 
    value2  
UNION ALL 
// and so on...

それはどのように機能していますか?データベースは(驚くべきことに)これを乗り越えて、データのセットに対して単純にデカルトを実行しているように見えます。これにより、メモリが処理できないほど急増しています。

試してみてください:

select 
    key1 as ITEMID, 
    value1 as SELLERID 
from
    yourTableName
UNION ALL 
select 
    key2, 
    value2
from
    yourTableName
Union all // etc etc

そうは言っても、必要な行を取得するために where 句を含むサブクエリに参加するか、それらの間のルックアップ テーブルを使用してみませんか?

于 2012-09-20T12:18:10.407 に答える