Oracle SQL性能新手



[Edit]
让自己更清楚
MT0和Tejash的两个答案与我的最终代码相同
但我从我以前的同事那里读过一些代码,他们更喜欢使用循环来动态创建"其中";条款
也就是说,如果:id不为null,则添加"以及id=:id">
如果:upload_date不为空,则添加"以及upload_ date>to_date(:upload_date,'yyyymmdd'(">

是否存在任何隐含的性能问题
或者两者兼而有之"动态SQL";以及";一个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为null(或特定id
2.:上传日期=>如果upload_date为null,则默认日期为"20200101">

我的目标是:
1.如果:id和:upload_date都是null值,我想显示表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更适合大数据量,或者它们之间没有区别

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

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

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

您似乎想要这样的东西:

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
)

最新更新