4Manuals

  • PDF Cloud HOME

H2数据库两个派生表的内部联接需要47秒 Download

    如何将字符串“ text1”设置为包含项目text1,text2,test3的组合框的选定项目? XML数据类型方法“值”的参数1必须是字符串文字 如何在python中使用sql查询生成文本文件? 是否可以在不连接数据库的情况下在sql中打开.bak文件? 选择前10k花费太多时间来执行 为什么需要在MySQL中引用表名`5e09c9c09e9ba0cceccb3701`? 如果目标表具有参照完整性,如何在Teradata中使用导入实用程序(如Fastload或MLOAD)? 将SQL查询转换为Laravel雄辩 是否可以复制Azure DevOps构建并在本地运行? 部分列分组并将sql列值转换为JSON

我正在通过服务器连接使用H2数据库。数据库中的每个记录都有一个INTEGER APPLICATION_CODE字段,一个VARCHAR LOG_ENTRY_TIME字段和一个INTEGER STATUS_CODE字段。我需要找出每月每个APPLICATION_CODE最常出现的STATUS_CODE。如果两个计数相等,我只想返回其中一个。以下SQL可以运行,但是执行需要47秒。

编辑:将INNER JOIN更改为RIGHT JOIN可以将执行时间减少到47秒,这虽然更好,但仍然太长。我已经更新了问题信息,以使用RIGHT JOIN。

SELECT  MAX(STATUS_COUNT_TABLE.STATUS) AS MONTH_STATUS,
        STATUS_COUNT_TABLE.APPLICATION_CODE AS APPLICATION_CODE,
        FORMATDATETIME(DATEADD(MONTH, -1 * STATUS_COUNT_TABLE.MONTH_RANGE, CURRENT_DATE),'MMM-yyyy') AS MONTH_DATE

FROM    (
        SELECT  INNER_STATUS_COUNT_TABLE.STATUS AS STATUS, 
                MAX(INNER_STATUS_COUNT_TABLE.STATUS_COUNT) AS STATUS_COUNT, 
                INNER_STATUS_COUNT_TABLE.MONTH_RANGE AS MONTH_RANGE, 
                INNER_STATUS_COUNT_TABLE.APPLICATION_CODE AS APPLICATION_CODE
        FROM   ( 
                SELECT  
                    STATUS_CODE AS STATUS,
                    APPLICATION_CODE,
                    COUNT(*) AS STATUS_COUNT,
                    DATEDIFF(MONTH, LOG_ENTRY_TIME, CURRENT_DATE) MONTH_RANGE
                FROM MMIT_DASHBRD_APLCTN_LOG 
                WHERE LOG_ENTRY_TIME  >= DATEADD(MONTH, -12, CURRENT_DATE)
                GROUP BY STATUS_CODE, MONTH_RANGE, APPLICATION_CODE
                ) AS INNER_STATUS_COUNT_TABLE 
        GROUP BY  INNER_STATUS_COUNT_TABLE.MONTH_RANGE, INNER_STATUS_COUNT_TABLE.APPLICATION_CODE, INNER_STATUS_COUNT_TABLE.STATUS
    ) AS STATUS_COUNT_TABLE
    RIGHT JOIN  (
                    SELECT  MAX(INNER_STATUS_COUNT_TABLE.STATUS_COUNT) AS STATUS_COUNT,  
                            INNER_STATUS_COUNT_TABLE.MONTH_RANGE AS MONTH_RANGE,    
                            INNER_STATUS_COUNT_TABLE.APPLICATION_CODE AS APPLICATION_CODE
                    FROM   ( 
                            SELECT  
                                STATUS_CODE AS STATUS,
                                APPLICATION_CODE,
                                COUNT(*) AS STATUS_COUNT,
                                DATEDIFF(MONTH, LOG_ENTRY_TIME, CURRENT_DATE) MONTH_RANGE
                            FROM MMIT_DASHBRD_APLCTN_LOG 
                            WHERE LOG_ENTRY_TIME  >= DATEADD(MONTH, -12, CURRENT_DATE)
                            GROUP BY STATUS_CODE, MONTH_RANGE, APPLICATION_CODE
                            ) AS INNER_STATUS_COUNT_TABLE 
                    GROUP BY  INNER_STATUS_COUNT_TABLE.MONTH_RANGE, INNER_STATUS_COUNT_TABLE.APPLICATION_CODE
                ) AS MAX_STATUS_COUNT_TABLE
    ON STATUS_COUNT_TABLE.STATUS_COUNT = MAX_STATUS_COUNT_TABLE.STATUS_COUNT 
        AND STATUS_COUNT_TABLE.MONTH_RANGE = MAX_STATUS_COUNT_TABLE.MONTH_RANGE
        AND STATUS_COUNT_TABLE.APPLICATION_CODE = MAX_STATUS_COUNT_TABLE.APPLICATION_CODE
