何百万もの行を含む大きなテーブル(TokenFrequency)があります。次のように構成されたTokenFrequencyテーブル:
表-TokenFrequency
- id-int、主キー
- ソース-int、外部キー
- トークン-char
- count-int
私の目標は、2つのソースに同じトークンが含まれているすべての行を選択することです。たとえば、私のテーブルが次のようになっている場合:
id --- source --- token --- count
1 ------ 1 --------- dog ------- 1
2 ------ 2 --- ------ cat -------- 2
3 ------ 3 --------- cat -------- 2
4 ------ 4---------豚--------
55 ------5---------動物園-------16
--- ---5---------猫--------17
------5---------豚--------1
SQLクエリでソース1、ソース2、およびカウントの合計を取得したいと思います。例えば:
source1 ---source2---トークン---カウント ----
2----------- 3 --------- cat -------- 4-
--- 2 ----------- 5 --------- cat -------- 3
---- 3 ---------- --5---------猫--------3
---- 4 -----------5---------豚- ------ 6
次のようなクエリがあります。
SELECT F.source AS source1, S.source AS source2, F.token,
(F.count + S.count) AS sum
FROM TokenFrequency F
INNER JOIN TokenFrequency S ON F.token = S.token
WHERE F.source <> S.source
このクエリは正常に機能しますが、私が抱えている問題は次のとおりです。
- 数百万行のTokenFrequencyテーブルがあるため、この結果を取得するには、より高速な代替手段が必要です。
- 私が持っている現在のクエリは重複を与えています。たとえば、その選択:
source1 = 2、source2 = 3、token = cat、count = 4
source1 = 3、source2 = 2、token = cat、count = 4
これはそれほど問題ではありませんが、方法がある場合それらを排除し、次に速度の増加を得るには、それは非常に便利です
私が抱えている主な問題は、現在のクエリでのクエリの速度であり、完了するまでに数時間かかります。テーブル上の内部結合自体が問題であると私は信じています。TokenFrequencyテーブルの1つのインスタンスを使用するだけで、内部結合を削除して同様の結果を得る方法が必要だと確信しています。私が言及した2番目の問題も、クエリの速度の向上を促進する可能性があります。
このクエリを再構築して、同じ結果をより速く、より効率的に提供する方法が必要です。
ありがとう。