powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему так медленно SELECT COUNT(*)
25 сообщений из 133, страница 2 из 6
Почему так медленно SELECT COUNT(*)
    #32610082
Alexander Dubrovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olek Alexander DubrovskyНе миф. Практика.Было бы интересно разобраться в этом вопросе. Не могли бы Вы выложить тест, который бы это подтверждал?
О том того, что у count(1) или count(rowid) нет преимуществ, говорит тред на asktom, ссылка на которые приведена.
мне не удалось найти такой "хитрый" пример, который бы подтверждал недостатки count(*). Если у Вас есть - приведите, пожалуйста.

Ща на 9.2 создал большую таблицу - одинаково.
На 8.1.7 пробовали как-то - было быстрее count(1) или count(rowid).
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32610095
olek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по тестам автора топика, count(*) - самый быстрый:)
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611478
B.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
B.
Гость
Alexander Dubrovsky, prostite chto pishu latinitsei - ya na rabote. Text -AskTom, Vi eto chitali. Plus moi opit s Oracle. (*) ili (1), or (8), ili chto ugodno - ne immet znachenia.
Ne zabivaite, chto kogda vi v sessii SELECT count(*) pervyi raz eto vsegda dol'she chem vo 2-i ili v 3-i:

SQL> set timing on
SQL> select count(*) from customer_profile;

COUNT(*)
---------
1651366

real: 6531
SQL> select count(1) from customer_profile;

COUNT(1)
---------
1651366

real: 5281
SQL> select count(*) from customer_profile;

COUNT(*)
---------
1651366

real: 5093
SQL> select count(8) from customer_profile;

COUNT(8)
---------
1651366

real: 5187
SQL> select count(7) from customer_profile;

COUNT(7)
---------
1651366

real: 5406
SQL> select count(*) from customer_profile;

COUNT(*)
---------
1651366

real: 5203
SQL>
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611484
Фотография Ааз
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
B.prostite chto pishu latinitsei - ya na rabote.
Помогает для работающих
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611494
Фотография Markelenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
B.(*) ili (1), or (8), ili chto ugodno - ne immet znachenia .

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> connect scott/tiger
Connected.
SQL> select count(*) from emp;

  COUNT(*)
 ----------
 
         14 

SQL> select count(comm) from emp;

COUNT(COMM)
 -----------
 
           4 

SQL> select count(null) from emp;

COUNT(NULL)
 -----------
 
           0 

SQL> 


2 Fucker

Похоже труд был напрасен...
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611551
B.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
B.
Гость
Cпасибо,
это здорово,но немного непривычно. Попробую привыкнуть
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611556
B.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
B.
Гость
Markelenkov ,
Ваш пример на друную тему.
Речь шла о том, что быстрее.
Здесь вы выбираете сколько всего у вас записей:
select count(*) from emp;

COUNT(*)
----------
14
Здесь вы выбираете сколько у вас comm:

SQL> select count(comm) from emp;

COUNT(COMM)
-----------
4

Здесь вы выбираете сколько у вас null,
SQL> select count(null) from emp;

COUNT(NULL)
-----------
0

но этого вы не можете сделать с count, вы только можете select count (*) from emp where comm is null.
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611560
Фотография Markelenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
B.Markelenkov ,
Ваш пример на друную тему.
Речь шла о том, что быстрее.
Здесь вы выбираете сколько всего у вас записей:
select count(*) from emp;

COUNT(*)
----------
14
Здесь вы выбираете сколько у вас comm:

SQL> select count(comm) from emp;

COUNT(COMM)
-----------
4

Здесь вы выбираете сколько у вас null,
SQL> select count(null) from emp;

COUNT(NULL)
-----------
0

но этого вы не можете сделать с count, вы только можете select count (*) from emp where comm is null.

Все, что я хотел показать в своем примере - это реакция на выделенное мной Ваше категоричное высказывание.
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611580
Oracle newbie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 B еще пример по поводу "(*) ili (1), or (8), ili chto ugodno - ne immet znachenia.".

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
SQL> desc t1;
 Name                                      Null?    Type
  ----------------------------------------- -------- ----------------------------
 
 ID                                        NOT NULL NUMBER
 S1                                                 VARCHAR2( 4000 )

