1

users" " と " "の 2 つのテーブルがありtemp_usersます。現在、「users」テーブルには数百万のデータが含まれており、「temp_users」には数千のデータが含まれています。どちらのテーブルにも同じ種類の情報が含まれていますが、一部のレコードが欠落している場合があります。

したがって、要件は、これら 2 つのテーブルを比較し、それらの違いを示すことです。比較クエリを作成しましたが、実行に 5 分以上かかる膨大な量のデータ (数百万) が原因である可能性があります。なにか提案を??

私が書いた比較クエリは以下のとおりです。

SELECT 
   id,
   dateTime,
   phone,
   address 
FROM 
   tempUsers t1 
WHERE NOT EXISTS (
   SELECT id,dateTime 
   FROM users t2 
   WHERE t1.id = t2.id 
   OR t1.dateTime=t2.dateTime
)

システムは JSP と MySQL で開発され、Apache Tomcat にデプロイされます。

ありがとう、

4

1 に答える 1

1

2つの観察:

  1. where句に「OR」を含めるつもりでしたか?それは「AND」であるべきではありませんか?'OR'は、クエリオプティマイザが'OR'ロジックのためにインデックスを利用できない場合、クエリの実行速度を大幅に低下させる可能性があります。
  2. JOINではなく副選択を使用しているため、外部選択によって返されるすべての行に対して副選択を実行する必要がある「相関サブクエリ」と呼ばれる重大な問題が発生する可能性もあります。

上記の2つの問題(OR条件との相関サブクエリ)が問題の原因である可能性があります。

代わりに、次のクエリを試してください。

SELECT 
   t1.id,
   t1.dateTime,
   t1.phone,
   t1.address 
FROM 
   tempUsers t1 
LEFT OUTER JOIN
   users t2
ON
   t1.id = t2.id 
   AND t1.dateTime=t2.dateTime
WHERE
   t2.id IS NULL

上記のクエリは、IDとDATETIMEを使用して「LEFTOUTER JOIN」を実行し、2つのテーブルを結合してから、USERSに行がないもののみに結果をフィルタリングします。これにより、必要なものが返されます。

'OR'条件が本当に必要なロジックである場合は、'ON'句で変更しますが、クエリの速度に悪影響を与える可能性があることに注意してください。

速度を上げるには:「id」、「dateTime」、またはその両方にインデックスがあることを確認します。

お役に立てれば!

ジョン..。

于 2012-11-07T15:37:03.620 に答える