提高性能的 Oracle SQL 新手

Posted

技术标签:

【中文标题】提高性能的 Oracle SQL 新手【英文标题】:Oracle SQL Newbie for Performance 【发布时间】:2020-11-09 00:51:51 【问题描述】:

[编辑] 让自己更清楚。 MT0 和 Tejash 的两个答案都与我的最终代码相同。 但是我从我的前同事那里阅读了一些代码,他们更喜欢使用循环来动态创建“WHERE”子句。 也就是说,如果 :id 不为空,则添加“and id = :id”。 如果 :upload_date 不为空,则添加“and upload_date > to_date(:upload_date, 'yyyymmdd')”

是否有任何隐含的表现? 或者“Dynamic SQL”和“One SQL”都是很好的解决方案,因为它们之间没有性能差异?

[原创] 我在下面有一个 SQL:

SELECT id, name file_name, upload_date
FROM A
WHERE id like :id
    and upload_date > to_date(:upload_date, 'yyyymmdd')

条件: 1. :id => '%' (如果 :id 为空)或特定 id 2.:上传日期 => 如果upload_date为null,则默认日期为'20200101'

我的目标是: 1.如果 :id 和 :upload_date 都是空值,我想显示表 A 中的所有数据。 2.如果:id或:upload_date不为null,我想显示有条件的数据。

我想出了下面的另一个 SQL:

SELECT id, name file_name, upload_date
FROM A
WHERE id like :id
    and ((:upload_date is not null and upload_date > to_date(:upload_date, 'yyyymmdd'))
        or :upload_date is null)

我想知道哪种 SQL 更适合大数据量,或者它们之间没有区别

【问题讨论】:

最简单的找出方法是创建一个脚本,用大量数据填充您的数据库,然后对每个数据进行尝试。 【参考方案1】:

根据您的编辑,如果您可以执行完全符合您要求的 SQL,它通常会比执行 3 或 4 个变体的 SQL 更快。例如如果没有发送 ID,则从 SQL 中省略它。与日期相同。

优化器可以“窥视”变量以从更一般的查询中制定计划,但最好是具体的,因为它只能评估每个查询的这么多选项。这很简单,所以可能无关紧要,但这是一个很好的做法。单一职责适用于 SQL 以及其他代码!人类调试也更干净!

【讨论】:

【参考方案2】:

您可以按如下方式使用OR 条件:

SELECT id, name file_name, upload_date FROM A 
 WHERE (id = :id or :id is null)
   and (
         (:upload_date is null and upload_date > to_date(20200101, 'yyyymmdd'))
         OR upload_date > to_date(:upload_date,  'yyyymmdd')
       )

【讨论】:

【参考方案3】:

你似乎想要这样的东西:

SELECT id,
       name AS file_name,
       upload_date
FROM   A
WHERE  (
         (
            :id IS NULL -- :id maps to '%' when NULL
         OR id = :id
         )
       AND
         upload_date > COALESCE(
                         TO_DATE(:upload_date, 'yyyymmdd' ),
                         DATE '2020-01-01' -- or TRUNC( SYSDATE, 'YYYY' )
                       )
       )
OR     (
         :id IS NULL
       AND
         :upload_date IS NULL
       )

【讨论】:

以上是关于提高性能的 Oracle SQL 新手的主要内容,如果未能解决你的问题,请参考以下文章

如何提高 Oracle SQL 数据库或 Web 服务性能?

我正在尝试提高查找两个表之间差异的 Oracle SQL 的性能

将 SQL 查询转换为 PL/SQL 可以提高 Oracle 12c 中的性能吗? [关闭]

如何提高 Oracle 中仅加载最近 5 天内修改的项目的 SQL 性能?

如何对Oracle sql 进行性能优化的调整

如何提高oracle模糊查询的性能?