Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как ускорить запрос?  [new]
r900000
Guest
Добрый день.

Не могли бы вы подсказать как ускорить запрос. Если без distinct написать tt.col1,то быстро выполняется просто много записей выводит, а если distinct написать то долго выполняется.

select
distinct
tt.col1 from
(
select
--distinct

bb.kod_idninaccounts as col1
from buchbalans bb,
buchaccount ba

where bb.numberaccount = ba.numberaccount
and ba.numberaccount in (1121.01,1121.04,1121.05,1122.01,1122.02,1122.03,1122.04,1122.05,1130.02,1131.01,1131.02,1131.03,1140.01,1140.02,1140.03,1140.04,1140.05,1141.01,1141.04,1141.05,1142.01,1142.02,1142.03,1142.04,1142.05,1270.01,1270.04,1270.86,1270.87,1270.88,1270.89,1290.23,2170.01,2020.01,2020.02,2020.03,2031.01,2031.04,2031.05,2032.01,2032.02,2032.03,2032.04,2032.05,2170.03)
and bb.kod_fund ='F2-4'
and bb.datebalans<=to_date('30.09.2010','dd.mm.yyyy')
and bb.kod_idninaccounts in
(
select
distinct p.kod_idaccounts
from kodstatistics a, statisticsnin b,basenin n, portfelninaccounts p
where b.typekodstatistics=a.typekod and b.kodstatistics=a.kod
and n.kod_id=b.kod_ninaccounts
and n.nin(+)=p.nin
and p.dateportfel<=to_date('30.09.2010','dd.mm.yyyy')
and p.kod_fund='F2-4'
and a.typekod = 118 and a.kod in (135,136,137,138,139,140)
)
)tt
27 окт 10, 09:52    [9682580]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
StepanovMD
Member

Откуда: Moscow
Сообщений: 452
r900000,
план выполнения запроса приведите.
27 окт 10, 10:10    [9682676]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
r900000
Guest
SELECT STATEMENT, GOAL = ALL_ROWS Cost=658 Cardinality=1 Bytes=95
HASH UNIQUE Cost=658 Cardinality=1 Bytes=95
TABLE ACCESS BY INDEX ROWID Object owner=KUPA Object name=PORTFELNINACCOUNTS Cost=7 Cardinality=1 Bytes=31
NESTED LOOPS Cost=657 Cardinality=1 Bytes=95
NESTED LOOPS Cost=314 Cardinality=49 Bytes=3136
MERGE JOIN CARTESIAN Cost=8 Cardinality=1 Bytes=43
NESTED LOOPS Cost=7 Cardinality=1 Bytes=38
NESTED LOOPS Cost=6 Cardinality=1 Bytes=21
TABLE ACCESS FULL Object owner=KUPA Object name=STATISTICSNIN Cost=6 Cardinality=2 Bytes=26
INDEX UNIQUE SCAN Object owner=KUPA Object name=TYPEKODKODSTATISTICSUNIQUE Cost=0 Cardinality=1 Bytes=8
TABLE ACCESS BY INDEX ROWID Object owner=KUPA Object name=BASENIN Cost=1 Cardinality=1 Bytes=17
INDEX UNIQUE SCAN Object owner=KUPA Object name=KOD_IDUNIQUEBASENIN Cost=0 Cardinality=1
BUFFER SORT Cost=7 Cardinality=45 Bytes=225
INLIST ITERATOR
INDEX RANGE SCAN Object owner=KUPA Object name=ACCNUMBERBUCHACCOUNTUNIQUE2 Cost=1 Cardinality=45 Bytes=225
TABLE ACCESS BY INDEX ROWID Object owner=KUPA Object name=BUCHBALANS Cost=306 Cardinality=322 Bytes=6762
INDEX RANGE SCAN Object owner=KUPA Object name=BALANS_INDEX3 Cost=3 Cardinality=323
INDEX RANGE SCAN Object owner=KUPA Object name=KOD_IDPORNINACC2 Cost=2 Cardinality=6
27 окт 10, 10:13    [9682696]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
Data corruption
Guest
r900000,

