У меня есть хранимая процедура, которая создает и работает с временным #table
Некоторые запросы были бы чрезвычайно оптимизированы, если бы для этого временного #table
был создан индекс.
Однако создание индекса в хранимой процедуре завершается неудачно:
create procedure test1 as
SELECT f1, f2, f3
INTO #table1
FROM main_table
WHERE 1 = 2
-- insert rows into #table1
create index my_idx on #table1 (f1)
SELECT f1, f2, f3 FROM #table1 (index my_idx) WHERE f1 = 11 -- "QUERY X"
Когда я вызываю вышеупомянутое, план запроса для "QUERY X" показывает сканирование таблицы.
Если я простоЗапустите приведенный выше код вне хранимой процедуры, в сообщениях появится следующее предупреждение:
Индекс 'my_idx', указанный в качестве подсказки оптимизатора в предложении FROM таблицы '# table1', не существует.Вместо этого оптимизатор выберет другой индекс.
Эту проблему можно решить при запуске ad-hoc (вне хранимой процедуры), разделив указанный выше код на две партии, добавив «go» после создания индекса:
create index my_idx on #table1 (f1)
go
Теперь в плане запроса «QUERY X» показано использование индекса «my_idx».
QUESTION : как имитировать запуск «создания индекса» вотдельная партия, когда она внутри хранимой процедуры?Я не могу вставить туда "go", как я делаю со специальной копией выше.Обратите внимание, что мне известно о решении «разделить« QUERY X »на отдельную хранимую процедуру», и я ищу решение, которое позволит избежать этого.
PS Если это имеет значение, оно включеноSybase 12 (ASE 12.5.4)
ОБНОВЛЕНИЕ :
Я видел несколько ссылок на "удар по схеме" во время моего поиска в Google, прежде чем задавать вопрос.Но, похоже, в моем случае этого не происходит.
Вы можете создать таблицу, заполнить ее, создать индекс для нее и выбрать значения из нее в той же части, и оптимизатор будет полностью стоитьэто основано на точной информации.Это называется «изменение схемы» и действует с 11.5.1.