2016-11-17 11 views
-1

のパフォーマンスの問題につながる可能性があり、私のSQLクエリを確認してください:私は2つのテーブルを持っている巨大なデータベース

Customerテーブル:

  • ID(主キー)
  • をEMAIL_ID
  • をROLE_ID
  • individual_id(外部キー)。

個々のテーブル:

  • は、私はそのemail_idrole_iddob同じであるすべての重複レコードを見つけたい
  • DOB

をindividual_id。

私が参加して、グループとして以下の節で、簡単なを使用してクエリを作成しました:

SELECT c.email_id, c.role_id, i.dob 
FROM CUSTOMER c 
JOIN INDIVIDUAL i on c.individual_id = i.individual_id 
GROUP BY c.email_id, c.role_id, i.dob 
Having count(*) >= 2 

これは、テスト・データベース(SQL Server 2012の)上で正常に動作しているが、私は知りたいのですが、それは私のクエリは希望し運用データベースにパフォーマンス上の問題があり(約500万)、これを行うにはより良い方法がありますか?

+2

あなたのクエリには、 'GROUP BY'節がありません。より良いクエリを提案することはできませんが、結合列にインデックスを含めることをお勧めします。 –

+0

@TimBiegeleisen、ありがとう、私は誤植でした。 –

+0

どのdbmsを使用していますか?パフォーマンスの問題はしばしば製品固有です。 – jarlh

答えて

0

パフォーマンスの問題は、DBサイズに基づいており、データの変更がdbに反映されています。それは他の操作によりデッドロックされて読み取りを防止することができます

  set statistics time on -- show you exec time 

      SELECT top 10 c.email_id,c.role_id,i.dob 
      FROM CUSTOMER c (nolock) 
      JOIN INDIVIDUAL i (nolock) on c.individual_id=i.individual_id 
      GROUP BY c.email_id,c.role_id,i.dob 
      Having count(*) >=2 

使用NOLOCK、

まず、実行時間を確認するために、トップ10のクエリを試してみてください。それ以上の行を試すことができます。

また、データテンポラリテーブルをインポートすると、重複したデータを見つけることができます。

+0

dbmsが指定されていない質問に対する製品固有の回答。どちらのdbmsですか? – jarlh

+0

はSQL Server用です。 –

+1

'NOLOCK'を使用すると、読み込みが不正になる可能性があることに注意してください。これは、オプションであるかどうかを判断するために、ユーザーが結果を使用して何を行うつもりかによって異なります。 – Jens

0
;WITH numbered 
    AS (SELECT ROW_NUMBER() 
        OVER(PARTITION BY c.email_id, c.role_id, i.dob 
         ORDER BY c.email_id, c.role_id, i.dob) AS _dupe_num, 
       c.email_id, 
       c.role_id, 
       i.dob 
     FROM customer c 
       INNER JOIN individual i 
         ON c.individual_id = i.individual_id) 

SELECT c.email_id, c.role_id, i.dob -- You can add a DISTINCT or GROUP here if required. 
FROM numbered 
WHERE _dupe_num > 1; 

これは同じ問題に対する別のアプローチです。実行計画を比較することができます。しかし、私はあなたが掲示したクエリで実際の問題は表示されません

これらのテーブルに対して、5Mを超えるレコードでテスト環境を読み込むことを検討しましたか?それらを生成することはかなり容易であるはずです。いくつかのテスト値が必要な場合は、AdventureWorksのアイテムをいつでも取得して連結することができます。

関連する問題