SQL> set autot trace exp
SQL> select  /*+ FIRST_ROWS*/  count(s1) from t1;

Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost= 207  Card= 1 
           Bytes= 2002 )

    1      0    SORT (AGGREGATE)
    2      1      TABLE ACCESS (FULL) OF 'T1' (Cost= 207  Card= 174224  Bytes=
           348796448 )




SQL>  select  /*+ FIRST_ROWS*/  count( 1 ) from t1;

Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost= 4  Card= 1 )
    1      0    SORT (AGGREGATE)
    2      1      INDEX (FAST FULL SCAN) OF 'T1_UNIQ' (UNIQUE) (Cost= 4  Car
          d= 174224 )




SQL>  
.

Как видите я поменял всего лишь названия столбцов в count, но сделал возможным индексный доступ. Будьте осторожны с категоричными высказываниями.

Успехов.
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611603
B.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
B.
Гость
Oracle newbie,
Vi opat' ne o tom.
Count(*) or count(1) or count (*) - eto count na vse recordi tablitsi. Plan takogo selecta zavisit ot indexov:
1* select count(*) from candidate
SQL> /

real: 359

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FAST FULL SCAN) OF 'CANDIDATE_RUN' (UNIQUE) (Cost
=2 Card=3594)





Statistics
----------------------------------------------------------
0 recursive calls
4 db block gets
20 consistent gets
21 physical reads
0 redo size
230 bytes sent via SQL*Net to client
417 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed

SQL> ed
Wrote file afiedt.buf

1* select count(1) from candidate
SQL> /

real: 344

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FAST FULL SCAN) OF 'CANDIDATE_RUN' (UNIQUE) (Cost
=2 Card=3594)





Statistics
----------------------------------------------------------
0 recursive calls
4 db block gets
20 consistent gets
0 physical reads
0 redo size
230 bytes sent via SQL*Net to client
417 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed

SQL> ed
Wrote file afiedt.buf

1* select count(8) from candidate
SQL> /

real: 344

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FAST FULL SCAN) OF 'CANDIDATE_RUN' (UNIQUE) (Cost
=2 Card=3594)





Statistics
----------------------------------------------------------
0 recursive calls
4 db block gets
20 consistent gets
0 physical reads
0 redo size
230 bytes sent via SQL*Net to client
417 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed

SQL> Kogda vi delaete SELECT count(vasha_colonka) - eto SOVSEM DRUGOE, drugoi execution plan, VSE DRUGOE.

SQL> select count(run_sw) from candidate;

real: 359

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FAST FULL SCAN) OF 'CANDIDATE_RUN' (UNIQUE) (Cost
=2 Card=3594 Bytes=3594)





Statistics
----------------------------------------------------------
0 recursive calls
4 db block gets
20 consistent gets
0 physical reads
0 redo size
235 bytes sent via SQL*Net to client
417 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed

(u menia net indexa na run_sw).

Eshe raz.

(*), (1), (8), (6)...etc - eto uslovnie znachki dla count na vse zapisi.
count(cust_id), count(case_id_nmbr), count(name) etc - 'to count na spetseficheskie kolonki. Vi pitaetes' sravnivat' yabloki s apel'sinami. Ya sravnivau yabloki s yablokami.
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611773
Калина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сижу, меряю, пока все одинаково , в рамках погрешности дла рабочего сервера!
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611791
olek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Калинасижу, меряю, пока все одинаково , в рамках погрешности дла рабочего сервера!Вы tkprof'ом сравните: что там различается?
Сторонники count(1)/count(rowid) говорят, что в этом случае должно быть меньше рекурсивных вызовов, нежели при использовании count(*)
Еще интересно было бы узнать, сколько времени (в процентном отношении) тратиться на рекурсивные вызовы и разбор в целом.
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611805
Alexander Dubrovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
B.Alexander Dubrovsky, prostite chto pishu latinitsei - ya na rabote. Text -AskTom, Vi eto chitali. Plus moi opit s Oracle. (*) ili (1), or (8), ili chto ugodno - ne immet znachenia.
Ne zabivaite, chto kogda vi v sessii SELECT count(*) pervyi raz eto vsegda dol'she chem vo 2-i ili v 3-i:
SQL>

