SQL Server 2008 R2では、_table1
_に_db1
_があり、_table2
_に_db2
_があります。
両方のテーブルを結合する選択クエリを作成すると、結果の取得が非常に遅くなります。
次のような簡単なクエリ
_SELECT *
FROM db1.dbo.table1 t1
LEFT JOIN db2.dbo.table2 t2 ON t1.k1 = t2.k2
_
時々本当に遅いです。
これがSQL Serverに共通していて、「異なるデータベースの2つのテーブルを結合しない」という「ルールのようにする必要がある」かどうかはわかりません。
その場合...私はフィールドに格納されているそれらのdbバイナリデータの1つを持っていて、メインテーブルサイズを増加させないようにメインdbから分離したいというこの質問に追加します...これのためにdbを分割する方が良いです?
2つの単純なテーブルでテストしましたが、これらの2つのテーブルを結合するのは遅いです。
助けてくれてありがとう。
..数年後に更新... 24-09-18
結合するフィールドのタイプ、サイズ、照合順序が同じであることを確認してください。
例:一部のプロパティはvarchar(255)と別のvarchar(20)です...エンジンはあるタイプを別のタイプにキャストする必要があるため(暗黙の変換が発生します)、場合によってはより高速に実行されます...インデックスの再作成またはdbの変更が発生すると、クエリが完了するまでにかなりの時間がかかったことがわかります。
フィールドタイプをdb/tablesの1つで一致するように変更できない場合は、明示的なキャストを実行して、クエリ速度が向上するかどうかを確認してください。 cast(fieldname as type(size)) = fieldName2)
を使用します
ここにはさまざまな質問がたくさんあるので、個別に見てみましょう。
Q:上記のクエリで同じデータベースの2つのテーブルを結合すると、なぜ遅いのですか?
A:まず、WHERE句を使用していないため、SQL Serverは完全な結果セットを作成し、両方のテーブルをマージする必要があります。データのサブセットのみが必要な場合は、WHERE句を使用して、必要なデータのみを取得することを検討してください。
それが完了したら、LEFT OUTER JOINを使用していることに注意してください。これはSQL Serverに、「table1レコードのすべてがtable2に一致するレコードを持っているわけではない」と伝えます。それが本当であればそれでまったく問題はありませんが、すべてのt1レコードに少なくとも1つのt2レコードがあることがわかっている場合は、代わりにINNER JOINを使用してください。
次に、インデックス作成が始まります。テーブルの幅とフィールドの数によっては、結合に使用しているフィールドにインデックスを追加することができます。これについて良いアドバイスを得るには、実際に使用している実行計画を投稿するのが最善です。
Q:テーブルが同じSQL Serverの異なるデータベースにある場合、何か変更されますか?
A:いいえ、できません。さまざまなデータベースのデフォルトの分離レベルなど、興味深い問題がいくつかありますが、ほとんどの場合、クエリは同じ実行プランと速度を生成する必要があります。
Q:テーブルパーティションを使用してこれを高速化する必要がありますか?
A:データベースパーティションについて説明しましたが、SQL Serverにはそのようなものはありません。テーブルパーティションを意味していると思います。一般的に言えば、いいえ、結合を高速化するためにデータベース設計の変更にジャンプすることはありません。 SQL Serverの実行計画について理解し、データベースの設計を変更するだけで、インデックスなどでは解決できない問題を解決できます。