Oracle SQL 性能新手

Oracle SQL Newbie for Performance

[编辑]
让自己更清楚。
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 => 如果 upload_date 为空,则默认日期为 '20200101'

我的目标是:
1.If :id 和 :upload_date 都是空值,我想显示来自 Table A 的所有数据。
2.If :id or :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哪个更适合大数据量还是没区别

您似乎想要这样的东西:

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
       )

您可以使用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')
       )

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

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