У меня есть хранимая процедура, которая выглядит примерно так (псевдокод)
storedprocedure param1, param2, param3, param4
begin
if (param4 = 'Y')
begin
select * from SOME_VIEW order by somecolumn
end
else if (param1 is null)
begin
select * from SOME_VIEW
where (param2 is null or param2 = SOME_VIEW.Somecolumn2)
and (param3 is null or param3 = SOME_VIEW.SomeColumn3)
order by somecolumn
end
else
select somethingcompletelydifferent
end
Все хорошо в течение долгого времени. Внезапно, запрос начал выполняться навсегда, если param4 было 'Y'. Изменение кода на это:
storedprocedure param1, param2, param3, param4
begin
if (param4 = 'Y')
begin
set param2 = null
set param3 = null
end
if (param1 is null)
begin
select * from SOME_VIEW
where (param2 is null or param2 = SOME_VIEW.Somecolumn2)
and (param3 is null or param3 = SOME_VIEW.SomeColumn3)
order by somecolumn
end
else
select somethingcompletelydifferent
И он снова запускается в ожидаемых параметрах (15 секунд или около того для 40 000 записей). Это касается SQL Server 2005. Суть моего вопроса - это особая «особенность», специфичная для SQL Server, или это обычная особенность СУБД:
- Запросы, которые выполнялись в течение двух лет, просто перестают работать по мере роста данных.
- «Новый» план выполнения разрушает способность сервера базы данных выполнять запрос, даже если логически эквивалентная альтернатива работает нормально?
Это может показаться бессмысленным в отношении SQL Server, и я полагаю, что в какой-то степени это так, но я действительно хочу знать, сталкиваются ли другие с такой реальностью с Oracle, DB2 или любой другой RDBMS. Хотя у меня есть некоторый опыт работы с другими, я видел такой объем и сложность только в SQL Server, поэтому мне любопытно, имеют ли опыт работы другие продукты с большими сложными базами данных в других продуктах.