首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行SQL案例表达式非常慢(查询优化)

执行SQL案例表达式非常慢(查询优化)
EN

Stack Overflow用户
提问于 2018-03-27 12:21:28
回答 2查看 2.9K关注 0票数 1

我得到了这个小代码,它实际上要长很多,但我已经创建了一些临时工作表,以加快测试速度,而不是一直运行“随时随地”。查询可以正常运行所考虑的行数,直到下面显示的部分。我已经制作了两个临时表,"disc_memberlist“和billing_disc。我想比较这两种情况,并添加一个列,该列说明用户是否在billing_disc中(Y和N,在本例中),如果我指定一个预先确定的agreement_id,select工作得很好。然而,如果我删除它,并希望它通过所有行,它磨成一个爬行。每10秒有200行(我需要解析一百万行)

有什么建议可以让我用更好的表现来实现这个目标吗?

代码语言:javascript
复制
SELECT 
          dm.user_id
          ,dm.agreement_id
          ,dm.cust_id
          ,dm.offer_id
          ,dm.offer_type
          ,dm.resource_spec_id
          ,dm.memberlist_subscriber_count
          ,CASE
              WHEN dm.user_id in (SELECT user_id      
FROM   disc_memberlist dm
WHERE  dm.user_id IN (SELECT bd.resource_id
                          FROM  billing_disc bd )) 
                  THEN
             'Y'
             ELSE
             'N'
      END AS Exists_in_billing

执行计划是

代码语言:javascript
复制
"PLAN_TABLE_OUTPUT"
"Plan hash value: 3054186447"
" "
"------------------------------------------------------------------------------------------------"
"| Id  | Operation          | Name                      | Rows  | Bytes | Cost (%CPU)| Time     |"
"------------------------------------------------------------------------------------------------"
"|   0 | SELECT STATEMENT   |                           |  1727K|    87M|    21G  (1)|232:59:10 |"
"|*  1 |  HASH JOIN SEMI    |                           |     1 |    18 | 12480   (1)| 00:00:01 |"
"|*  2 |   TABLE ACCESS FULL| AGREEMENT_MEMBERLIST_KRPS |     1 |     9 |  3896   (1)| 00:00:01 |"
"|*  3 |   TABLE ACCESS FULL| BILLING_DISC_KRPS         |    30 |   270 |  8585   (1)| 00:00:01 |"
"|   4 |  TABLE ACCESS FULL | AGREEMENT_MEMBERLIST_KRPS |  1727K|    87M|  3899   (1)| 00:00:01 |"
"------------------------------------------------------------------------------------------------"
" "
"Predicate Information (identified by operation id):"
"---------------------------------------------------"
" "
"   1 - access(""DM"".""USER_ID""=""BD"".""RESOURCE_ID"")"
"   2 - filter(""USER_ID""=:B1)"
"   3 - filter(""BD"".""RESOURCE_ID""=:B1)"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-27 12:38:37

您应该使用LEFT JOIN而不是IN。如果在列disc_memberlist.user_idbilling_disc.resource_id上有正确的索引,那么它应该会提高性能,因为它不会在表中进行完整的扫描。

代码语言:javascript
复制
SELECT 
    dm.user_id
    ,dm.agreement_id
    ,dm.cust_id
    ,dm.offer_id
    ,dm.offer_type
    ,dm.resource_spec_id
    ,dm.memberlist_subscriber_count
    ,NVL2(bd.resource_id, 'Y', 'N') AS Exists_in_billing
FROM disc_memberlist dm
LEFT JOIN billing_disc bd ON dm.user_id = bd.resource_id;
票数 0
EN

Stack Overflow用户

发布于 2018-03-27 12:31:33

我建议使用这三个表(LEFT JOIN)创建一个临时表。不要忘记使用procedure analyse索引和创建正确的变量。此外,尝试EXPLAIN查询,它将为您提供更多关于如何提高性能的提示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49512714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档