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 Update 真的很慢(大约 20-50 秒),Select 不到 1 秒