powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как ускорить select count(*) from table
25 сообщений из 107, страница 2 из 5
Как ускорить select count(*) from table
    #39524746
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подстрекательorcl_1989Вариант с count(*) в oracle самый медленный, лучше использовать count(1) - я предпочитаю, хотя по производительности от count(ID) и count(поле) сильно не отличается.


Где все? Elic? Фотошоп? Анонимус?

count(поле) результат от */0 может отличатся, да и производительность тоже

.....
stax
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524747
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

a count(*) от count(1)? Не поленись, проведи говноработу как обычно. И приложи сравнение. Защитник ты наш.
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524748
murzus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Хотел узнать все варианты для ридонли .
create fbi по всем таблицам требует прав и лишних ресурсов
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524752
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
murzusFogelРК зачем городить?
Можно обойтись rowid

Так,так...
А можно подробнее?

пример реализации идеи (среды нет под рукой, пишу в блокноте из горящего танка ):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
declare
cnt pls_integer := 0;
begin
for i in (select distinct owner||'.'||name as tab from dba_tables) loop
cnt := cnt + execute immediate 'select count(rowid) from '||i.tab;
end loop;
dbms_output.put_line(cnt);
end;



Если таблицы от десятков миллионов строк и больше, набор в курсоре делите ещё на партиции/субпартиции - несмотря на увеличение кол-ва операций суммарно будет быстрее.

как-то так.
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524753
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подстрекательorcl_1989Вариант с count(*) в oracle самый медленный, лучше использовать count(1) - я предпочитаю, хотя по производительности от count(ID) и count(поле) сильно не отличается.


Где все? Elic? Фотошоп? Анонимус?Очень тухлый вброс. Нет огонька.
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524754
dbms_photoshop, извини. Я должен лучше вбрасывать. Попробую в другой теме.
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524760
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подстрекатель,

Речь не про тебя, а про ТС.
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524772
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
select sum(num_rows) from dba_tables;


конечно, это будет незнамо_что, враки, но каков вопрос..
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524775
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawishконечно, это будет незнамо_что, враки, но каков вопрос..Уверен, что дочитал его до конца?murzusВариант с num_rows from dba_tables , не подходит
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524782
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..Stax,

a count(*) от count(1)? Не поленись, проведи говноработу как обычно. И приложи сравнение. Защитник ты наш.

кого защитник? почему Ваш?

зачем мне сравнение, я пользую *

ps
неужели Вам так принципиально постить под ником stax..?

....
stax
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524783
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic..Уверен, что дочитал его до конца?..
и действительно, упс
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524841
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а на какой момент времени сабж? Где консистентность?
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524845
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogel
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
declare
cnt pls_integer := 0;
begin
for i in (select distinct owner||'.'||name as tab from dba_tables) loop
cnt := cnt + execute immediate 'select count(rowid) from '||i.tab;
end loop;
dbms_output.put_line(cnt);
end;





Неверно. Если в БД меняется количество строк то результат не будет соответствовать ни одному состоянию БД.
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524851
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerFogel
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
declare
cnt pls_integer := 0;
begin
for i in (select distinct owner||'.'||name as tab from dba_tables) loop
cnt := cnt + execute immediate 'select count(rowid) from '||i.tab;
end loop;
dbms_output.put_line(cnt);
end;





Неверно. Если в БД меняется количество строк то результат не будет соответствовать ни одному состоянию БД.

можно в начало блока добавить дату для фиксации и считать всё на scn по ней.
так будет кол-во на определённый момент времени. ТС именно это вроде и хотел.
я описал идею, а подробности уже зависят от конкретики требований и рабочей среды.
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524863
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerНеверно. Если в БД меняется количество строк то результат не будет соответствовать ни одному состоянию БД.Положи руку на сердце и скажи, какая нахрен разница, что бессмысленная цифра имеет точность плюс-минус лапоть?
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39524875
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerFogel
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
declare
cnt pls_integer := 0;
begin
for i in (select distinct owner||'.'||name as tab from dba_tables) loop
cnt := cnt + execute immediate 'select count(rowid) from '||i.tab;
end loop;
dbms_output.put_line(cnt);
end;





Неверно. Если в БД меняется количество строк то результат не будет соответствовать ни одному состоянию БД.

перед пересчетом set read only (ето если не одним запросом)

.....
stax
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39525106
murzus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fogelmurzusпропущено...


Так,так...
А можно подробнее?

пример реализации идеи (среды нет под рукой, пишу в блокноте из горящего танка ):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
declare
cnt pls_integer := 0;
begin
for i in (select distinct owner||'.'||name as tab from dba_tables) loop
cnt := cnt + execute immediate 'select count(rowid) from '||i.tab;
end loop;
dbms_output.put_line(cnt);
end;



Если таблицы от десятков миллионов строк и больше, набор в курсоре делите ещё на партиции/субпартиции - несмотря на увеличение кол-ва операций суммарно будет быстрее.

