具有CASE WHEN EXISTS子查询优化的Oracle SQL查询

柴郡猫

我正在使用以下查询在Oracle 11g(11.2.0.3.0)中创建视图

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;

然后我查询这种观点得到值一DataGridView中的ASPX网页。

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

相关表和关系

文件;文件;职位;

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

职位(0-1)<---->(0-N)文档

查询视图时,我获得了包含所有相关信息(ID,描述,日期,状态等)以及每个文档的完整文档列表:

  • 附件总数;
  • 附件的总尺寸(字节) ;
  • 布尔值,指示是否有至少一个 JOB 关联到 DOCUMENT 或没有

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

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

如何优化视图?

弗洛林·吉塔(Florin Ghita)

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有CASE WHEN EXISTS子查询优化的Oracle SQL查询

来自分类Dev

带有子查询的SQL查询优化

来自分类Dev

Oracle SQL:在不重复子查询的情况下,将子查询重新用于CASE WHEN

来自分类Dev

有关优化此多层(具有多层子查询)SQL 查询的提示

来自分类Dev

具有SUM和分组的SQL查询CASE

来自分类Dev

具有UNION优化的SQL查询

来自分类Dev

具有游标优化的SQL查询

来自分类Dev

具有游标优化的SQL查询

来自分类Dev

Oracle SQL查询借助“ Case When”子句来获取值

来自分类Dev

具有多个条件的 Oracle SQL 连接子查询

来自分类Dev

SQL查询中的CASE WHEN语句示例

来自分类Dev

SQL查询寻找具有索引的复杂查询的优化

来自分类Dev

SQL查询寻找具有索引的复杂查询的优化

来自分类Dev

具有子查询优化功能的MySQL查询

来自分类Dev

带有子查询的Oracle SQL

来自分类Dev

SQL Server查询语法(子查询,方括号和CASE WHEN)

来自分类Dev

SQL Server查询语法(子查询,方括号和CASE WHEN)

来自分类Dev

带有 CASE...WHEN 字段的 Oracle 查询取决于子查询的前一个字段

来自分类Dev

具有内部联接的SQL子查询

来自分类Dev

具有大量OR的SQL查询

来自分类Dev

具有组的SQL查询

来自分类Dev

具有大量OR的SQL查询

来自分类Dev

具有内部联接优化的SQL更新查询

来自分类Dev

具有3个联接的SQL查询优化

来自分类Dev

将SUM / CASE WHEN / GROUP BY SQL查询转换为LINQ

来自分类Dev

(ORDER BY CASE WHEN)按子查询排序

来自分类Dev

带有LINQ查询子查询的not in子句的SQL查询

来自分类Dev

如何优化SQL子查询?

来自分类Dev

Oracle SQL子查询