SQL 查询需要 15 到 20 秒

Posted

技术标签:

【中文标题】SQL 查询需要 15 到 20 秒【英文标题】:SQL Query Takes 15 to 20 sec 【发布时间】: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 用于查询(作为文本,而不是图像)。 说明中添加了说明计划图片链接 【参考方案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);

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

祝你好运。

【讨论】:

以上是关于SQL 查询需要 15 到 20 秒的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询优化需要 20 - 30 秒才能运行

sql查询需要时间,因为我正在查看三个表

是否可以在 SQL Server 中同时运行 2 个查询

SQL Update 真的很慢(大约 20-50 秒),Select 不到 1 秒

紧急求助:如何在5秒钟内从2000万条记录的数据库中查询获取20条记录?

mysql如何找出慢sql