2017-07-27 66 views
0

我有一个用于在多个可选参数上执行查询的用例。在查询执行过程中可能会传递或不传递一些参数。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’)) 

:列也可以容纳空值。

+0

此处没有足够的详细信息,但将表函数应用于表列(如NVL(SOME_COLUMN))可能会限制优化程序。在这种情况下,您可以创建一个基于函数的索引。既然我们不知道你的表是什么样子的,你有什么索引等等,不能提供很多帮助 – OldProgrammer

+0

有两个条件用'OR'隔开会阻碍在'SOME_COLUMN'上使用索引。函数调用也是如此(现在还不清楚基于函数的索引如何提供帮助,因为NVL(SOME_COLUMN,'null')'也被埋在另一个'NVL()'调用中)。可能有解决方案允许使用索引。例如,如果我想从'EMP'中选择'EMPNO = '或''为NULL'的行,则:'select * from EMP其中为null UNION ALL select * from EMP其中EMPNO = ' – mathguy

+0

在此示例中,如果用户输入为NULL,则UNION ALL的第一个成员检索所有内容,而第二个成员立即被识别为空。如果输入不是NULL,那么第一个成员立即被识别为空,第二个成员可以利用'EMPNO'上的索引。 – mathguy

回答

0

通常情况下,我做到以下几点:

SELECT * FROM MY_TABLE WHERE SOME_COLUMN = NVL(user_passed_variable,SOME_COLUMN); 

如果user_passed_variable为NULL,它会检索所有行,如果user_passed_variable设置,它将使用索引

作品,如果只获取给定行您的SOME_COLUMN没有空值

0

过滤器查询应该以这样的方式工作,即如果用户提供了可选值,则将其添加到过滤器,否则不要将其添加到过滤器中,以便查询只应检查用户通过的值与db值匹配

Select * from Filter_table where 
(user_passed_value1 is null or column1 = user_passed_value1) and 
(user_passed_value2 is null or column2 = user_passed_value2) 

所以使用这种类型的查询,您正在根据用户给出的输入搜索表。