Хранимая процедура Sybase - как мне создать индекс для #table? - PullRequest
3 голосов
/ 04 марта 2011

У меня есть хранимая процедура, которая создает и работает с временным #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.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2011

Я не уверен, как вы получаете эту проблему, возможно, в более старой версии Sybase, однако с версией 12.5.4 я попытался выполнить то же самое, что и вы, но в моем случае оптимизатор правильно предложил использовать индекс создано в хранимой процедуре. Обычно в хранимой процедуре нам не нужно разбивать sql на пакеты, потому что иначе нам бы потребовался отдельный пакет для команды создания таблицы.

В случае, если мы попытаемся создать индекс в том же пакете (не в хранимой процедуре), мы получим ту же ошибку, что указана вами выше, потому что мы пытаемся создать индекс для таблицы, а затем пытаемся использовать его в той же партии. Обычно сервер Sybase компилирует весь пакет за один раз, и, следовательно, проблема. Но что касается хранимых процедур в Sybase 12.5.4, проблем не будет.

0 голосов
/ 21 июля 2011

В документации Sybase говорится, что вы создаете и используете временный индекс в той же хранимой процедуре:

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc20023_1251/html/optimizer/X26029.htm

Я думаю, что для того, чтобы обойти это, вам нужно разделить вашу хранимую процедуру как минимум на две части: одну для создания и заполнения таблицы, затем построить индекс, а затем вторую для выполнения запроса select.

...