2017-02-16 15 views
0

ジオメトリ列を持つSQL Server 2012データベーステーブルがあり、このテーブルには単一のSpatialインデックスがあります。SQL Serverインデックスヒント用の文字列変数の使用方法?

いくつかの地理空間分析(交差/包含)を実行するためのSQLクエリがあり、空間インデックスを使用するよう強制するとクエリ実行のパフォーマンスが大きく異なります(this answerはサイズに依存します)。私が使用するテーブル)。私のテーブルはポリスの1-2Kとポイントの1-2Kです。

したがって、私はS7_idxが私の空間インデックスの名前であるSQLクエリでWITH (INDEX(S7_idx))を使用します。

ただし、このSQLクエリを同じテーブルを持つ別のデータベースで実行すると、Spatialインデックスに別の名前が付いている可能性があります。したがって、私はインデックス名をハードコードしたくありません。テーブルにSpatialインデックスが1つしかないことを確認できるので、インデックス値を動的に取得できれば素晴らしいと思います。

select name from sys.indexes where object_id = (select object_id from sys.objects where name = 'TableName') AND type_desc = 'SPATIAL'

結果:

name S7_idx

グレート。今度は、WITHステートメントでハードコードされたインデックス名の代わりにこの値を使用します。これはどうすればいいですか?

WITH (INDEX(...))ステートメントの中に動的SQL(EXECUTE sp_executesql)を使用することはできないと思います。

答えて

1

よく使用されているDBAに提案していない限り、hintsを使用することはお勧めできません。 statisticsをデータに保つことは、非常に多くの問題を解決します。あなたが使用hintについて確実な場合

は、その後、あなたは、動的クエリを使用する必要が

DECLARE @sql VARCHAR(8000)= '' 

SET @sql = 'SELECT * 
FROM TableName 
WITH (INDEX(' 
      + (SELECT NAME 
       FROM sys.indexes 
       WHERE object_id = (SELECT object_id 
            FROM sys.objects 
            WHERE NAME = 'TableName') 
        AND type_desc = 'SPATIAL') 
      + '))' 

PRINT @sql 

EXEC(@sql) 

注:クエリ上記はただ、一つだけindextype_desc = 'SPATIAL'

+0

おかげであり、あなたのテーブルに考えて私が必要としたもの。これを行うための他の方法はありますか?私はストアドプロシージャの一部であり、SQLコードで文字列の束を連結することは嫌い、かなり毛深いクエリを持っています... –

関連する問題