GROUP BY STATUS_COUNT_TABLE.MONTH_RANGE, STATUS_COUNT_TABLE.APPLICATION_CODE

我要连接的两个派生表在单独运行它们时都花费不到一秒钟的时间来执行。我读到了可以使用EXPLAIN命令查找瓶颈的地方,并获得了以下提示,但我不知道如何使用结果来查找瓶颈。

SELECT
MAX(STATUS_COUNT_TABLE.STATUS) AS MONTH_STATUS,
STATUS_COUNT_TABLE.APPLICATION_CODE AS APPLICATION_CODE,
FORMATDATETIME(DATEADD('MONTH', (-1 * STATUS_COUNT_TABLE.MONTH_RANGE), CURRENT_DATE()), 'MMM-yyyy') AS MONTH_DATE
FROM (
SELECT
    MAX(INNER_STATUS_COUNT_TABLE.STATUS_COUNT) AS STATUS_COUNT,
    INNER_STATUS_COUNT_TABLE.MONTH_RANGE AS MONTH_RANGE,
    INNER_STATUS_COUNT_TABLE.APPLICATION_CODE AS APPLICATION_CODE
FROM (
    SELECT
        STATUS_CODE AS STATUS,
        APPLICATION_CODE,
        COUNT(*) AS STATUS_COUNT,
        DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()) AS MONTH_RANGE
    FROM PUBLIC.MMIT_DASHBRD_APLCTN_LOG
    WHERE LOG_ENTRY_TIME >= DATEADD('MONTH', -12, CURRENT_DATE())
    GROUP BY STATUS_CODE, DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()), APPLICATION_CODE
) INNER_STATUS_COUNT_TABLE
GROUP BY INNER_STATUS_COUNT_TABLE.MONTH_RANGE, INNER_STATUS_COUNT_TABLE.APPLICATION_CODE
) MAX_STATUS_COUNT_TABLE
/* SELECT
    MAX(INNER_STATUS_COUNT_TABLE.STATUS_COUNT) AS STATUS_COUNT,
    INNER_STATUS_COUNT_TABLE.MONTH_RANGE AS MONTH_RANGE,
    INNER_STATUS_COUNT_TABLE.APPLICATION_CODE AS APPLICATION_CODE
FROM (
    SELECT
        STATUS_CODE AS STATUS,
        APPLICATION_CODE,
        COUNT(*) AS STATUS_COUNT,
        DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()) AS MONTH_RANGE
    FROM PUBLIC.MMIT_DASHBRD_APLCTN_LOG
    WHERE LOG_ENTRY_TIME >= DATEADD('MONTH', -12, CURRENT_DATE())
    GROUP BY STATUS_CODE, DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()), APPLICATION_CODE
) INNER_STATUS_COUNT_TABLE
    /++ SELECT
        STATUS_CODE AS STATUS,
        APPLICATION_CODE,
        COUNT(*) AS STATUS_COUNT,
        DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()) AS MONTH_RANGE
    FROM PUBLIC.MMIT_DASHBRD_APLCTN_LOG
        /++ PUBLIC.MMIT_DASHBRD_APLCTN_LOG.tableScan ++/
    WHERE LOG_ENTRY_TIME >= DATEADD('MONTH', -12, CURRENT_DATE())
    GROUP BY STATUS_CODE, DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()), APPLICATION_CODE
     ++/
GROUP BY INNER_STATUS_COUNT_TABLE.MONTH_RANGE, INNER_STATUS_COUNT_TABLE.APPLICATION_CODE
 */
