Sql e通过查看解释计划了解表格大小@梅拉杜尔。“行”列表示预期的数据量。如果我没有错,但这些行是每个操作返回的行!我尝试了您提供的所有备选方案,但没有一个有帮助:(所有这些都会产生相同的成本,但是intersect选项会增加成本。我想我需要在sub-svc\u
Sql e通过查看解释计划了解表格大小@梅拉杜尔。“行”列表示预期的数据量。如果我没有错,但这些行是每个操作返回的行!我尝试了您提供的所有备选方案,但没有一个有帮助:(所有这些都会产生相同的成本,但是intersect选项会增加成本。我想我需要在sub-svc\u,sql,oracle,plsql,sqlperformance,Sql,Oracle,Plsql,Sqlperformance,e通过查看解释计划了解表格大小@梅拉杜尔。“行”列表示预期的数据量。如果我没有错,但这些行是每个操作返回的行!我尝试了您提供的所有备选方案,但没有一个有帮助:(所有这些都会产生相同的成本,但是intersect选项会增加成本。我想我需要在sub-svc\u status\u id列上建立一个索引,并删除where子句中的函数调用!!好的,如前所述,优化器应该生成相同的计划,所以我并不奇怪它没有帮助。这只是一个很小的机会,没有更多。但是你有什么建议吗添加这两个索引?这很可能会加快查询速度。是的,我
e通过查看解释计划了解表格大小@梅拉杜尔。“行”列表示预期的数据量。如果我没有错,但这些行是每个操作返回的行!我尝试了您提供的所有备选方案,但没有一个有帮助:(所有这些都会产生相同的成本,但是intersect选项会增加成本。我想我需要在sub-svc\u status\u id列上建立一个索引,并删除where子句中的函数调用!!好的,如前所述,优化器应该生成相同的计划,所以我并不奇怪它没有帮助。这只是一个很小的机会,没有更多。但是你有什么建议吗添加这两个索引?这很可能会加快查询速度。是的,我也在考虑同样的问题,因为这是一个现场域,解释计划是相同的,即使我使用简单SQL查询更改了函数,对于您提供的所有备选方案也是一样的!\n另外,我想知道我是否需要为这两个列或列添加索引如果我只为sub_svc_status_id添加sub_svc_id,可以吗?因为sub_svc_id已经是sub_svc_statis_id列上的主_keyI added列,它将成本降低到505K:)它用在游标中。你能解释一下吗:当你在游标中运行你提供的查询时,它需要那么长时间吗?我正在更新查询并添加使用该查询的过程。你能澄清一下:是该过程还是需要4-5个小时的查询吗?如果是该过程,那么查询需要多长时间?我正在执行该查询并它从最后1.30小时开始运行:(在创建列上的新索引后,检查问题以获得更新的解释计划创建索引后,首先你必须知道这4-5个小时的确切时间。
explain plan for SELECT /*+ PARALLEL_INDEX(ssp, sub_svc_parm_ix2, 4)
INDEX(ssp sub_svc_parm_ix2) */
SUB_SVC_ID
FROM SUB_SVC_PARM ssp
WHERE PARM_ID = GET_PARM_ID('net_ppv_credit_limit', GET_CLASS_ID('SubSvcSpec'), GET_SVCID('smp_cpe_cas'))
AND VAL <> '140.00'
AND EXISTS (SELECT /*+ PARALLEL_INDEX(ss, sub_svc_pk, 4) */
1
FROM SUB_SVC ss
WHERE ss.SUB_SVC_ID = ssp.SUB_SVC_ID
AND ss.SUB_SVC_STATUS_ID NOT IN (FN_GET_STATUS_ID('SubSvcSpec', 'deleted'),
FN_GET_STATUS_ID('SubSvcSpec', 'inactive'),
FN_GET_STATUS_ID('SubSvcSpec', 'add_in_progress'),
FN_GET_STATUS_ID('SubSvcSpec', 'activation_in_progress'),
FN_GET_STATUS_ID('SubSvcSpec', 'courtesy_block_in_progress'),
FN_GET_STATUS_ID('SubSvcSpec', 'mso_block_in_progress'),
FN_GET_STATUS_ID('SubSvcSpec', 'delete_in_progress'),
FN_GET_STATUS_ID('SubSvcSpec', 'deactivation_in_progress'),
FN_GET_STATUS_ID('SubSvcSpec', 'change_in_progress')));
Plan hash value: 4290343623
---------------------------------------------------------------------------- -----------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------- ------------------------------
| 0 | SELECT STATEMENT | | 1802K| 56M| | 528K (1)|730:11:02 |
|* 1 | HASH JOIN RIGHT SEMI | | 1802K| 56M| 37M| 528K (1)|730:11:02 |
|* 2 | TABLE ACCESS FULL | SUB_SVC | 1763K| 16M| | 311K (1)|430:15:33 |
| 3 | TABLE ACCESS BY INDEX ROWID| SUB_SVC_PARM | 2394K| 52M| | 209K (0)|288:56:00 |
|* 4 | INDEX RANGE SCAN | SUB_SVC_PARM_IX2 | 2394K| | | 1519 (0)| 02:05:59 |
---------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("SS"."SUB_SVC_ID"="SSP"."SUB_SVC_ID")
2 - filter("SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','deleted') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','inactive') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','add_in_progress') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','activation_in_progress') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','courtesy_block_in_progress') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','mso_block_in_progress') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','delete_in_progress') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','deactivation_in_progress') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','change_in_progress'))
4 - access("PARM_ID"="GET_PARM_ID"('net_ppv_credit_limit',"GET_CLASS_ID"('SubSvcSpec'),"GET_SV
CID"('smp_cpe_cas')))
filter("VAL"<>'140.00')
index_name coulmn_name
----------- ------------
SUB_SVC_PK sub_svc_id
SUB_SVC_IX4 PARENT_SUB_SVC_ID
SUB_SVC_IX5 EXTERNAL_KEY
SUB_SVC_IX6 SUB_SVC_IX6
index_name coulmn_name
----------- ------------
SUB_SVC_PARM_PK SUB_SVC_ID, PARM_ID
SUB_SVC_PARM_IX2 PARM_ID, VAL
CREATE TABLE "SMPHOMCM"."SUB_SVC_PARM"
( "SUB_SVC_ID" NUMBER(12,0) NOT NULL ENABLE,
"PARM_ID" NUMBER(12,0) NOT NULL ENABLE,
"VAL" VARCHAR2(2000 BYTE) NOT NULL ENABLE,
CONSTRAINT "SUB_SVC_PARM_PK" PRIMARY KEY ("SUB_SVC_ID", "PARM_ID")
USING INDEX)
CREATE TABLE SYNTAX FOR SUB_SVC TABLE
CREATE TABLE "SMPHOMCM"."SUB_SVC"
( "SUB_SVC_ID" NUMBER(12,0) NOT NULL ENABLE,
"SUB_ID" NUMBER(12,0) NOT NULL ENABLE,
"START_DT" DATE NOT NULL ENABLE,
"EXTERNAL_KEY" VARCHAR2(100 BYTE) NOT NULL ENABLE,
"SAMP_VER" NUMBER(9,0) NOT NULL ENABLE,
"SUB_SVC_STATUS_ID" NUMBER(12,0) NOT NULL ENABLE,
"CREATED_DTM" DATE NOT NULL ENABLE,
"CREATED_BY" VARCHAR2(30 BYTE) NOT NULL ENABLE,
"END_DT" DATE,
"PURCHASE_DT" DATE,
"PARENT_SUB_SVC_ID" NUMBER(12,0),
"PRE_STATUS_ID" NUMBER(12,0),
"MODIFIED_DTM" DATE,
"MODIFIED_BY" VARCHAR2(30 BYTE),
"SVC_ID" NUMBER(12,0),
CONSTRAINT "SUB_SVC_PK" PRIMARY KEY ("SUB_SVC_ID")
USING INDEX)
CREATE OR REPLACE PROCEDURE PPV_CREDIT_LIMIT(p_exid NUMBER)
IS
-- Flag 'N' is null
TYPE tab_sub_svc_id IS TABLE OF SUB_SVC_PARM.SUB_SVC_ID%TYPE INDEX BY PLS_INTEGER;
rs_sub_svc_id tab_sub_svc_id;
c_class_SubSvcSpec constant pls_integer := GET_CLASS_ID('SubSvcSpec');
c_svc_smp_cpe_cas constant pls_integer := GET_SVCID('smp_cpe_cas');
c_parm_net_ppv_credit_limit constant pls_integer := GET_PARM_ID('net_ppv_credit_limit', c_class_SubSvcSpec, c_svc_smp_cpe_cas);
c_deleted constant pls_integer := FN_GET_STATUS_ID('SubSvcSpec', 'deleted');
c_inactive constant pls_integer := FN_GET_STATUS_ID('SubSvcSpec', 'inactive');
c_add_in_progress constant pls_integer := FN_GET_STATUS_ID('SubSvcSpec', 'add_in_progress');
c_activation_in_progress constant pls_integer := FN_GET_STATUS_ID('SubSvcSpec', 'activation_in_progress');
c_courtesy_block_in_progress constant pls_integer := FN_GET_STATUS_ID('SubSvcSpec', 'courtesy_block_in_progress');
c_mso_block_in_progress constant pls_integer := FN_GET_STATUS_ID('SubSvcSpec', 'mso_block_in_progress');
c_delete_in_progress constant pls_integer := FN_GET_STATUS_ID('SubSvcSpec', 'delete_in_progress');
c_deactivation_in_progress constant pls_integer := FN_GET_STATUS_ID('SubSvcSpec', 'deactivation_in_progress');
c_change_in_progress constant pls_integer := FN_GET_STATUS_ID('SubSvcSpec', 'change_in_progress');
c_ppv_credit_limit constant varchar2(6) := '140.00';
-- Added for net_creditthreshold parm
c_parm_ppv_credit_threshold constant pls_integer := GET_PARM_ID('net_ppv_creditthreshold', c_class_SubSvcSpec, c_svc_smp_cpe_cas);
c_ppv_credit_threshold constant varchar2(6) := '80.00';
ilimit CONSTANT PLS_INTEGER := 1000;
iCheck CONSTANT PLS_INTEGER := 10;
l_total_recs PLS_INTEGER;
l_rec_cnt PLS_INTEGER;
l_curr_cnt PLS_INTEGER := 0;
l_batch PLS_INTEGER := 0;
v_stop_flag CHAR(1) := 'N';
cursor curPPV_CL IS
SELECT /*+ PARALLEL_INDEX(ssp, sub_svc_parm_ix2, 4)
INDEX(ssp sub_svc_parm_ix2) */
SUB_SVC_ID
FROM SUB_SVC_PARM ssp
WHERE PARM_ID = c_parm_net_ppv_credit_limit
AND VAL <> '140.00'
AND EXISTS (SELECT /*+ PARALLEL_INDEX(ss, sub_svc_pk, 4) */
1
FROM SUB_SVC ss
WHERE ss.SUB_SVC_ID = ssp.SUB_SVC_ID
AND ss.SUB_SVC_STATUS_ID NOT IN (c_deleted,
c_inactive,
c_add_in_progress,
c_activation_in_progress,
c_courtesy_block_in_progress,
c_mso_block_in_progress,
c_delete_in_progress,
c_deactivation_in_progress,
c_change_in_progress));
BEGIN
DBMS_APPLICATION_INFO.set_action (NULL);
DBMS_APPLICATION_INFO.set_module (NULL, NULL);
DBMS_APPLICATION_INFO.set_client_info (NULL);
DBMS_APPLICATION_INFO.set_module (module_name => 'Procedure: PPV_CREDIT_LIMIT',
action_name => 'Counting total updatable records');
SELECT /*+ PARALLEL_INDEX(ssp, sub_svc_parm_ix2, 4)
INDEX(ssp sub_svc_parm_ix2) */
COUNT(SUB_SVC_ID)
INTO l_total_recs
FROM SUB_SVC_PARM ssp
WHERE PARM_ID = c_parm_net_ppv_credit_limit
AND VAL <> '140.00'
AND EXISTS (SELECT /*+ PARALLEL_INDEX(ss, sub_svc_pk, 4) */
1
FROM SUB_SVC ss
WHERE ss.SUB_SVC_ID = ssp.SUB_SVC_ID
AND ss.SUB_SVC_STATUS_ID NOT IN (c_deleted,
c_inactive,
c_add_in_progress,
c_activation_in_progress,
c_courtesy_block_in_progress,
c_mso_block_in_progress,
c_delete_in_progress,
c_deactivation_in_progress,
c_change_in_progress));
DBMS_OUTPUT.PUT_LINE('Total records for updating are : ' || l_total_recs);
OPEN curPPV_CL;
LOOP
FETCH curPPV_CL
BULK COLLECT INTO rs_sub_svc_id limit ilimit;
l_rec_cnt := rs_sub_svc_id.COUNT;
l_curr_cnt := l_curr_cnt + l_rec_cnt;
DBMS_APPLICATION_INFO.set_module (module_name => 'Procedure: PPV_CREDIT_LIMIT',
action_name => 'Updating ' || l_curr_cnt || ' of ' || l_total_recs);
for idx in 1 .. l_rec_cnt
LOOP
UPDATE SUB_SVC_PARM
SET VAL = c_ppv_credit_limit
WHERE SUB_SVC_ID = rs_sub_svc_id(idx)
AND PARM_ID = c_parm_net_ppv_credit_limit;
UPDATE SUB_SVC_PARM
SET VAL = c_ppv_credit_threshold
WHERE SUB_SVC_ID = rs_sub_svc_id(idx)
AND PARM_ID = c_parm_ppv_credit_threshold;
END LOOP;
COMMIT;
l_batch := l_batch + 1;
DBMS_APPLICATION_INFO.set_client_info ('BATCH:' || l_batch * ilimit);
EXIT WHEN l_rec_cnt < ilimit;
IF MOD(l_batch, iCheck) = 0
THEN
SELECT STOP_FLAG
INTO v_stop_flag
FROM DM_PPV_CREDIT_LIMIT
WHERE EXECUTION_ID = p_exid;
END IF;
EXIT WHEN v_stop_flag = 'Y';
END LOOP;
CLOSE curPPV_CL;
DBMS_OUTPUT.PUT_LINE('Have updated records : ' || l_curr_cnt || ' out of total records : ' || l_total_recs );
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END PPV_CREDIT_LIMIT;
create index sub_svc_parm_ixpvs on sub_svc_parm (parm_id, val, sub_svc_id) ;
create index sub_svc_ixss on sub_svc (sub_svc_id, sub_svc_status_id) TABLESPACE "SMP_IDX_SUB_SVC" ;
Plan hash value: 176576580
---------------------------------------------------------------------------- --------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
---------------------------------------------------------------------------- --------------------
| 0 | SELECT STATEMENT | | 1802K| 56M| | 43296 (1)| 59:49:34 |
|* 1 | HASH JOIN | | 1802K| 56M| 37M| 43296 (1)| 59:49:34 |
|* 2 | INDEX FULL SCAN | SUB_SVC_IXSS | 1763K| 16M| | 33679 (1)| 46:32:15 |
|* 3 | INDEX RANGE SCAN| SUB_SVC_PARM_IXPVS | 2308K| 50M| | 1857 (0)| 02:34:00 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("SS"."SUB_SVC_ID"="SSP"."SUB_SVC_ID")
2 - filter("SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','deleted') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','inactive') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','add_in_progress') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','activation_in_progress') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','courtesy_block_in_progress')
AND "SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','mso_block_in_progress')
AND "SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','delete_in_progress') AND
"SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','deactivation_in_progress')
AND "SS"."SUB_SVC_STATUS_ID"<>"FN_GET_STATUS_ID"('SubSvcSpec','change_in_progress'))
3 - access("SSP"."PARM_ID"="GET_PARM_ID"('net_ppv_credit_limit',"GET_CLASS_ID"('SubSv
cSpec'),"GET_SVCID"('smp_cpe_cas')))
filter("SSP"."VAL"<>'140.00')
select sub_svc_id
from sub_svc_parm
where parm_id = get_parm_id(...)
and val <> '140.00'
and sub_svc_id in (select sub_svc_id from sub_svc where sub_svc_status_id not in (...));
select sub_svc_id
from sub_svc
where sub_svc_status_id not in (...)
and sub_svc_id in
(select * from sub_svc_parm where parm_id = get_parm_id(...) and val <> '140.00');
select sub_svc_id
from sub_svc ss
join sub_svc_parm ssp using (sub_svc_id)
where ss.sub_svc_status_id not in (...)
and ssp.parm_id = get_parm_id(...)
and ssp.val <> '140.00');
select sub_svc_id
from sub_svc_parm
where parm_id = get_parm_id(...)
and val <> '140.00'
intersect
select sub_svc_id
from sub_svc
where sub_svc_status_id not in (...));