我得到了这个小代码,它实际上要长很多,但我已经创建了一些临时工作表,以加快测试速度,而不是一直运行“随时随地”。查询可以正常运行所考虑的行数,直到下面显示的部分。我已经制作了两个临时表,"disc_memberlist“和billing_disc。我想比较这两种情况,并添加一个列,该列说明用户是否在billing_disc中(Y和N,在本例中),如果我指定一个预先确定的agreement_id,select工作得很好。然而,如果我删除它,并希望它通过所有行,它磨成一个爬行。每10秒有200行(我需要解析一百万行)
有什么建议可以让我用更好的表现来实现这个目标吗?
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执行计划是
"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)"发布于 2018-03-27 12:38:37
您应该使用LEFT JOIN而不是IN。如果在列disc_memberlist.user_id和billing_disc.resource_id上有正确的索引,那么它应该会提高性能,因为它不会在表中进行完整的扫描。
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;发布于 2018-03-27 12:31:33
我建议使用这三个表(LEFT JOIN)创建一个临时表。不要忘记使用procedure analyse索引和创建正确的变量。此外,尝试EXPLAIN查询,它将为您提供更多关于如何提高性能的提示。
https://stackoverflow.com/questions/49512714
复制相似问题