Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 355
подстрекатель
orcl_1989
Вариант с count(*) в oracle самый медленный, лучше использовать count(1) - я предпочитаю, хотя по производительности от count(ID) и count(поле) сильно не отличается.


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


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

.....
stax
22 сен 17, 11:44    [20815142]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
stax..
Guest
Stax,

a count(*) от count(1)? Не поленись, проведи говноработу как обычно. И приложи сравнение. Защитник ты наш.
22 сен 17, 11:46    [20815148]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

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

Хотел узнать все варианты для ридонли .
create fbi по всем таблицам требует прав и лишних ресурсов
22 сен 17, 11:47    [20815152]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Fogel
Member

Откуда:
Сообщений: 237
murzus
Fogel
РК зачем городить?
Можно обойтись rowid


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


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

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;


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

как-то так.
22 сен 17, 11:53    [20815191]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4811
подстрекатель
orcl_1989
Вариант с count(*) в oracle самый медленный, лучше использовать count(1) - я предпочитаю, хотя по производительности от count(ID) и count(поле) сильно не отличается.


Где все? Elic? Фотошоп? Анонимус?
Очень тухлый вброс. Нет огонька.
22 сен 17, 11:54    [20815199]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
подстрекатель
Guest
dbms_photoshop, извини. Я должен лучше вбрасывать. Попробую в другой теме.
22 сен 17, 11:56    [20815210]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4811
подстрекатель,

Речь не про тебя, а про ТС.
22 сен 17, 12:10    [20815279]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15392
select sum(num_rows) from dba_tables;

конечно, это будет незнамо_что, враки, но каков вопрос..
22 сен 17, 12:16    [20815317]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27290
orawish
конечно, это будет незнамо_что, враки, но каков вопрос..
Уверен, что дочитал его до конца?
murzus
Вариант с num_rows from dba_tables , не подходит
22 сен 17, 12:18    [20815330]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 355
stax..
Stax,

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


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

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

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

....
stax
22 сен 17, 12:24    [20815357]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15392
Elic
..Уверен, что дочитал его до конца?..

и действительно, упс
22 сен 17, 12:25    [20815361]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42560
а на какой момент времени сабж? Где консистентность?
22 сен 17, 13:22    [20815647]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
XMLer
Member

Откуда:
Сообщений: 134
Fogel

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;




Неверно. Если в БД меняется количество строк то результат не будет соответствовать ни одному состоянию БД.
22 сен 17, 13:26    [20815661]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Fogel
Member

Откуда:
Сообщений: 237
XMLer
Fogel
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 по ней.
так будет кол-во на определённый момент времени. ТС именно это вроде и хотел.
я описал идею, а подробности уже зависят от конкретики требований и рабочей среды.
22 сен 17, 13:33    [20815697]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27290
XMLer
Неверно. Если в БД меняется количество строк то результат не будет соответствовать ни одному состоянию БД.
Положи руку на сердце и скажи, какая нахрен разница, что бессмысленная цифра имеет точность плюс-минус лапоть?
22 сен 17, 13:51    [20815764]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 355
XMLer
Fogel
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
22 сен 17, 14:03    [20815832]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
Fogel
murzus
пропущено...


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


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

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?"
Так разве не тоже самое будет?:

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;
22 сен 17, 18:42    [20817136]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Fogel
Member

Откуда:
Сообщений: 237
murzus

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


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

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
22 сен 17, 20:11    [20817244]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
дурдом. день открытых дверей.
Guest
Fogel
когда есть rowid
ну, а если его нет?

Fogel
накладных расходов на получение rowid
расходы можно и не накладывать.
22 сен 17, 21:18    [20817348]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 995
Fogel
я "сказал", что PK для данной задачи городить незачем, когда есть rowid

"то же самое" или не "то же самое" - сверьте сами, если интересно.
моё личное мнение: на ооооооооооооочень больших наборах данных (в том числе в объёме учитывается и как хранятся типы данных: 5 колонок number все равно меньше одной колонки varchar2) rowid выигрывает, на небольших наборах, если тип данных занимает мало место для хранения, то * выиграет из-за отсутствия накладных расходов на получение rowid

Вы просто не поняли, зачем PK. Индекс обычно значительно меньше, чем таблица, поэтому его целиком будет прочитать быстрее. С rowid это не прокатит.
Звезда в каунте не расшифровывается до списка столбцов, как минимум, когда есть индекс по not null полю - это легко проверить посмотрев на план запроса.
23 сен 17, 09:26    [20817764]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 42560
Elic
XMLer
Неверно. Если в БД меняется количество строк то результат не будет соответствовать ни одному состоянию БД.
Положи руку на сердце и скажи, какая нахрен разница, что бессмысленная цифра имеет точность плюс-минус лапоть?
может, у них на это SLA заточен, и всякие EditDA
количество созданных строк в день
23 сен 17, 14:12    [20817974]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
eupro
Member

Откуда:
Сообщений: 19
Боюсь сама конструкция count(*) не оптимальна, правильнее выбрать некое поле.
24 сен 17, 10:06    [20818727]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
звездофобия
Guest
eupro
Боюсь сама конструкция count(*) не оптимальна, правильнее выбрать некое поле.
select поле from таблица и подсчитывать количество строк на калькуляторе.
24 сен 17, 12:51    [20818830]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
xtender
Member

Откуда: Мск
Сообщений: 4509
Да что ж такое, сколько уже можно поддерживать древние ошибочные мифы!

Нет никакого смысла заменять 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/
24 сен 17, 14:43    [20818883]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
XMLer
Member

Откуда:
Сообщений: 134
Elic
XMLer
Неверно. Если в БД меняется количество строк то результат не будет соответствовать ни одному состоянию БД.
Положи руку на сердце и скажи, какая нахрен разница, что бессмысленная цифра имеет точность плюс-минус лапоть?


Никакой. Окажись я на месте ТСа ответил бы 4378823478969123469. Пусть проверяют.
25 сен 17, 10:36    [20819906]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
Все форумы / Oracle Ответить