【问题标题】:SQL Query Takes 15 to 20 secSQL 查询需要 15 到 20 秒
【发布时间】:2018-07-11 11:38:24
【问题描述】:

以下查询需要 15 到 20 秒,这是预期的。请帮助重构此查询

SELECT upin.bipuserid userid,
       upin.orgn_entity_id entityId,
       COUNT(upin.ORGN_ENTITY_ID)
           over (partition BY upin.bipuserid) as numentities,
       COUNT(DISTINCT(SUBSTR(upin.ORGN_ENTITY_ID,6,2)))
           over (partition BY upin.bipuserid) as numentitytypes
FROM userpermission upin;

表中有 1614246 条记录。已在两列上创建索引。

下面是表结构

Column Name        Data Type    

BIPUSERID         VARCHAR2 (20 Char)            
ROLECODE          VARCHAR2 (25 Char)            
ORGN_ENTITY_ID    VARCHAR2 (10 Char)            
ACT_CD            VARCHAR2 (1 Char)         

【问题讨论】:

  • 您能否发布没有numentitytypes 列的查询性能?
  • edit your question 包含the execution plan 用于查询(作为文本,而不是图像)。
  • 说明中添加了说明计划图片链接

标签: sql oracle performance refactoring sql-tuning


【解决方案1】:

这个查询需要多长时间?

select count(orgn_entity_id) as numentities ,
       count(distinct substr(upin.ORGN_ENTITY_ID, 6, 2) ) as numentitytypes
from userpermission upin
group by upin.bipuserid;

如果这明显更快,那么您可以join 这些结果返回。这可能能够利用userpermission(bipuserid, substr(upin.ORGN_ENTITY_ID, 6, 2), orgn_entity_id) 上的索引。

【讨论】:

  • 嗨,戈登,这明显更快,但没有给我所需的 numentities 和 numentitytypes 的结果
  • @GaganDeep 。 . .如果这没有给出正确的值,那么窗口函数也不会。这应该有正确的值,但每个 bipuserid 行只有一个。
【解决方案2】:

我相信@GordonLinoff 的建议是您应该使用他的查询作为以下内容的基础:

WITH cteCounts AS (SELECT BIPUSERID,
                          COUNT(ORGN_ENTITY_ID) AS NUMENTITIES ,
                          COUNT(DISTINCT SUBSTR(ORGN_ENTITY_ID, 6, 2) ) AS NUMENTITYTYPES
                     FROM USERPERMISSION
                     GROUP BY BIPUSERID)
SELECT c.BIPUSERID,
       up.ORGN_ENTITY_ID AS ENTITYID,
       c.NUMENTITIES,
       c.NUMENTITYTYPES
  FROM cteCounts c
  INNER JOIN USERPERMISSION up
    ON up.BIPUSERID = c.BIPUSERID

并添加如下索引:

CREATE INDEX USERPERMISSION_XXX(BIPUSERID, SUBSTR(ORGN_ENTITY_ID, 6, 2), ORGN_ENTITY_ID);

创建索引,然后运行上面的查询,希望它会更快地为您工作。

祝你好运。

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2019-02-18
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多