それぞれ約 1 億レコードの 2 つの大規模なテーブルがあり、2 つの間で内部結合を実行する必要がありました。さて、どちらのテーブルも非常に単純です。説明は次のとおりです。
BioEntity テーブル:
- BioEntityId (int)
- 名前 (nvarchar 4000、これはやり過ぎです)
- TypeId (整数)
EGM テーブル (実際には、一括インポート操作の結果である補助テーブル):
- EMGId (整数)
- ID (整数)
- 名前 (nvarchar 4000、これはやり過ぎです)
- TypeId (整数)
- LastModified (日付)
BioEntityId を EGM テーブルにある PId に関連付けるために、一致する名前を取得する必要があります。もともと、私は単一の内部結合ですべてを実行しようとしましたが、クエリに時間がかかりすぎているように見え、データベースのログファイル (単純な回復モード) が使用可能なすべてのディスク領域 (200 GB をわずかに超える) をなんとか使い果たしました。データベースが 18 GB を占有する場合)、クエリは 2 日間待機した後に失敗します。ログが大きくならないように管理できましたが (現在は 33 MB しかありません)、クエリは現在 6 日間ノンストップで実行されており、すぐに停止するようには見えません。
かなりまともなコンピューター (4GB RAM、Core 2 Duo (E8400) 3GHz、Windows Server 2008、SQL Server 2008) で実行していますが、コンピューターが 30 秒ごとに (ギブ オア テイク) 時々ジャムすることに気付きました。数秒。これにより、他の用途に使用することが非常に難しくなり、本当に神経質になっています.
さて、ここにクエリがあります:
SELECT EGM.Name, BioEntity.BioEntityId INTO AUX
FROM EGM INNER JOIN BioEntity
ON EGM.name LIKE BioEntity.Name AND EGM.TypeId = BioEntity.TypeId
いくつかのインデックスを手動でセットアップしました。EGM と BioEntity の両方に、TypeId と Name を含むクラスター化されていないカバリング インデックスがありました。ただし、クエリは 5 日間実行され、いずれも終了しませんでした。そのため、データベース チューニング アドバイザを実行して動作を確認してみました。古いインデックスを削除し、代わりに統計と2つのクラスター化されたインデックスを作成することを提案しました(各テーブルに1つずつ、奇妙に感じるTypeIdを含むだけです-または単にばかげています-しかし、とにかく試してみました)。
現在6日間実行されていますが、どうすればよいかまだわかりません...何かアイデアはありますか? これをより速く (または、少なくとも有限に) するにはどうすればよいですか?
更新: - OK、クエリをキャンセルし、サーバーを再起動して OS を再起動しました - 具体的には、nvarchar フィールドをはるかに小さいサイズにトリミングし、「like」を交換して、提案された変更を加えてワークフローを再実行しています「=」の場合。これには少なくとも 2 時間かかるので、後でさらに更新を投稿します。
更新 2 (1PM GMT 時間、18/11/09): - 推定実行計画では、テーブル スキャンに関する 67% のコストとそれに続く 33% のハッシュ マッチが明らかになりました。次は 0% 並列処理 (これは奇妙ではありませんか? 推定実行計画を使用するのはこれが初めてですが、この特定の事実に眉をひそめただけです)、0% ハッシュ一致、さらに 0% 並列処理、0% トップ、0 % table insert と最後に別の 0% select into です。予想どおり、インデックスはくだらないようです。そのため、手動でインデックスを作成し、提案されたくだらないインデックスを破棄します。