0

私はこの問題の解決に固執しており、新しい新鮮なアイデアを聞くのはいいことです:)

私はこのような何十億ものレコードのテーブルを持っています

TAB_IX (int) (PK)
TAB_ID (int) (PK)
PR_ID (int) (PK)
SP_ID (int) (PK)(IX)
....

以前はこのようなデータを取得していました

SELECT TAB_ID, COUNT (SP_ID) as HITS FROM table t
INNER JOIN table_sp s on t.SP_ID = s.ID
WHERE TAB_IX = @tab_inx 
AND PR_ID IN (SELECT PR_ID FROM @pr_id)
AND s.NAME IN (SELECT DISTINCT NAME FROM @sp_names)  
GROUP BY TAB_ID

table_spは、10kのレコードを持つ小さなテーブルです(ID(int)(PK)、NAME(varchar)(IX))

@pr_idと@sp_namesは、1つの列を持つテーブル変数です

クエリは非常に高速でした(約2〜3秒)。PR_IDが異なり、TAB_IX、TAB_ID、SP_IDが同じレコードを区別したくありません。

たとえば、次のようなレコード

TAB_IX - TAB_ID - PR_ID - SP_ID
1      - 700    - 1     - 100
1      - 700    - 2     - 100

1つと見なす必要があります。

唯一の方法は、追加のGROUPBYを実行しているようです

このような

SELECT TAB_ID, COUNT(SP_ID) as HITS FROM (
SELECT TAB_ID, SP_ID, COUNT (PR_ID) FROM table 
WHERE TAB_IX = @tab_inx 
AND PR_ID in (select PR_ID from @pr_id)
AND s.NAME IN (SELECT DISTINCT NAME FROM @sp_names)
GROUP BY TAB_ID, SP_ID) AS DUMMY
GROUP BY TAB_ID

この追加のGROUPBY操作を追加すると非常に苦痛に見えるため、問題はパフォーマンスです。

クエリを改善するためのアイデアはありますか?

前もって感謝します :)

4

1 に答える 1

1

元のクエリでカウントしたいことを指定するDISTINCT SP_IDとうまくいくと思います

SELECT TAB_ID, COUNT (DISTINCT SP_ID) as HITS FROM table t
INNER JOIN table_sp s on t.SP_ID = s.ID
WHERE TAB_IX = @tab_inx 
AND PR_ID IN (SELECT PR_ID FROM @pr_id)
AND s.NAME IN (SELECT DISTINCT NAME FROM @sp_names)  
GROUP BY TAB_ID
于 2013-02-20T09:45:04.857 に答える