Сделал 8 селектов (на каждый счёт - один селект) вместо одного. Типа:
SELECT WHERE "RCLNT"= '300' AND "RLDNR"= '4A' AND "RBUKRS"= 'KZ01' AND "RACCT"= 'A2680011' AND "DOCTY"= 'P3' AND "BUDAT"= '2017...
Получил сегодня с утра на НЕкэшированной базе время выполнения программы 5 секунд вместо изначальных 726 секунд!
Итого ускорение в 145 раз!
Всё-таки 2 range в одном селекте это много - происходит перемножение. И, например, у меня получилось, что из 25 млн записей сперва отбирается 3 млн, а потом из них всего 24 записи. А в этих 8 запросах отбирается изначально всего по 14 тысяч записей.
SELECT
"RTCUR","RACCT","RCNTR","RRECIN","TSL","HSL","KSL","SGTXT","BUDAT","CPUDT","REFFIDOC"
FROM
"JVSO1"
WHERE
"RCLNT"=:A0 AND "RLDNR"=:A1 AND "RBUKRS"=:A2 AND "RACCT"=:A3 AND "DOCTY"=:A4 AND "BUDAT"=:A5 AND
"REFFIDOC" IN (:A6,:A7,:A8,:A9)
Execution Plan
Sql_id: 0x60xdsv4ws2p
Existing Plan Hash Values with Parse Timestamps:
3466282620 16.MAR.2017 10:46:57 v$sql_plan
3466282620 16.MAR.2017 10:46:57 dba_hist_sql_plan
SELECT STATEMENT ( Estimated Costs = 568 , Estimated #Rows = 1 )
2 TABLE ACCESS BY INDEX ROWID JVSO1
( Estim. Costs = 568 , Estim. #Rows = 1 )
Estim. CPU-Costs = 135,975,375 Estim. IO-Costs = 567
Filter Predicates
1 INDEX SKIP SCAN JVSO1~1
( Estim. Costs = 147 , Estim. #Rows = 14,069 )
Search Columns: 4
Estim. CPU-Costs = 127,768,882 Estim. IO-Costs = 146
Access Predicates Filter Predicates
Причём время 2 запроса из 8 - почти 0,9 секунд, а потом меньше. Вот цифры в микросекундах:
895,163
623,980
658,616
537,345
359,067
175,943
342,895
Происходит уменьшение времени видимо из-за кэширования. Хотя последний запрос 0,34 секунды.
SQL Statement
----------------------------------------------------------------------------------------------------------------------
SELECT
"RTCUR","RACCT","RCNTR","RRECIN","TSL","HSL","KSL","SGTXT","BUDAT","CPUDT","REFFIDOC"
FROM
"JVSO1"
WHERE
"RCLNT"=:A0 AND "RLDNR"=:A1 AND "RBUKRS"=:A2 AND "RACCT"=:A3 AND "DOCTY"=:A4 AND "BUDAT"=:A5 AND
"REFFIDOC" IN (:A6,:A7,:A8,:A9)
Execution Plan
----------------------------------------------------------------------------------------------------------------------
System: T1E
Plan hash value: 3466282620
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 117 | 568 (1)| 00:00:31 |
|* 1 | TABLE ACCESS BY INDEX ROWID| JVSO1 | 1 | 117 | 568 (1)| 00:00:31 |
|* 2 | INDEX SKIP SCAN | JVSO1~1 | 14069 | | 147 (1)| 00:00:08 |
---------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / JVSO1@SEL$1
2 - SEL$1 / JVSO1@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("BUDAT"=:A5 AND "DOCTY"=:A4 AND ("REFFIDOC"=:A6 OR
"REFFIDOC"=:A7 OR "REFFIDOC"=:A8 OR "REFFIDOC"=:A9))
2 - access("RCLNT"=:A0 AND "RBUKRS"=:A2 AND "RLDNR"=:A1 AND "RACCT"=:A3)
filter("RACCT"=:A3)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "RTCUR"[VARCHAR2,15], "RACCT"[VARCHAR2,30], "RCNTR"[VARCHAR2,30],
"RRECIN"[VARCHAR2,6], "TSL"[NUMBER,22], "HSL"[NUMBER,22], "KSL"[NUMBER,22],
"SGTXT"[VARCHAR2,150], "BUDAT"[VARCHAR2,24], "CPUDT"[VARCHAR2,24],
"REFFIDOC"[VARCHAR2,30]
2 - "JVSO1".ROWID[ROWID,10], "RACCT"[VARCHAR2,30]
ИТОГО, остановлюсь на 5 секундах, думаю быстрее не получится ))