【问题标题】:Oracle SQL Query optional parameters performanceOracle SQL Query 可选参数性能
【发布时间】: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 NULLselect * 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


【解决方案1】:

通常,我会执行以下操作:

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

如果user_passed_variable 为NULL,则检索所有行,如果设置了user_passed_variable,它将仅使用索引获取给定行

如果您的 SOME_COLUMN 没有空值,则可以使用

【讨论】:

    【解决方案2】:

    过滤器查询的工作方式应该是,如果用户提供了可选值,则将其添加到过滤器中,否则不要将其添加到过滤器中,因此查询应仅检查用户传递的值是否与 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)
    

    因此,使用这种类型的查询,您将根据用户给出的输入来搜索表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-11
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多