gpt4 book ai didi

使用 CASE WHEN EXISTS 子查询优化的 Oracle SQL 查询

转载 作者:行者123 更新时间:2023-12-02 05:32:29 25 4
gpt4 key购买 nike

我使用以下查询在 Oracle 11g (11.2.0.3.0) 中创建 View 。

CREATE OR REPLACE FORCE VIEW V_DOCUMENTS_LIST
(
ID_DOC,
ATTACHMENTS_COUNT,
TOTAL_DIMENSION,
INSERT_DATE,
ID_STATE,
STATE,
ID_INSTITUTE,
INSTITUTE,
HASJOB
)
AS
SELECT D.ID_DOC,
COUNT (F.ID_FILE) AS ATTACHMENTS_COUNT,
CASE
WHEN SUM (F.DIMENSION) IS NULL THEN 0
ELSE SUM (F.DIMENSION)
END
AS TOTAL_DIMENSION,
D.INSERT_DATE,
D.ID_STATE,
S.STATE_DESC AS STATE,
D.ID_INSTITUTE,
E.NAME AS INSTITUTE,
CASE
WHEN EXISTS (SELECT D.ID_DOC FROM JOB) THEN 'true'
ELSE 'false'
END
AS HASJOB
FROM DOCUMENTS D
LEFT JOIN FILES F ON D.ID_DOC = F.ID_DOC
JOIN STATES S ON D.ID_STATE = S.ID_STATE
JOIN INSTITUTES E ON D.ID_INSTITUTE = E.ID_INSTITUTE
GROUP BY D.ID_DOC,
D.INSERT_DATE,
D.ID_STATE,
S.STATE_DESC,
D.ID_INSTITUTE,
E.NAME;

然后,我查询该 View 以获取 ASPX 页面中 DataGridView 的值。

SELECT * 
FROM V_DOCUMENTS_LIST
ORDER BY ID_STATE DESC, INSTITUTE, INSERT_DATE DESC;

相关表和关系

文件;文件;工作;

文档 (1-1) <----> (0-N) 文件

工作 (0-1) <----> (0-N) 文件

通过查询 View ,我可以获得完整的文档列表及其所有相关信息(ID、描述、日期、状态等),并且还可以获取每个文档的完整列表:

  • 附加文件总数
  • 附加文件的总尺寸(以字节为单位)
  • bool 值,指示是否至少有一个 JOB DOCUMENT 关联.

一切正常,直到 View 包含几千条记录。现在,记录数量不断增加, View 上的 SELECT * FROM 大约需要 2:30 分钟,包含 15.000-20.000 条记录。我知道我的 View 中真正耗时的部分是嵌套的 SELECT:

CASE
WHEN EXISTS (SELECT D.ID_DOC FROM JOB) THEN 'true'
ELSE 'false'
END
AS HASJOB

如何优化我的 View ?

最佳答案

要解决不存在的问题,您可以添加联接:

LEFT JOIN (select distinct id_doc from JOB) J
ON d.id_doc = J.id_doc

Has_job 列将是:

    CASE
WHEN j.id_doc is not null THEN 'true'
ELSE 'false'
END AS HASJOB

PS:您当前的实现存在问题,因为如果作业表有行,SELECT D.ID_DOC FROM JOB 将始终包含行。它相当于select * from job,因为存在只是测试行是否存在。逻辑上正确的实现是:SELECT 1 FROM JOB j where j.id_doc = D.ID_DOC

关于使用 CASE WHEN EXISTS 子查询优化的 Oracle SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33828311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com