Уловка, чтобы сделать SQL-запрос LIKE или = в зависимости от переменной bind? - PullRequest
0 голосов
/ 21 февраля 2011

прямо сейчас у меня есть следующий запрос в хранимой процедуре.

select * from table A where A.indexed_char_column LIKE :param1

: param1 может содержать любой тип подстановочных знаков, но иногда это может и не быть.«% abcdef%» обычно требует полного сканирования таблицы, а «abcdef» должен выполнить сканирование диапазона индекса.Поэтому я бы хотел, чтобы механизм SQL использовал два разных плана выполнения в зависимости от этого параметра.

Можно ли как-нибудь сделать это возможным?Я хотел бы получить ответы как для Oracle 11gr2, так и для SQL Server 2005. Я думаю, если бы я мог включить в запрос фиктивный параметр (например, комментарий или что-то в этом роде), который заставляет механизм SQL думать о двух запросах, которые фактически идентичныне быть идентичным.

select /* use table scan */ * from table A where A.indexed_char_column LIKE :param1

select /* use index */ * from table A where A.indexed_char_column LIKE :param1

Но я не знаю, как это сделать?Любые другие предложения?Должен ли я просто использовать две хранимые процедуры?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2011

Если у вас есть возможность изменить подсказку / комментарий в зависимости от того, содержит ли значение подстановочные знаки или нет, почему бы не изменить вместо него оператор ?

if (contains wildcards) then
    select * from table A where A.indexed_char_column LIKE :param1;
else
    select * from table A where A.indexed_char_column = :param1;
1 голос
/ 21 февраля 2011

В SQL Server .... Если вы провели какое-то тестирование и уверены, что вам будет полезно иметь два плана выполнения, то предложение Джоэла о OPTION (RECOMPILE) - это то, что вам нужно.

Однако, если индекс узкий и избирательный, то, вероятно, лучше использовать индекс для запроса LIKE, а также для запроса equals.

И наоборот, если индекс не очень избирателен, то запрос равенства, вероятно, должен идти прямо к просмотру таблицы.

1 голос
/ 21 февраля 2011

Для сервера sql вы можете использовать табличные подсказки или подсказки запроса (см. OPTION RECOMPILE).Для любого из них вы, вероятно, должны быть достаточно умны, чтобы знать, какие подсказки включить в запрос самостоятельно.Я не уверен, что такое эквивалент оракула. ​​

...