Я это знаю. И для достоверности я выполнял каждый оператор по несколько раз подряд.
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611927
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olekСторонники count(1)/count(rowid) говорят, что в этом случае должно быть меньше рекурсивных вызовов, нежели при использовании count(*)
Кому должно? Первый рекурсивный вызов что в случае count(1), что в случае count(*) - поиск not null индекса по этой таблице. И если такой есть - никаких других уже не нужно. А такой как правило есть.
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611967
Oracle newbie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 B.
Извините, но мне показалось что фразой
"(*) ili (1), or (8), ili chto ugodno - ne immet znachenia." вы пытались сказать что не имеет значение что стоит в count. Я показал что изменения столбцов в count меняет план с FTS на FFS, если есть PK и используется CBO.
Если же вы пытались сказать что не имеет значения между * и литералом, то прошу прощения.

Успехов.
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32611972
olek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВот сцылка на "обоснование" преимуществ count(1)/count(rowid). Источник - (известная) книшка "Подготовка сертифицированных дба" (по тынцу - цитата из оригинального англоязычного издания).
Ваше мнение?

зы. я мнение автора книшки считаю не обоснованным.
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32612122
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olekВаше мнение?
Обоснованием могут быть trace-ы применительно к конкретной версии Oracle либо аналогичные данные. Необходимости разрешать звездочку по словарю данных я не вижу, то есть это место, которое может быть оптимизировано.

Насколько я помню, в документации по восьмерке утверждалось, что писать count(*) больше незачем. А ораклоидам я склонен верить до тех пор, пока явно не убеждаюсь в обратном.

Сейчас я сделал на 9.0.2 trace для select count(*). Запроса, который искал бы поля, я в файле не вижу. Объективности ради - запроса, который искал бы индекс тоже не вижу ;-)
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32612201
Фотография Markelenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
B.Eshe raz.

(*), (1), (8), (6)...etc - eto uslovnie znachki dla count na vse zapisi...

Не сходить ли почитать документацию?
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32612263
Oracle newbie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 softwarer
смотреть не sql трейс надо для того чтобы увидеть как селекается какой либо индекс . только CBO может использовать FFS поэтому и трассируй CBO
alter session set events='10053 trace name context forever, level 1'
и в трайсе будет видно какой CBO выбрал путь : индексный или FTS

Успехов.
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32612358
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle newbieи в трайсе будет видно какой CBO выбрал путь : индексный или FTS
Не. План запроса select count(*) и так виден :-) Вопрос был в том, какие рекурсивные запросы выполняются при этом - то есть не заставляет ли count(*) делать дополнительный ненужный select from col$. trace, который я снял, не дает однозначного ответа на этот вопрос.
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32613127
Фотография Fucker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Oracle newbieи в трайсе будет видно какой CBO выбрал путь : индексный или FTS
Не. План запроса select count(*) и так виден :-) Вопрос был в том, какие рекурсивные запросы выполняются при этом - то есть не заставляет ли count(*) делать дополнительный ненужный select from col$. trace, который я снял, не дает однозначного ответа на этот вопрос.

Пришел мужик в секс-шоп купить надувную бабу. Продавец подобрал ему самую навороченную:
из латекса, девственница с вибратором, в общем - полный фарш. Ушел мужик довольный.

На следующий день приносит:
- вот чек, упаковка примите назад
- а что внешность не нравится?
- да нет, очень нравится
- девственница?
- да
- ну а в чем тогда дело?
- НЕ ДАЛА!




Честно, я не издеваюсь, просто я не понимаю, как можно там не найти однозначного ответа.

В чем у тебя проблема?


