【发布时间】:2017-07-27 19:03:43
【问题描述】:
我有一个对多个可选参数执行查询的用例。在查询执行期间可能会或可能不会传递一些参数。
到目前为止,我提出了两种不同的解决方案。我需要一些帮助来确定哪个性能更好?还是有其他替代方案?
user_passed_variable IS NULL OR SOME_COLUMN = user_passed_variable
NVL(SOME_COLUMN, ’null’) = NVL(user_passed_variable, NVL(SOME_COLUMN, ’null’))
注意:该列也可以包含空值。
【问题讨论】:
-
这里不够详细,但是将函数应用于表列,如 NVL(SOME_COLUMN) 可能会限制优化器。在这种情况下,您可以创建基于函数的索引。由于我们不知道您的表格是什么样的,您有哪些索引等,无法提供太多帮助
-
将两个条件用
OR分隔会妨碍在SOME_COLUMN上使用索引。函数调用也会如此(目前尚不清楚基于函数的索引将如何提供帮助,因为NVL(SOME_COLUMN, 'null')也隐藏在另一个NVL()调用中)。可能存在允许使用索引的解决方案。例如,如果我想从EMP中选择行,其中EMPNO = <user input>或<user input> is NULL:select * from EMP where <user input> is null UNION ALL select * from EMP where EMPNO = <user input> -
在本例中,如果用户输入是
NULL,那么UNION ALL的第一个成员会检索所有内容,而第二个成员会立即被识别为空。如果输入不是NULL,则第一个成员立即被识别为空,第二个成员可以利用EMPNO上的索引。
标签: sql oracle conditional-statements where optional