|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
olek Alexander DubrovskyНе миф. Практика.Было бы интересно разобраться в этом вопросе. Не могли бы Вы выложить тест, который бы это подтверждал? О том того, что у count(1) или count(rowid) нет преимуществ, говорит тред на asktom, ссылка на которые приведена. мне не удалось найти такой "хитрый" пример, который бы подтверждал недостатки count(*). Если у Вас есть - приведите, пожалуйста. Ща на 9.2 создал большую таблицу - одинаково. На 8.1.7 пробовали как-то - было быстрее count(1) или count(rowid). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 11:07 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
Судя по тестам автора топика, count(*) - самый быстрый:) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 11:12 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
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> ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 20:32 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
B.prostite chto pishu latinitsei - ya na rabote. Помогает для работающих ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 20:39 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
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.
2 Fucker Похоже труд был напрасен... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 20:53 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
Cпасибо, это здорово,но немного непривычно. Попробую привыкнуть ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 22:20 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 22:32 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
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. Все, что я хотел показать в своем примере - это реакция на выделенное мной Ваше категоричное высказывание. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 22:47 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
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.
Как видите я поменял всего лишь названия столбцов в count, но сделал возможным индексный доступ. Будьте осторожны с категоричными высказываниями. Успехов. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 23:28 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 00:50 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
сижу, меряю, пока все одинаково , в рамках погрешности дла рабочего сервера! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 09:44 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
Калинасижу, меряю, пока все одинаково , в рамках погрешности дла рабочего сервера!Вы tkprof'ом сравните: что там различается? Сторонники count(1)/count(rowid) говорят, что в этом случае должно быть меньше рекурсивных вызовов, нежели при использовании count(*) Еще интересно было бы узнать, сколько времени (в процентном отношении) тратиться на рекурсивные вызовы и разбор в целом. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 09:56 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
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> Я это знаю. И для достоверности я выполнял каждый оператор по несколько раз подряд. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 10:00 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
olekСторонники count(1)/count(rowid) говорят, что в этом случае должно быть меньше рекурсивных вызовов, нежели при использовании count(*) Кому должно? Первый рекурсивный вызов что в случае count(1), что в случае count(*) - поиск not null индекса по этой таблице. И если такой есть - никаких других уже не нужно. А такой как правило есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 10:55 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
2 B. Извините, но мне показалось что фразой "(*) ili (1), or (8), ili chto ugodno - ne immet znachenia." вы пытались сказать что не имеет значение что стоит в count. Я показал что изменения столбцов в count меняет план с FTS на FFS, если есть PK и используется CBO. Если же вы пытались сказать что не имеет значения между * и литералом, то прошу прощения. Успехов. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 11:07 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
softwarerВот сцылка на "обоснование" преимуществ count(1)/count(rowid). Источник - (известная) книшка "Подготовка сертифицированных дба" (по тынцу - цитата из оригинального англоязычного издания). Ваше мнение? зы. я мнение автора книшки считаю не обоснованным. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 11:09 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
olekВаше мнение? Обоснованием могут быть trace-ы применительно к конкретной версии Oracle либо аналогичные данные. Необходимости разрешать звездочку по словарю данных я не вижу, то есть это место, которое может быть оптимизировано. Насколько я помню, в документации по восьмерке утверждалось, что писать count(*) больше незачем. А ораклоидам я склонен верить до тех пор, пока явно не убеждаюсь в обратном. Сейчас я сделал на 9.0.2 trace для select count(*). Запроса, который искал бы поля, я в файле не вижу. Объективности ради - запроса, который искал бы индекс тоже не вижу ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 11:55 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
B.Eshe raz. (*), (1), (8), (6)...etc - eto uslovnie znachki dla count na vse zapisi... Не сходить ли почитать документацию? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 12:14 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
2 softwarer смотреть не sql трейс надо для того чтобы увидеть как селекается какой либо индекс . только CBO может использовать FFS поэтому и трассируй CBO alter session set events='10053 trace name context forever, level 1' и в трайсе будет видно какой CBO выбрал путь : индексный или FTS Успехов. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 12:29 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
Oracle newbieи в трайсе будет видно какой CBO выбрал путь : индексный или FTS Не. План запроса select count(*) и так виден :-) Вопрос был в том, какие рекурсивные запросы выполняются при этом - то есть не заставляет ли count(*) делать дополнительный ненужный select from col$. trace, который я снял, не дает однозначного ответа на этот вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 12:54 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
softwarer Oracle newbieи в трайсе будет видно какой CBO выбрал путь : индексный или FTS Не. План запроса select count(*) и так виден :-) Вопрос был в том, какие рекурсивные запросы выполняются при этом - то есть не заставляет ли count(*) делать дополнительный ненужный select from col$. trace, который я снял, не дает однозначного ответа на этот вопрос. Пришел мужик в секс-шоп купить надувную бабу. Продавец подобрал ему самую навороченную: из латекса, девственница с вибратором, в общем - полный фарш. Ушел мужик довольный. На следующий день приносит: - вот чек, упаковка примите назад - а что внешность не нравится? - да нет, очень нравится - девственница? - да - ну а в чем тогда дело? - НЕ ДАЛА! Честно, я не издеваюсь, просто я не понимаю, как можно там не найти однозначного ответа. В чем у тебя проблема? Fucker ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 16:20 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 16:56 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
после того, как мне попался этот форум, утром на работу стало приходить ужасно интересно - открываешь форум и читаешь какие-то вопли в свой адрес. причем вопли очень "профессиональные". у вас проблемы? может, конечно, я просто не понимаю специфику росийского оракловского "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 интересно было бы услышать от вас что-нибудь по существу ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 19:58 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
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.
В таких случаях имеет смысл выдавать кроме всего прочего bind value, которые позволят получить те же результаты, что получил Oracle при выполнении тестов. Fucker ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 20:20 |
|
Почему так медленно SELECT COUNT(*)
|
|||
---|---|---|---|
#18+
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Я не буду приводить целиком свой трейс, но вот несколько ключевых фрагментов с рекурсивными вызовами: В общем, мне надо углубляться в настройку вывода трейсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2004, 12:51 |
|
|
start [/forum/topic.php?fid=52&msg=32611972&tid=1905960]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 260ms |
total: | 386ms |
0 / 0 |