4

クエリでこのSQL空間インデックスヒントをどこで/どのように指定するかわかりません:-

SELECT Whatever
FROM Table1 a
    INNER JOIN Table2 b ON a.Id = b.Id
WHERE @SomeBoundingBox.STIntersects(b.SomeGeographyShape) = 1

クエリを実行すると、空間ヒントが使用されていません。はい、最新バージョンのSQL Server 2008 r2(v 10.5.1600.1)を使用しています。

そこで、ヒントを強制してクエリ速度を比較するために、私は試してみました...

SELECT Whatever
FROM Table1 a
    INNER JOIN Table2 b WITH (INDEX(MySpatialIndex)) ON a.Id = b.Id
WHERE @SomeBoundingBox.STIntersects(b.SomeGeographyShape) = 1

それはうまくいきましたが、パフォーマンスは本当に悪かったです。ヒントを使用して結合を実行しようとしていたのではないかと思っていましたa.Id = b.Id(ヒントを使用したくないためです)。

助言がありますか?

アップデート:

クエリプランを追加しました。コストの大部分は、2つのテーブル間の結合です。Filter(where句)は2番目にコストのかかる部分を占めます。

代替テキスト

4

2 に答える 2

1

ヒントを強制しないことをお勧めします。SQL Serverが実行プランを選択しているのには理由があります。ご想像のとおり、別のプランを強制すると、ほとんどの場合、パフォーマンスが低下します。

代わりに、インデックスとクエリ実行プランを詳細に調べ、実行プランの各ノード(特に相対コストが高いノード)をたどり、SQLServerで実行したいことを実行できるかどうかを確認します。強制せずにMySpatialIndexインデックスを取得します。通常、実行プランが希望どおりに機能する原因となるのは、インデックスから欠落しているフィールドだけです...強制する必要はありません。

于 2010-11-15T01:47:49.580 に答える
0

なぜ問題はON条項にあると思いますか?テーブルWHEREに適用された部分で関数を使用しています。そのため、テーブルをフルスキャンし、テーブルを部分的にスキャンします。bab

于 2010-11-15T01:49:44.763 に答える