Fucker
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32613251
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FuckerЧестно, я не издеваюсь, просто я не понимаю, как можно там не найти однозначного ответа.
Хм. Мне удалось :-)

FuckerВ чем у тебя проблема?
Хм. При просмотре трейса я не нашел ни запроса, которым Oracle просматривал бы поля таблицы, ни запроса, которым он получил бы индекс, который можно использовать для ffs. Трейс приведу, буду признателен, если ткнете пальцем. Собственно, рекурсивный запрос там только один, для чего он нужен, я не слишком понимаю, и на основании чего оракл в итоге получил план - тоже.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
/u5/oracle/9.2.0/admin/OLAP/udump/olap_ora_880.trc
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production

*** SESSION ID:(46.106) 2004-07-20 11:44:09.473
APPNAME mod='PL/SQL Developer' mh=1190136663 act='Command Window - New' ah=254318129
=====================
PARSING IN CURSOR #1 len=36 dep=0 uid=0 oct=42 lid=0 tim=7116418302 hv=659427939 ad='90cadd80'
alter session set sql_trace = true
END OF STMT
EXEC #1:c=0,e=187,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=7116406214
=====================
PARSING IN CURSOR #2 len=61 dep=0 uid=0 oct=47 lid=0 tim=7116426547 hv=2707513792 ad='8c884a38'
begin :id := sys.dbms_transaction.local_transaction_id; end;
END OF STMT
PARSE #2:c=0,e=358,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=7116426541
EXEC #2:c=0,e=160,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,tim=7116426882
=====================
PARSING IN CURSOR #2 len=61 dep=0 uid=0 oct=47 lid=0 tim=7116432221 hv=2707513792 ad='8c884a38'
begin :id := sys.dbms_transaction.local_transaction_id; end;
END OF STMT
PARSE #2:c=0,e=152,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=7116432216
EXEC #2:c=0,e=91,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,tim=7116432409
*** 2004-07-20 11:44:21.043
=====================
PARSING IN CURSOR #3 len=21 dep=0 uid=0 oct=3 lid=0 tim=7127705487 hv=3293499221 ad='8c8a3f80'
select 'x' from dual
END OF STMT
PARSE #3:c=0,e=171,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=7127705472
EXEC #3:c=0,e=115,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=7127705826
FETCH #3:c=0,e=159,p=0,cr=3,cu=0,mis=0,r=1,dep=0,og=4,tim=7127706678
STAT #3 id=1 cnt=1 pid=0 pos=1 obj=222 op='TABLE ACCESS FULL DUAL (cr=3 r=0 w=0 time=131 us)'
=====================
PARSING IN CURSOR #3 len=40 dep=1 uid=0 oct=3 lid=0 tim=7127716828 hv=3360804353 ad='8d809900'
select default$ from col$ where rowid=:1
END OF STMT
PARSE #3:c=0,e=801,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=0,tim=7127716820
EXEC #3:c=0,e=579,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=7127717652
FETCH #3:c=0,e=66,p=0,cr=2,cu=0,mis=0,r=1,dep=1,og=4,tim=7127717782
STAT #3 id=1 cnt=1 pid=0 pos=1 obj=21 op='TABLE ACCESS BY USER ROWID COL$ (cr=1 r=0 w=0 time=42 us)'
=====================
PARSING IN CURSOR #1 len=42 dep=0 uid=0 oct=3 lid=0 tim=7127720513 hv=2750412614 ad='90cacd10'
select count(*) from gkhstar.fc_payments
END OF STMT
PARSE #1:c=0,e=5504,p=0,cr=2,cu=0,mis=1,r=0,dep=0,og=4,tim=7127720505
EXEC #1:c=0,e=71,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=7127720702
FETCH #1:c=1560000,e=1645815,p=3544,cr=3555,cu=0,mis=0,r=1,dep=0,og=4,tim=7129367252
=====================
PARSING IN CURSOR #2 len=61 dep=0 uid=0 oct=47 lid=0 tim=7129382574 hv=2707513792 ad='8c884a38'
begin :id := sys.dbms_transaction.local_transaction_id; end;
END OF STMT
PARSE #2:c=0,e=447,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=7129382567
EXEC #2:c=0,e=296,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,tim=7129383079
=====================
PARSING IN CURSOR #2 len=61 dep=0 uid=0 oct=47 lid=0 tim=7129388483 hv=2707513792 ad='8c884a38'
begin :id := sys.dbms_transaction.local_transaction_id; end;
END OF STMT
PARSE #2:c=0,e=148,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=7129388478
EXEC #2:c=0,e=101,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,tim=7129388684
=====================
PARSING IN CURSOR #3 len=21 dep=0 uid=0 oct=3 lid=0 tim=7134797204 hv=3293499221 ad='8c8a3f80'
select 'x' from dual
END OF STMT
PARSE #3:c=0,e=191,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=7134797187
EXEC #3:c=0,e=65,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=7134797443
FETCH #3:c=0,e=203,p=0,cr=3,cu=0,mis=0,r=1,dep=0,og=4,tim=7134798460
STAT #1 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT AGGREGATE (cr=3555 r=3544 w=0 time=1645744 us)'
STAT #1 id=2 cnt=1689085 pid=1 pos=1 obj=101728 op='INDEX FAST FULL SCAN ACT_PMNT_FK_I (cr=3555 r=3544 w=0 time=1231510 us)'
STAT #3 id=1 cnt=1 pid=0 pos=1 obj=222 op='TABLE ACCESS FULL DUAL (cr=3 r=0 w=0 time=173 us)'
=====================
PARSING IN CURSOR #1 len=37 dep=0 uid=0 oct=42 lid=0 tim=7134807115 hv=3676133329 ad='90a79a68'
alter session set sql_trace = false
END OF STMT
PARSE #1:c=0,e=562,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=7134807109
EXEC #1:c=0,e=115,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=7134807325
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32613644
B.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
B.
Гость
после того, как мне попался этот форум, утром на работу стало приходить ужасно интересно - открываешь форум и читаешь какие-то вопли в свой адрес. причем вопли очень "профессиональные". у вас проблемы? может, конечно, я просто не понимаю специфику росийского оракловского "community", которое иногда сильно смахивает на базар.
еще раз. Direct-Path INSERT:
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96524/c21dlins.htm#10629
LMT:
http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:733126913855

