2

誰かがこれで私を助けることができるかどうか疑問に思っています。私は2つのテーブルを持っています。テーブル A には数百万の行が含まれており、テーブル全体を検索します。テーブル B には約 5 万行が含まれており、再びテーブル全体を検索します。以下のクエリを使用しています。

SELECT t1.ID as [ID], count(*) as [Total]
FROM table1 t1
RIGHT JOIN table2 t2 ON t1.data LIKE '%' + t2.field3 + '%'
AND t1.ID = t2.ID

WHERE t1.ID not LIKE ''
GROUP BY t1.ID, t1.datetime

私が右結合を使用している理由は、私が理解しているように、t2 (私が望む) からすべてのレコードを取得し、t1 からそれらに一致するレコードのみを取得するためです。また、'AND t1.ID = t2.ID' を SELECT ステートメントに追加しました。これにより、クエリが高速化される (t2 の ID と一致しない ID を検索しない) と想定していましたが、これは私の論理が完全に間違っていない限り、RIGHT JOIN。

また、JOIN の背後にあるロジックを説明できれば、table1 のデータ列には多くの「もの」が含まれており、そのどこかに t2.field3 の内容が正確に含まれている必要があります。たとえば、t1.data = '^ABCD^00dasdas ^£ldasl32^XL0005^' と t2.field3 には 'XL0005' が含まれます。

どんな助けでも大歓迎です。

ありがとう

4

3 に答える 3

0

問題は、Like を使用していることです。Like は実際のパフォーマンス キラーです。

クエリを変更しましたが、目的が解決するかどうかを確認してください

SELECT ID,
       COUNT(*)
       (SELECT t.*,
               CHARINDEX(t1.data,t2.field3) PRESENT
          FROM table1 t1
         RIGHT JOIN table2 t2 
            ON t1.ID = t2.ID)TEMP
 WHERE ID <> '' 
   AND PRESENT > 0
 GROUP BY ID, datetime

dataまた、 &field3列にインデックスを配置して
みてください。これを試してください。

于 2013-07-25T08:09:03.403 に答える
0

これは、ID 列にインデックスが付けられていると仮定すると、多少パフォーマンスが向上する可能性があります。

SELECT 
  t1.ID as [ID], count(*) as [Total]
FROM 
  table2 t2
  INNER JOIN table1 t1 ON t2.ID=t1.ID AND t1.ID <> ''
WHERE CHARINDEX(t2.field3, t1.data) > 0
GROUP BY t1.ID, t1.datetime

また、LIKE '%'+Column+'%' や CHARINDEX などの操作では、関連する列のインデックスは使用されないことに注意してください。したがって、特定のアプローチに固執する必要がある場合は、大幅な改善を期待するべきではありません.

于 2013-07-25T07:59:56.623 に答える
0

サブクエリでいくつかのロジックを移動するとどうなりますか

SELECT t1.ID as [ID], count(*) as [Total]
FROM (select t1.ID as [ID]
            ,t1.datetime as [DATETIME]
            ,t1.data as [DATA]
            ,t2.field3 as [FEILD3] table1 t1
             RIGHT JOIN table2 t2 ON t1.ID = t2.ID
      HAVING FIELD2 is not null AND DATA LIKE '%' + FIELD3 + '%') as t1

WHERE t1.ID not LIKE ''
GROUP BY t1.ID, t1.datetime
于 2013-07-25T08:01:37.743 に答える