как-то так.


Т.е. хотите сказать, что "select count(rowid) from t "быстрее чем "select count(*) from t?"
Так разве не тоже самое будет?:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
declare
cnt pls_integer := 0;
begin
for i in (select distinct owner||'.'||name as tab from dba_tables) loop
cnt := cnt + execute immediate 'select count(*) from '||i.tab;
end loop;
dbms_output.put_line(cnt);
end;
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39525138
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
murzus
Т.е. хотите сказать, что "select count(rowid) from t "быстрее чем "select count(*) from t?"


Так разве не тоже самое будет?:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
declare
cnt pls_integer := 0;
begin
for i in (select distinct owner||'.'||name as tab from dba_tables) loop
cnt := cnt + execute immediate 'select count(*) from '||i.tab;
end loop;
dbms_output.put_line(cnt);
end;


я "сказал", что PK для данной задачи городить незачем, когда есть rowid

"то же самое" или не "то же самое" - сверьте сами, если интересно.
моё личное мнение: на ооооооооооооочень больших наборах данных (в том числе в объёме учитывается и как хранятся типы данных: 5 колонок number все равно меньше одной колонки varchar2) rowid выигрывает, на небольших наборах, если тип данных занимает мало место для хранения, то * выиграет из-за отсутствия накладных расходов на получение rowid
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39525152
Fogelкогда есть rowidну, а если его нет?

Fogelнакладных расходов на получение rowidрасходы можно и не накладывать.
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39525210
проходил мимо...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelя "сказал", что PK для данной задачи городить незачем, когда есть rowid

"то же самое" или не "то же самое" - сверьте сами, если интересно.
моё личное мнение: на ооооооооооооочень больших наборах данных (в том числе в объёме учитывается и как хранятся типы данных: 5 колонок number все равно меньше одной колонки varchar2) rowid выигрывает, на небольших наборах, если тип данных занимает мало место для хранения, то * выиграет из-за отсутствия накладных расходов на получение rowid
Вы просто не поняли, зачем PK. Индекс обычно значительно меньше, чем таблица, поэтому его целиком будет прочитать быстрее. С rowid это не прокатит.
Звезда в каунте не расшифровывается до списка столбцов, как минимум, когда есть индекс по not null полю - это легко проверить посмотрев на план запроса.
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39525274
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicXMLerНеверно. Если в БД меняется количество строк то результат не будет соответствовать ни одному состоянию БД.Положи руку на сердце и скажи, какая нахрен разница, что бессмысленная цифра имеет точность плюс-минус лапоть?может, у них на это SLA заточен, и всякие EditDA
количество созданных строк в день
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39525391
eupro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Боюсь сама конструкция count(*) не оптимальна, правильнее выбрать некое поле.
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39525412
euproБоюсь сама конструкция count(*) не оптимальна, правильнее выбрать некое поле.select поле from таблица и подсчитывать количество строк на калькуляторе.
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39525429
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Да что ж такое, сколько уже можно поддерживать древние ошибочные мифы!

Нет никакого смысла заменять count(*) на count(1), count(любое_не_NULL_поле), count(поле_первичного_ключа), count(rowid) и прочие фантазии, т.к.:

1. count(*) и так уже оптимален: он просто считает строки! Ему не нужны все поля и, уж тем более, он их ни с чем не сравнивает. Оракл сам выберет что лучше: фулсканить ли таблицу или фастфулсканить какой-нибудь индекс и если - да, то какой, но это, естественно, при условии что вы не меняли дефолтные параметры (например, занижение optimizer_index_cost_adj может привести к index full scan вместо index fast full scan)

2. У Оракла есть трансформация "Count(col) to Count(*) (CNT)", которая превращает count(0), count(1), count(любое_поле) в count(*). Так что реально в таких случаях оракл перепишет ваш запрос на count(*).
Эту трансформацию ораклу как раз пришлось разработать из-за таких дурацких мифов, чтобы эти извращенные запросы работали так же эффективно как и count(*).

3. Даже если вы извратились еще больше и написали count(-1) или count(rowid) (они не входят в "special cases" из п.2), то даже в этом случае оракл все равно построит тот же план что и для count(*)


Это же уже многократно объяснялось...
Вот в очередной раз у Льюиса: https://jonathanlewis.wordpress.com/2015/01/06/count-4/
...
Рейтинг: 0 / 0
Как ускорить select count(*) from table
    #39525637
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicXMLerНеверно. Если в БД меняется количество строк то результат не будет соответствовать ни одному состоянию БД.Положи руку на сердце и скажи, какая нахрен разница, что бессмысленная цифра имеет точность плюс-минус лапоть?

Никакой. Окажись я на месте ТСа ответил бы 4378823478969123469. Пусть проверяют.
...
Рейтинг: 0 / 0
25 сообщений из 107, страница 2 из 5
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как ускорить select count(*) from table
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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