интересно было бы услышать от вас что-нибудь по существу
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32613666
Фотография Fucker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer FuckerЧестно, я не издеваюсь, просто я не понимаю, как можно там не найти однозначного ответа.
Хм. Мне удалось :-)

FuckerВ чем у тебя проблема?
Хм. При просмотре трейса я не нашел ни запроса, которым Oracle просматривал бы поля таблицы, ни запроса, которым он получил бы индекс, который можно использовать для ffs. Трейс приведу, буду признателен, если ткнете пальцем. Собственно, рекурсивный запрос там только один, для чего он нужен, я не слишком понимаю, и на основании чего оракл в итоге получил план - тоже.

Скорее всего это какой-то левый трейс другой сессии. Ведь каждое окошко PL/SQL Developer может работать в своей сессии.

Такие эксперименты лучше делать человеческими инструментами, то бишь SQL*Plus'ом. Тем более, что он генерирует гораздо меньше "всякой левизны", затрудняющей анализ.

Я не буду приводить целиком свой трейс, но вот несколько ключевых фрагментов с рекурсивными вызовами:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
select 

ts#,file#,block#,nvl(bobj#, 0 ),nvl(tab#, 0 ),intcols,nvl(clucols, 0 ),audit$,flags,pctfree$,pctused$,initrans,maxtrans,rowcnt,blkcnt,empcnt,avgspc,

chncnt,avgrln,analyzetime, samplesize,cols,property,nvl(degree, 1 ),nvl(instances, 1 ),avgspc_flb,flbcnt,kernelcols,nvl(trigflag, 

 0 ),nvl(spare1, 0 ),nvl(spare2, 0 ),spare4,nvl(spare3, 0 ) from tab$ where obj#=: 1 
value= 30413 

