我有一个用于在多个可选参数上执行查询的用例。在查询执行过程中可能会传递或不传递一些参数。Oracle SQL查询可选参数性能
到目前为止,我已经想出了两种不同的解决方案。我需要一些帮助来搞清楚哪一个表现更好?或者还有其他解决方案吗?
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))可能会限制优化程序。在这种情况下,您可以创建一个基于函数的索引。既然我们不知道你的表是什么样子的,你有什么索引等等,不能提供很多帮助 – OldProgrammer
有两个条件用'OR'隔开会阻碍在'SOME_COLUMN'上使用索引。函数调用也是如此(现在还不清楚基于函数的索引如何提供帮助,因为NVL(SOME_COLUMN,'null')'也被埋在另一个'NVL()'调用中)。可能有解决方案允许使用索引。例如,如果我想从'EMP'中选择'EMPNO ='或''为NULL'的行,则:'select * from EMP其中为null UNION ALL select * from EMP其中EMPNO = ' –
mathguy
在此示例中,如果用户输入为NULL,则UNION ALL的第一个成员检索所有内容,而第二个成员立即被识别为空。如果输入不是NULL,那么第一个成员立即被识别为空,第二个成员可以利用'EMPNO'上的索引。 – mathguy