and ba.numberaccount in (1121.01,1121.04,...

реально без ошибок выполняется ?
27 окт 10, 10:15    [9682707]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
PaulEr
Member

Откуда:
Сообщений: 3794
r900000,

Сколько строк в итоге возвращает? Возможно проблема с cardinality. Как собираете статистику?Версия Oracle?
27 окт 10, 10:16    [9682718]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
r900000
Guest
Да весь запрос без distinct выполняется а с ним долго не может сделать.
27 окт 10, 10:16    [9682723]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
ant74
Member

Откуда: DE
Сообщений: 164
r900000
Если без distinct написать tt.col1,то быстро выполняется просто много записей выводит, а если distinct написать то долго выполняется.
Без distinct все записи fetch-тите или только первые? Если не все, то попробуйте все прочитать и посмотреть время.
27 окт 10, 10:19    [9682751]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
r900000, "быстро выполняется" - с выборкой всех записей? с включенным /*+ALL_ROWS*/ ?
Сколько уникальных и сколько всего записей?
зы. как же некрасиво приводите запросы и explain'ы...
27 окт 10, 10:22    [9682764]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
r900000
Guest
без distinct возвращает 72893 записей, версия Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod, план снял PL/SQL Developer
27 окт 10, 10:22    [9682770]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
Просто интересно
Guest
А если так:
                  SELECT distinct
                        bb.kod_idninaccounts AS col1
                   FROM buchbalans bb
                  WHERE exists (select 1 from buchaccount ba 
                                 where bb.numberaccount = ba.numberaccount
                                    AND ba.numberaccount IN
                                           (1121.01,
                                            1121.04,
                                            1121.05,
                                            1122.01,
                                            1122.02,
                                            1122.03,
                                            1122.04,
                                            1122.05,
                                            1130.02,
                                            1131.01,
                                            1131.02,
                                            1131.03,
                                            1140.01,
                                            1140.02,
                                            1140.03,
                                            1140.04,
                                            1140.05,
                                            1141.01,
                                            1141.04,
                                            1141.05,
                                            1142.01,
                                            1142.02,
                                            1142.03,
                                            1142.04,
                                            1142.05,
                                            1270.01,
                                            1270.04,
                                            1270.86,
                                            1270.87,
                                            1270.88,
                                            1270.89,
                                            1290.23,
                                            2170.01,
                                            2020.01,
                                            2020.02,
                                            2020.03,
                                            2031.01,
                                            2031.04,
                                            2031.05,
                                            2032.01,
                                            2032.02,
                                            2032.03,
                                            2032.04,
                                            2032.05,
                                            2170.03
                                           ))
                    AND bb.kod_fund = 'F2-4'
                    AND bb.datebalans <= TO_DATE ('30.09.2010', 'dd.mm.yyyy')
                    AND exists (SELECT 1
                                      FROM kodstatistics a,
                                           statisticsnin b,
                                           basenin n,
                                           portfelninaccounts p
                                     WHERE p.kod_idaccounts=bb.kod_idninaccounts 
                                       AND b.typekodstatistics = a.typekod
                                       AND b.kodstatistics = a.kod
                                       AND n.kod_id = b.kod_ninaccounts
                                       AND n.nin(+) = p.nin
                                       AND p.dateportfel <= TO_DATE ('30.09.2010', 'dd.mm.yyyy')
                                       AND p.kod_fund = 'F2-4'
                                       AND a.typekod = 118
                                       AND a.kod IN (135, 136, 137, 138, 139, 140))
27 окт 10, 10:27    [9682819]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
сильно не вдавался, но это:
     MERGE JOIN CARTESIAN			Cost=8	Cardinality=1	Bytes=43
с большой долей вероятности ошибочная оценка оптимизатором кардинальности в 1

А вообще, поменьше слушай всяких идиотов типа "подправь здесь, посмотрим чо получиццо", а учись смотреть в глубь вещей
27 окт 10, 10:31    [9682838]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
ошибочная оценка не этого шага, а подчиненных.

И еще, автор.
Если ты даже код не можешь отформатировать, чтобы облегчить задачу людям, которые могут тебе помочь, то может тебе заняться чем-то более простым?
27 окт 10, 10:33    [9682860]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
брадобрей
сильно не вдавался, но это:
     MERGE JOIN CARTESIAN			Cost=8	Cardinality=1	Bytes=43
с большой долей вероятности ошибочная оценка оптимизатором кардинальности в 1

ну надеюсь понятно, что происходит если реальная кардинальность измеряется в сотнях или тысячах
27 окт 10, 10:41    [9682914]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
r900000
Guest
нет запрос всё равно долго отрабатывает, а насчёт плана как его сюда правильно вставить мне неизвестно
27 окт 10, 10:42    [9682924]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
r900000
а насчёт плана как его сюда правильно вставить мне неизвестно

Но ведь оформить пост на форуме гораздо легче, чем оптимизировать SQL запросы. Если запостить свой план в нормальном виде сложно для тебя, кто заставляет тебя заниматься таким неподъемным делом как оптимизация запросов?
27 окт 10, 10:48    [9682984]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
PaulEr
Member

Откуда:
Сообщений: 3794
r900000
нет запрос всё равно долго отрабатывает, а насчёт плана как его сюда правильно вставить мне неизвестно


Автор, сделайте следующее:

explain plan for
select
distinct
tt.col1 from ...;

select * from table(dbms_xplan.display);

И копируете это все сюда, используя тег SRC.

Ещё лучше, если запустите запрос с хинтом:

select /*+ gather_plan_statistics*/ distinct
tt.col1 from ...;

select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
27 окт 10, 10:55    [9683049]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
r900000
Guest
По этому запросу explain plan for
select
distinct
tt.col1 from ...;

select * from table(dbms_xplan.display);

 
------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name                        | Rows  | Bytes | Cost (%CPU)|
------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |                             |     1 |    95 |   658   (1)|
|   1 |  HASH UNIQUE                      |                             |     1 |    95 |   658   (1)|
|*  2 |   TABLE ACCESS BY INDEX ROWID     | PORTFELNINACCOUNTS          |     1 |    31 |     7   (0)|
|   3 |    NESTED LOOPS                   |                             |     1 |    95 |   657   (1)|
|   4 |     NESTED LOOPS                  |                             |    49 |  3136 |   314   (1)|
|   5 |      MERGE JOIN CARTESIAN         |                             |     1 |    43 |     8   (0)|
|   6 |       NESTED LOOPS                |                             |     1 |    38 |     7   (0)|
|   7 |        NESTED LOOPS               |                             |     1 |    21 |     6   (0)|
|*  8 |         TABLE ACCESS FULL         | STATISTICSNIN               |     2 |    26 |     6   (0)|
|*  9 |         INDEX UNIQUE SCAN         | TYPEKODKODSTATISTICSUNIQUE  |     1 |     8 |     0   (0)|
|  10 |        TABLE ACCESS BY INDEX ROWID| BASENIN                     |     1 |    17 |     1   (0)|
|* 11 |         INDEX UNIQUE SCAN         | KOD_IDUNIQUEBASENIN         |     1 |       |     0   (0)|
|  12 |       BUFFER SORT                 |                             |    45 |   225 |     7   (0)|
|  13 |        INLIST ITERATOR            |                             |       |       |            |
|* 14 |         INDEX RANGE SCAN          | ACCNUMBERBUCHACCOUNTUNIQUE2 |    45 |   225 |     1   (0)|
|  15 |      TABLE ACCESS BY INDEX ROWID  | BUCHBALANS                  |   322 |  6762 |   306   (1)|
|* 16 |       INDEX RANGE SCAN            | BALANS_INDEX3               |   323 |       |     3   (0)|
|* 17 |     INDEX RANGE SCAN              | KOD_IDPORNINACC2            |     6 |       |     2   (0)|
------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - filter("P"."NIN" IS NOT NULL AND "N"."NIN"="P"."NIN")
   8 - filter("B"."TYPEKODSTATISTICS"=118 AND ("B"."KODSTATISTICS"=135 OR 
              "B"."KODSTATISTICS"=136 OR "B"."KODSTATISTICS"=137 OR "B"."KODSTATISTICS"=138 OR 
              "B"."KODSTATISTICS"=139 OR "B"."KODSTATISTICS"=140))
   9 - access("A"."TYPEKOD"=118 AND "B"."KODSTATISTICS"="A"."KOD")
       filter("A"."KOD"=135 OR "A"."KOD"=136 OR "A"."KOD"=137 OR "A"."KOD"=138 OR 
              "A"."KOD"=139 OR "A"."KOD"=140)
  11 - access("N"."KOD_ID"="B"."KOD_NINACCOUNTS")
  14 - access("BA"."NUMBERACCOUNT"=1121.01 OR "BA"."NUMBERACCOUNT"=1121.04 OR 
              "BA"."NUMBERACCOUNT"=1121.05 OR "BA"."NUMBERACCOUNT"=1122.01 OR "BA"."NUMBERACCOUNT"=1122.02 
              OR "BA"."NUMBERACCOUNT"=1122.03 OR "BA"."NUMBERACCOUNT"=1122.04 OR 
              "BA"."NUMBERACCOUNT"=1122.05 OR "BA"."NUMBERACCOUNT"=1130.02 OR "BA"."NUMBERACCOUNT"=1131.01 
              OR "BA"."NUMBERACCOUNT"=1131.02 OR "BA"."NUMBERACCOUNT"=1131.03 OR 
              "BA"."NUMBERACCOUNT"=1140.01 OR "BA"."NUMBERACCOUNT"=1140.02 OR "BA"."NUMBERACCOUNT"=1140.03 
              OR "BA"."NUMBERACCOUNT"=1140.04 OR "BA"."NUMBERACCOUNT"=1140.05 OR 
              "BA"."NUMBERACCOUNT"=1141.01 OR "BA"."NUMBERACCOUNT"=1141.04 OR "BA"."NUMBERACCOUNT"=1141.05 
              OR "BA"."NUMBERACCOUNT"=1142.01 OR "BA"."NUMBERACCOUNT"=1142.02 OR 
              "BA"."NUMBERACCOUNT"=1142.03 OR "BA"."NUMBERACCOUNT"=1142.04 OR "BA"."NUMBERACCOUNT"=1142.05 
              OR "BA"."NUMBERACCOUNT"=1270.01 OR "BA"."NUMBERACCOUNT"=1270.04 OR 
              "BA"."NUMBERACCOUNT"=1270.86 OR "BA"."NUMBERACCOUNT"=1270.87 OR "BA"."NUMBERACCOUNT"=1270.88 
              OR "BA"."NUMBERACCOUNT"=1270.89 OR "BA"."NUMBERACCOUNT"=1290.23 OR 
              "BA"."NUMBERACCOUNT"=2020.01 OR "BA"."NUMBERACCOUNT"=2020.02 OR "BA"."NUMBERACCOUNT"=2020.03 
              OR "BA"."NUMBERACCOUNT"=2031.01 OR "BA"."NUMBERACCOUNT"=2031.04 OR 
              "BA"."NUMBERACCOUNT"=2031.05 OR "BA"."NUMBERACCOUNT"=2032.01 OR "BA"."NUMBERACCOUNT"=2032.02 
              OR "BA"."NUMBERACCOUNT"=2032.03 OR "BA"."NUMBERACCOUNT"=2032.04 OR 
              "BA"."NUMBERACCOUNT"=2032.05 OR "BA"."NUMBERACCOUNT"=2170.01 OR "BA"."NUMBERACCOUNT"=2170.03)
  16 - access("BB"."NUMBERACCOUNT"="BA"."NUMBERACCOUNT" AND "BB"."KOD_FUND"='F2-4' AND 
              "BB"."DATEBALANS"<=TO_DATE('2010-09-30 00:00:00', 'yyyy-mm-dd hh24:mi:ss'))
       filter("BB"."NUMBERACCOUNT"=1121.01 OR "BB"."NUMBERACCOUNT"=1121.04 OR 
              "BB"."NUMBERACCOUNT"=1121.05 OR "BB"."NUMBERACCOUNT"=1122.01 OR "BB"."NUMBERACCOUNT"=1122.02 
              OR "BB"."NUMBERACCOUNT"=1122.03 OR "BB"."NUMBERACCOUNT"=1122.04 OR 
              "BB"."NUMBERACCOUNT"=1122.05 OR "BB"."NUMBERACCOUNT"=1130.02 OR "BB"."NUMBERACCOUNT"=1131.01 
              OR "BB"."NUMBERACCOUNT"=1131.02 OR "BB"."NUMBERACCOUNT"=1131.03 OR 
              "BB"."NUMBERACCOUNT"=1140.01 OR "BB"."NUMBERACCOUNT"=1140.02 OR "BB"."NUMBERACCOUNT"=1140.03 
              OR "BB"."NUMBERACCOUNT"=1140.04 OR "BB"."NUMBERACCOUNT"=1140.05 OR 
              "BB"."NUMBERACCOUNT"=1141.01 OR "BB"."NUMBERACCOUNT"=1141.04 OR "BB"."NUMBERACCOUNT"=1141.05 
              OR "BB"."NUMBERACCOUNT"=1142.01 OR "BB"."NUMBERACCOUNT"=1142.02 OR 
              "BB"."NUMBERACCOUNT"=1142.03 OR "BB"."NUMBERACCOUNT"=1142.04 OR "BB"."NUMBERACCOUNT"=1142.05 
              OR "BB"."NUMBERACCOUNT"=1270.01 OR "BB"."NUMBERACCOUNT"=1270.04 OR 
              "BB"."NUMBERACCOUNT"=1270.86 OR "BB"."NUMBERACCOUNT"=1270.87 OR "BB"."NUMBERACCOUNT"=1270.88 
              OR "BB"."NUMBERACCOUNT"=1270.89 OR "BB"."NUMBERACCOUNT"=1290.23 OR 
              "BB"."NUMBERACCOUNT"=2020.01 OR "BB"."NUMBERACCOUNT"=2020.02 OR "BB"."NUMBERACCOUNT"=2020.03 
              OR "BB"."NUMBERACCOUNT"=2031.01 OR "BB"."NUMBERACCOUNT"=2031.04 OR 
              "BB"."NUMBERACCOUNT"=2031.05 OR "BB"."NUMBERACCOUNT"=2032.01 OR "BB"."NUMBERACCOUNT"=2032.02 
              OR "BB"."NUMBERACCOUNT"=2032.03 OR "BB"."NUMBERACCOUNT"=2032.04 OR 
              "BB"."NUMBERACCOUNT"=2032.05 OR "BB"."NUMBERACCOUNT"=2170.01 OR "BB"."NUMBERACCOUNT"=2170.03)
  17 - access("BB"."KOD_IDNINACCOUNTS"="P"."KOD_IDACCOUNTS" AND "P"."KOD_FUND"='F2-4' AND 
              "P"."DATEPORTFEL"<=TO_DATE('2010-09-30 00:00:00', 'yyyy-mm-dd hh24:mi:ss'))
 
Note
-----
   - 'PLAN_TABLE' is old version
27 окт 10, 12:01    [9683551]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
у тебя в шагах 6 и 7, с высокой долей вероятности, ошибочно оцененая кардинальность = 1.
Из-за этого очень опасный шаг 5.
Для исследования остального надо больше информации.
27 окт 10, 12:06    [9683599]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
зачем в основном запросе таблица ba ?
          from buchbalans bb, 
               buchaccount ba
27 окт 10, 12:13    [9683655]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
r900000
Guest
Этот запрос долго выполняется
select /*+ gather_plan_statistics*/ distinct
tt.col1 from ...;

ba можно убрать, но всё равно долго выполняется
from buchbalans bb,
buchaccount ba5
27 окт 10, 12:23    [9683771]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
в таблице buchaccount поле numberaccount не уникально?
27 окт 10, 12:28    [9683808]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
r900000
Guest
там стоит уникальный индекс
alter table BUCHACCOUNT
add constraint ACCNUMBERBUCHACCOUNTUNIQUE2 unique (NUMBERACCOUNT)
а в BUCHBALANS нет уникальности NUMBERACCOUNT
27 окт 10, 12:35    [9683875]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
PaulEr
Member

Откуда:
Сообщений: 3794
брадобрей
у тебя в шагах 6 и 7, с высокой долей вероятности, ошибочно оцененая кардинальность = 1.
Из-за этого очень опасный шаг 5.
Для исследования остального надо больше информации.


Я бы даже сказал, что там на шаге 8 фуллскан таблицы, которая содержит по мнению оптимизатора 2 строки, кажется подозрительным. Автор, выполните запрос:

select table_name,num_rows,last_analyzed from user_tables where table_name in ('BUCHBALANS','KODSTATISTICS','STATISTICSNIN','BASENIN','PORTFELNINACCOUNTS');

И соберите статистику по этим таблицам для начала так:

exec dbms_stats.gather_table_stats(user,'TABLE_NAME',cascade=>true);
27 окт 10, 12:37    [9683891]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
выходит таблица в запросе лишняя

покажи план без этой таблицы
select distinct tt.col1
  from (select --+ use_hash()
        --distinct
        
         bb.kod_idninaccounts as col1
          from buchbalans bb
         where bb.numberaccount in (1121.01,
                                    1121.04,
                                    1121.05,
                                    1122.01,
                                    1122.02,
                                    1122.03,
                                    1122.04,
                                    1122.05,
                                    1130.02,
                                    1131.01,
                                    1131.02,
                                    1131.03,
                                    1140.01,
                                    1140.02,
                                    1140.03,
                                    1140.04,
                                    1140.05,
                                    1141.01,
                                    1141.04,
                                    1141.05,
                                    1142.01,
                                    1142.02,
                                    1142.03,
                                    1142.04,
                                    1142.05,
                                    1270.01,
                                    1270.04,
                                    1270.86,
                                    1270.87,
                                    1270.88,
                                    1270.89,
                                    1290.23,
                                    2170.01,
                                    2020.01,
                                    2020.02,
                                    2020.03,
                                    2031.01,
                                    2031.04,
                                    2031.05,
                                    2032.01,
                                    2032.02,
                                    2032.03,
                                    2032.04,
                                    2032.05,
                                    2170.03)
           and bb.kod_fund = 'F2-4'
           and bb.datebalans <= to_date('30.09.2010', 'dd.mm.yyyy')
           and bb.kod_idninaccounts in
               (select distinct p.kod_idaccounts
                  from kodstatistics      a,
                       statisticsnin      b,
                       basenin            n,
                       portfelninaccounts p
                 where b.typekodstatistics = a.typekod
                   and b.kodstatistics = a.kod
                   and n.kod_id = b.kod_ninaccounts
                   and n.nin(+) = p.nin
                   and p.dateportfel <= to_date('30.09.2010', 'dd.mm.yyyy')
                   and p.kod_fund = 'F2-4'
                   and a.typekod = 118
                   and a.kod in (135, 136, 137, 138, 139, 140))
              ) tt;
27 окт 10, 12:38    [9683896]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить запрос?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
PaulEr
брадобрей
у тебя в шагах 6 и 7, с высокой долей вероятности, ошибочно оцененая кардинальность = 1.
Из-за этого очень опасный шаг 5.
Для исследования остального надо больше информации.


Я бы даже сказал, что там на шаге 8 фуллскан таблицы, которая содержит по мнению оптимизатора 2 строки, кажется подозрительным.

Паша, так то не гони

8 - filter("B"."TYPEKODSTATISTICS"=118 AND ("B"."KODSTATISTICS"=135 OR 
              "B"."KODSTATISTICS"=136 OR "B"."KODSTATISTICS"=137 OR "B"."KODSTATISTICS"=138 OR 
              "B"."KODSTATISTICS"=139 OR "B"."KODSTATISTICS"=140))
27 окт 10, 12:40    [9683919]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить