可以说,我有一个问题,
SELECT * FROM MyTable WHERE MyParam = 0 OR MyColumn = MyParam
这里 MyParam 是参数和可选的。因此,它只检查MyColumn = MyParam
MyParam 是否不为 0。但我们的 DBA 说 OR 会使其变慢,而 db 会受到影响。另一种选择是,
IF MyParam = 0
SELECT * FROM MyTable WHERE MyColumn = MyParam
这种方法的问题是我们有很多可选参数。所以,我们的查询变得非常非常大。另一种选择是 CASE。
所以你们的建议。我一般说的是Oracle还是SQL Server。
在 sql 服务器中:
一种选择是动态 sql,另一种是
option (recompile)
.使用
option (recompile)
:动态sql示例:
参考:
我刚刚在我的环境中针对 AdventureWorks 进行了测试,发现 CASE 方法效果最好。使用 OR 方法使引擎使用聚集索引,而 CASE 语句让它使用非聚集索引。
所以你的查询可能看起来像这样。
但是,如果您说有很多参数,那么无论如何您都不太可能使用索引。所以你可能会不管它。我的测试是针对一个简单的查询。
这有几个缺陷:
NOT EXISTS
,永远不要使用NOT IN
,避免这个,避免那个,你必须不惜一切代价做XYZ,不惜一切代价避免OR
”等等。这些事情的问题在于,对于特定 RDBMS 的特定版本,它们可能在某个时间点是正确的,并且通常对于该特定 RDBMS 版本的特定参数设置子集是正确的。所以,在这种情况下你应该做什么:创建一个测试用例,然后做一个基准测试。没有什么可以帮助你。
对于您的特定情况:
做一个基准;进行测试;评估数据库执行统计等。那么你肯定会知道的。