select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,i.flags, i.property,i.pctfree$,i.initrans,i.maxtrans,i.blevel,i.leafcnt,i.distkey, 

i.lblkkey,i.dblkkey,i.clufac,i.cols,i.analyzetime,i.samplesize,i.dataobj#, 

nvl(i.degree, 1 ),nvl(i.instances, 1 ),i.rowcnt,mod(i.pctthres$, 256 ),i.indmethod#,i.trunccnt,nvl(c.unicols, 0 ),nvl(c.deferrable#+c.valid#, 0 ), 

nvl(i.spare1,i.intcols),i.spare4,spare2,decode(i.pctthres$,null,null, mod(trunc(i.pctthres$/ 256 ), 256 )) from ind$ i, (select enabled, min(cols) 

unicols, min(to_number(bitand(defer, 1 ))) deferrable#, min(to_number(bitand(defer, 4 ))) valid# from cdef$ where obj#=: 1  and enabled >  1  group by 

enabled) c where i.obj#=c.enabled(+) and i.bo#=: 1 
value= 30413 

select pos#,intcol#,col#,spare1 from icol$ where obj#=: 1 
value= 30414 

select 

name,intcol#,segcol#,type#,length,nvl(precision#, 0 ),decode(type#, 2 ,nvl(scale,- 127  /*MAXSB1MINAL*/ ), 178 ,scale, 179 ,scale, 180 ,scale, 181 ,scale, 182 ,

scale, 183 ,scale, 231 ,scale, 0 ),null$,fixedstorage,nvl(deflength, 0 ),default$,rowid,col#,property, charsetid,charsetform,spare1,spare2 from col$ 

where obj#=: 1  order by intcol#
value= 30413 

select 

name,intcol#,segcol#,type#,length,nvl(precision#, 0 ),decode(type#, 2 ,nvl(scale,- 127  /*MAXSB1MINAL*/ ), 178 ,scale, 179 ,scale, 180 ,scale, 181 ,scale, 182 ,

scale, 183 ,scale, 231 ,scale, 0 ),null$,fixedstorage,nvl(deflength, 0 ),default$,rowid,col#,property, charsetid,charsetform,spare1,spare2 from col$ 

where obj#=: 1  order by intcol#
value= 30413 

select con#,obj#,rcon#,enabled,nvl(defer, 0 ) from cdef$ where robj#=: 1 
value= 30413 

select con#,type#,condlength,intcols,robj#,rcon#,match#,refact,nvl(enabled, 0 ),rowid,cols,nvl(defer, 0 ),mtime,nvl(spare1, 0 ) from cdef$ where 

obj#=: 1 
value= 30413 

select intcol#,nvl(pos#, 0 ),col# from ccol$ where con#=: 1 
value= 7452 

В таких случаях имеет смысл выдавать кроме всего прочего bind value, которые позволят получить те же результаты, что получил Oracle при
выполнении тестов.




Fucker
...
Рейтинг: 0 / 0
Почему так медленно SELECT COUNT(*)
    #32614502
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FuckerСкорее всего это какой-то левый трейс другой сессии.
Обижаете :-) Собственно, я открыл новую сессию и выполнил там три оператора, которые и есть в трейсе -

alter session set sql_trace = true
select count(*) from gkhstar.fc_payments
alter session set sql_trace = false

Остальное - обрамление, добавляемое девелопером (transaction_id и select 'x' from dual).

FuckerТакие эксперименты лучше делать человеческими инструментами, то бишь SQL*Plus'ом. Тем более, что он генерирует гораздо меньше "всякой левизны", затрудняющей анализ.
Хм. Не забывайте, что я делал это для себя - не предполагая публиковать трейс. Что было открыто - в том и делал.

FuckerЯ не буду приводить целиком свой трейс, но вот несколько ключевых фрагментов с рекурсивными вызовами:
В общем, мне надо углубляться в настройку вывода трейсов.
...
Рейтинг: 0 / 0
25 сообщений из 133, страница 2 из 6
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему так медленно SELECT COUNT(*)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]