2017-02-16 3 views
0

У меня есть таблица базы данных SQL Server 2012 с столбцами геометрии, и в этой таблице есть один пространственный индекс.Как использовать строковую переменную для подсказки индекса SQL Server?

У меня есть SQL-запрос, который я запускаю для выполнения геопространственного анализа (пересекается/содержит), а производительность выполнения запроса сильно отличается при форсировании использования пространственного индекса и не (который согласно this answer зависит от размера таблицу, которую я использую). Мои таблицы составляют всего 1-2 тыс. Полисов и 1-2 тыс. Точек.

Итак, я использую WITH (INDEX(S7_idx)) в SQL-запросе, где S7_idx - это имя моего Пространственного индекса.

Однако, когда я буду выполнять этот SQL-запрос в другой базе данных с той же таблицей, индекс Spatial может иметь другое имя. Поэтому я не хочу жестко закодировать имя индекса. Я думаю, было бы здорово, если бы я мог получить динамическое значение индекса, так как я могу быть уверен, что в таблице есть только один пространственный индекс.

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. Как мне это сделать?

Я думаю, что я не могу использовать динамический SQL (с EXECUTE sp_executesql) внутри своего оператора WITH (INDEX(...)).

ответ

1

Использование hints никогда не рекомендуется, если у вас нет хорошо опытного DBA. Удержание 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) 

Примечание: Выше запроса рассматривается в таблице есть только один index с type_desc = 'SPATIAL'

+0

Спасибо, просто что мне нужно. Есть ли другой способ сделать это? У меня довольно волосатый запрос, который является частью хранимой процедуры, и я ненавижу конкатенировать связку строк с кодом SQL ... –

Смежные вопросы