LEFT OUTER JOIN (
SELECT
    INNER_STATUS_COUNT_TABLE.STATUS AS STATUS,
    MAX(INNER_STATUS_COUNT_TABLE.STATUS_COUNT) AS STATUS_COUNT,
    INNER_STATUS_COUNT_TABLE.MONTH_RANGE AS MONTH_RANGE,
    INNER_STATUS_COUNT_TABLE.APPLICATION_CODE AS APPLICATION_CODE
FROM (
    SELECT
        STATUS_CODE AS STATUS,
        APPLICATION_CODE,
        COUNT(*) AS STATUS_COUNT,
        DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()) AS MONTH_RANGE
    FROM PUBLIC.MMIT_DASHBRD_APLCTN_LOG
    WHERE LOG_ENTRY_TIME >= DATEADD('MONTH', -12, CURRENT_DATE())
    GROUP BY STATUS_CODE, DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()), APPLICATION_CODE
) INNER_STATUS_COUNT_TABLE
GROUP BY INNER_STATUS_COUNT_TABLE.MONTH_RANGE, INNER_STATUS_COUNT_TABLE.APPLICATION_CODE, INNER_STATUS_COUNT_TABLE.STATUS
) STATUS_COUNT_TABLE
/* SELECT
    INNER_STATUS_COUNT_TABLE.STATUS AS STATUS,
    MAX(INNER_STATUS_COUNT_TABLE.STATUS_COUNT) AS STATUS_COUNT,
    INNER_STATUS_COUNT_TABLE.MONTH_RANGE AS MONTH_RANGE,
    INNER_STATUS_COUNT_TABLE.APPLICATION_CODE AS APPLICATION_CODE
FROM (
    SELECT
        STATUS_CODE AS STATUS,
        APPLICATION_CODE,
        COUNT(*) AS STATUS_COUNT,
        DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()) AS MONTH_RANGE
    FROM PUBLIC.MMIT_DASHBRD_APLCTN_LOG
    WHERE LOG_ENTRY_TIME >= DATEADD('MONTH', -12, CURRENT_DATE())
    GROUP BY STATUS_CODE, DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()), APPLICATION_CODE
) INNER_STATUS_COUNT_TABLE
    /++ SELECT
        STATUS_CODE AS STATUS,
        APPLICATION_CODE,
        COUNT(*) AS STATUS_COUNT,
        DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()) AS MONTH_RANGE
    FROM PUBLIC.MMIT_DASHBRD_APLCTN_LOG
        /++ PUBLIC.MMIT_DASHBRD_APLCTN_LOG.tableScan ++/
    WHERE LOG_ENTRY_TIME >= DATEADD('MONTH', -12, CURRENT_DATE())
    GROUP BY STATUS_CODE, DATEDIFF('MONTH', LOG_ENTRY_TIME, CURRENT_DATE()), APPLICATION_CODE
     ++/
GROUP BY INNER_STATUS_COUNT_TABLE.MONTH_RANGE, INNER_STATUS_COUNT_TABLE.APPLICATION_CODE, INNER_STATUS_COUNT_TABLE.STATUS
 */
ON (STATUS_COUNT_TABLE.APPLICATION_CODE = MAX_STATUS_COUNT_TABLE.APPLICATION_CODE)
AND ((STATUS_COUNT_TABLE.STATUS_COUNT = MAX_STATUS_COUNT_TABLE.STATUS_COUNT)
AND (STATUS_COUNT_TABLE.MONTH_RANGE = MAX_STATUS_COUNT_TABLE.MONTH_RANGE))
GROUP BY STATUS_COUNT_TABLE.MONTH_RANGE, STATUS_COUNT_TABLE.APPLICATION_CODE
ORDER BY 2, =STATUS_COUNT_TABLE.MONTH_RANGE

当我分别运行第一个派生表时,我会得到101条看起来像这样的记录。

enter image description here

分别运行第二个派生表时,我得到65条记录,如下所示。

enter image description here

0 个答案:

没有答案



Similar searches
    Google O-Auth for DBM 如果应用程序进入后台,如何运行计时器? getOrCreate()抛出异常:Java网关进程在发送其端口号之前已退出 Samsung RF197 Refrigerator User Manual C#Git项目缺少Nuget软件包