我有一个类似这样的存储过程(伪代码)
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
它会在预期参数内再次运行(40,000 多条记录需要 15 秒左右)。这是 SQL Server 2005 的问题。我的问题的要点是 SQL Server 特有的这个特殊“功能”,或者这是 RDBMS 中的一个常见功能,一般来说:
- 随着数据的增长,运行良好两年的查询将停止工作。
- “新”执行计划破坏了数据库服务器执行查询的能力,即使逻辑上等效的替代方案运行得很好?
这似乎是对 SQL Server 的咆哮,我想在某种程度上确实如此,但我真的很想知道其他人是否在使用 Oracle、DB2 或任何其他 RDBMS 时体验过这种现实。虽然我和别人有过一些经验,但是我只在SQL Server上看到过这种体积和复杂度,所以我很好奇其他拥有大型复杂数据库的人是否在其他产品中也有类似的经验。