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

Откуда:
Сообщений: 24
Цель быстро подсчитать реальное количество всех строк в БД.
Вариант с num_rows from dba_tables , не подходит - нужно собирать статистику.
Хинт parallel или что-то типа dbms_parrallel тоже не предлагать.
Какие еще варианты?
22 сен 17, 10:00    [20814597]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27283
murzus
реальное количество всех строк в БД
… никому нафиг не нужно, даже приблизительное.
22 сен 17, 10:05    [20814617]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
ацид
Guest
murzus,

пока ты читаешь результат запроса, количество строк может измениться.
22 сен 17, 10:08    [20814632]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2738
Elic
murzus
реальное количество всех строк в БД
… никому нафиг не нужно, даже приблизительное.

Не скажи, только 2 дня назад выполняли подобную идиотскую просьбу вендора =)
22 сен 17, 10:10    [20814640]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Taciturn12
Member

Откуда:
Сообщений: 73
Добавить PK на таблицу, желательно по одному небольшому полю, если уже есть и скорость подсчета count не удовлетворяет то удовлетвориться этой скоростью либо использовать приблизительное значение (к примеру те же num_rows).
22 сен 17, 10:18    [20814662]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

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

Гранты только селективные
22 сен 17, 10:21    [20814675]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 341
Taciturn12,

автор
Цель быстро подсчитать реальное количество всех строк в БД.

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

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

Или в таблицах БД
22 сен 17, 10:26    [20814693]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 330
murzus,

Странной желание посчитать все строки ....
Если это единоразовый запрос - запустите на выходные.
Если это на постоянке будет - думайте про Primary Key для всех таблиц
22 сен 17, 10:26    [20814695]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
pihel
Member

Откуда: СПБ
Сообщений: 133
murzus,

приблизительный каунт

select 10 * count(*) from T sample block (10);
22 сен 17, 10:36    [20814726]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
MaximaXXL,
"думайте про Primary Key для всех таблиц" -А можно подробнее?
Есть таблицы без PK, создавать их - нет грантов.
22 сен 17, 10:38    [20814740]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
orcl_1989
Member

Откуда:
Сообщений: 20
Вариант с count(*) в oracle самый медленный, лучше использовать count(1) - я предпочитаю, хотя по производительности от count(ID) и count(поле) сильно не отличается.
22 сен 17, 10:39    [20814746]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 341
MaximaXXL
murzus,

Странной желание посчитать все строки ....
Если это единоразовый запрос - запустите на выходные.
Если это на постоянке будет - думайте про Primary Key для всех таблиц

зачем ПК (может і не быть) достаточно "not null" индекса

если нет, напр create index i$t1 on t1(0);

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

Откуда: Киев
Сообщений: 330
murzus
MaximaXXL,
"думайте про Primary Key для всех таблиц" -А можно подробнее?
Есть таблицы без PK, создавать их - нет грантов.


Я так понимаю нет грантов у Вас. И я почему то уверен что Вы знаете ДБА у которых все же есть доступ с правами на создание PK.
т.о. Вы пишете на них письмо (или как Вы коммуницируетесь) где просите создать PK для (список таблиц и полей) и проанализировать последствия (вот даже не представляю что у Вас за база) добавления. В письме указываете для чего Вам понадобились эти PK.
22 сен 17, 10:50    [20814829]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

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

имхо легенда

ps
пользую *
.....
stax
22 сен 17, 10:51    [20814831]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 341
MaximaXXL
murzus
MaximaXXL,
"думайте про Primary Key для всех таблиц" -А можно подробнее?
Есть таблицы без PK, создавать их - нет грантов.


Я так понимаю нет грантов у Вас. И я почему то уверен что Вы знаете ДБА у которых все же есть доступ с правами на создание PK.
т.о. Вы пишете на них письмо (или как Вы коммуницируетесь) где просите создать PK для (список таблиц и полей) и проанализировать последствия (вот даже не представляю что у Вас за база) добавления. В письме указываете для чего Вам понадобились эти PK.

как для чего, для подсчета к-ва записей по совету MaximaXXL

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

Откуда: Киев
Сообщений: 330
Stax
как для чего, для подсчета к-ва записей по совету MaximaXXL

....
stax


ну не сам же ТС придумал себе задачу строки считать хотя и такие бывают
22 сен 17, 11:01    [20814899]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
Кроме индексов ничего нет?(
22 сен 17, 11:08    [20814945]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 341
MaximaXXL,

у меня первый скрипт с dbms_sql был подсчет строк в таблицах схемы (сам придумал)

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

Откуда:
Сообщений: 222
РК зачем городить?
Можно обойтись rowid
22 сен 17, 11:19    [20815009]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1763
Fogel
РК зачем городить?
Можно обойтись rowid
А ты сравни
22 сен 17, 11:24    [20815027]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 341
murzus
Кроме индексов ничего нет?(


в чем проблема? долго? как часто считаете?

СВО сам разберется
где есть индекс - по нему посчитает, где нет - фулл скан таблицы

можно хинт index/index_ffs указать, но надо ли

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

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


Так,так...
А можно подробнее?
22 сен 17, 11:26    [20815035]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

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


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


зачем Вам ПК, ровид, достаточно fbi константы (напр 0) и права на создание индексов

ps
я ж привел пример

.....
stax
22 сен 17, 11:31    [20815064]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
подстрекатель
Guest
orcl_1989
Вариант с count(*) в oracle самый медленный, лучше использовать count(1) - я предпочитаю, хотя по производительности от count(ID) и count(поле) сильно не отличается.


Где все? Elic? Фотошоп? Анонимус?
22 сен 17, 11:41    [20815122]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 341
подстрекатель
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

Откуда:
Сообщений: 222
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
Сообщений: 4805
подстрекатель
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
Сообщений: 4805
подстрекатель,

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

Откуда: Ukraine,Lviv
Сообщений: 341
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

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

Откуда:
Сообщений: 132
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

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

Откуда: Ukraine,Lviv
Сообщений: 341
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

Откуда:
Сообщений: 222
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

Откуда: Запорожье
Сообщений: 42503
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

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

Нет никакого смысла заменять 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

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


Никакой. Окажись я на месте ТСа ответил бы 4378823478969123469. Пусть проверяют.
25 сен 17, 10:36    [20819906]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8621
XMLer
Никакой. Окажись я на месте ТСа ответил бы 4378823478969123469. Пусть проверяют.


Ну разница eсть. Пример. Разработчики тестируют Informatica workflow. Лог показывает чтение source идет со скоростью N строк в секунду. Это хорошо или плохо? Не зная числа строк в production source мы не можем эстраполировать время выполнения workflow в production. Так-что приходится давать разработчикам числo строк. Правда микроны тут не нужны и NUM_ROWS от dbms_stats вполне достаточно.

SY.
25 сен 17, 13:41    [20820582]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 330
SY,

Но это обычно для 1-10 таблиц, а не для всей базы. 10-ки таблиц справочники с устоявшимся набором данных и число ВСЕХ строк в таблицах величина абстрактная но никому не нужная =(. Во всяком случае я не могу себе придумать задачу где мне такое может понадобиться. И что делать с вьюхами - ума не приложу.
25 сен 17, 14:21    [20820792]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
SY
XMLer
Никакой. Окажись я на месте ТСа ответил бы 4378823478969123469. Пусть проверяют.


.. приходится давать разработчикам числo строк. Правда микроны тут не нужны и NUM_ROWS от dbms_stats вполне достаточно.

SY.

Это если статистика собирается, а если разница count(*) vs NUM_ROWS >100K то не достаточно.
25 сен 17, 15:47    [20821124]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4104
murzus
Это если статистика собирается, а если разница count(*) vs NUM_ROWS >100K то не достаточно.

А что мешает больше ресурсов выделять на сбор статистики? Что count постоянный гонять, что это, а от статистики может еще какая польза будет. Ну или вред. :)
25 сен 17, 16:01    [20821171]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8621
murzus
Это если статистика собирается, а если разница count(*) vs NUM_ROWS >100K то не достаточно.


А это зависит от COUNT(*). Разница в 100K для таблицы в 100M роли не играет а вот для таблицы в 1M да, и если у тебя по такой растущей таблице статистика не сибирается то у тебя похоже куда больше проблем чем счет строк.

SY.
25 сен 17, 16:03    [20821182]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
Сергей Арсеньев
murzus
Это если статистика собирается, а если разница count(*) vs NUM_ROWS >100K то не достаточно.

А что мешает больше ресурсов выделять на сбор статистики? Что count постоянный гонять, что это, а от статистики может еще какая польза будет. Ну или вред. :)

Маэмо, що маэмо)
25 сен 17, 16:21    [20821252]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
SY
murzus
Это если статистика собирается, а если разница count(*) vs NUM_ROWS >100K то не достаточно.


А это зависит от COUNT(*). Разница в 100K для таблицы в 100M роли не играет а вот для таблицы в 1M да, и если у тебя по такой растущей таблице статистика не сибирается то у тебя похоже куда больше проблем чем счет строк.

SY.


Это был пример, таблиц куча , и разница не устраивает. Вы пытаетесь помочь решить задачу организационно, но цель топика найти техническое решение. Задача если что уже решена, хотел просто узнать -может кто-то уже сталкивался и как-то ускорил.
Но пока ничего нет, кроме как считать индексы или методы типа бить таблицу и считать параллельно(мэп-редьюс).
25 сен 17, 16:31    [20821292]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8621
Да ради бога:

SELECT  OWNER,
        TABLE_NAME,
        XMLCAST(
                XMLQUERY(
                         '/ROWSET/ROW/CNT'
                         PASSING DBMS_XMLGEN.GETXMLTYPE(
                                                        'SELECT  COUNT(*) CNT
                                                           FROM  "' || OWNER || '". "' || TABLE_NAME || '"'
                                                       )
                         RETURNING CONTENT
                        )
                AS NUMBER
               ) ROW_COUNT
  FROM  DBA_TABLES T
  WHERE OWNER = '&SCHEMA_NAME'
    AND TABLE_NAME NOT LIKE 'MLOG$\_%' ESCAPE '\' -- exclude materialized view logs
    AND NVL(IOT_TYPE,'NOT_IOT') NOT IN ('IOT_OVERFLOW','IOT_MAPPING') -- exclude IOT overflow and mapping
    AND TEMPORARY = 'N' -- exclude temporary tables
    AND SECONDARY = 'N' -- exclude Oracle Text index tables and other "non-tables"
    AND TABLE_NAME NOT IN (
                           SELECT  E.TABLE_NAME
                             FROM  DBA_EXTERNAL_TABLES E
                             WHERE E.OWNER = T.OWNER
                          ) -- exclude external tables
  ORDER BY OWNER,
           TABLE_NAME
/


SY.
25 сен 17, 19:55    [20821773]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
mishga
Member

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


Между count(1) и count(*) нет разницы. Вот статья от Кайта: https://asktom.oracle.com/pls/apex/f?p=100:11:1337911574066::NO::P11_QUESTION_ID:1156159920245
26 сен 17, 16:58    [20824521]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
mishga
Member

Откуда: München
Сообщений: 136
murzus
Это был пример, таблиц куча , и разница не устраивает. Вы пытаетесь помочь решить задачу организационно, но цель топика найти техническое решение. Задача если что уже решена, хотел просто узнать -может кто-то уже сталкивался и как-то ускорил.
Но пока ничего нет, кроме как считать индексы или методы типа бить таблицу и считать параллельно(мэп-редьюс).

Ну еще вариант, завести регистровую таблицу с двумя столбцами (имя таблицы, кол-во строк) и прицепить к каждой таблице а БД триггер, который при инсерте будет инкременировать, при делите декрементировать кол-во в строке рестровой таблицы для соответствующей таблицы. Тогда простой селект по регистровой таблице будет мгновенно давать результат :) Но с правами только на селект не получится, разумеется. И это изврат, имхо.
А все-таки какова была цель у этой задачи? Для чего это было нужно, если не секрет?
И каково было таинственное уникальное решение?
26 сен 17, 17:11    [20824575]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4805
mishga
Ну еще вариант, завести регистровую таблицу с двумя столбцами (имя таблицы, кол-во строк) и прицепить к каждой таблице а БД триггер, который при инсерте будет инкременировать, при делите декрементировать кол-во в строке рестровой таблицы для соответствующей таблицы.
Открой для себя dba_tab_modifications, велосипедостроитель.
26 сен 17, 17:26    [20824631]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 341
mishga
Ну еще вариант, ...


и все станут в очередь за номерком

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

Откуда: СПб
Сообщений: 2944
dba_tab_modification я бы сказал неоднозначная штука. там без явного DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO она не то чтобы мгновенно обновляется.
26 сен 17, 18:07    [20824739]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16062
mishga
прицепить к каждой таблице а БД триггер

Фи.
Триггер может быть тихо отключен (как явно, так и в ходе direct-операции), после чего данные в "реестре" потеряют адекватность, никому ничего не сказав.
Если уж очень хочется извратиться - слепите доменный индекс или агрегатное мат. вью.
26 сен 17, 18:31    [20824797]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4805
Shtock
dba_tab_modification я бы сказал неоднозначная штука. там без явного DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO она не то чтобы мгновенно обновляется.
Неоднозначно то, что для минимизации дополнительных издержек надо идти на компромиссы?
26 сен 17, 19:04    [20824883]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Shtock
Member

Откуда: СПб
Сообщений: 2944
Важно, чтобы топикстартер видел эти компромиссы
27 сен 17, 10:21    [20825901]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
mishga
Ну еще вариант, завести регистровую таблицу с двумя столбцами (имя таблицы, кол-во строк) и прицепить к каждой таблице а БД триггер, который при инсерте будет инкременировать, при делите декрементировать кол-во в строке рестровой таблицы для соответствующей таблицы. Тогда простой селект по регистровой таблице будет мгновенно давать результат :) Но с правами только на селект не получится, разумеется. И это изврат, имхо.
А все-таки какова была цель у этой задачи? Для чего это было нужно, если не секрет?
И каково было таинственное уникальное решение?

А все-таки какова была цель у этой задачи? - посчитать кол-во строк.
Для чего это было нужно, если не секрет? -для расчета ресурсов.
И каково было таинственное уникальное решение? - Никакого уникального, loop + execute immediate + count(*). Это долго отсюда и вопрос.
27 сен 17, 10:53    [20826065]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
Shtock
dba_tab_modification я бы сказал неоднозначная штука. там без явного DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO она не то чтобы мгновенно обновляется.

Тоже не подходит, нужно считать по факту, без затей и всяких "ловушек"
27 сен 17, 10:56    [20826080]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 330
murzus
Для чего это было нужно, если не секрет? -для расчета ресурсов.


А, извините, ресурсов чего?
Если у меня таблица из 2 ID колонок - 10 млн строк и таблица с CLOB в 10 млн строк это разные ресурсы, как по мне, хоть и ответ одинаковый 10 млн.
27 сен 17, 11:17    [20826154]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27283
MaximaXXL
murzus
Для чего это было нужно, если не секрет? -для расчета ресурсов.
А, извините, ресурсов чего?
Если у меня таблица из 2 ID колонок - 10 млн строк и таблица с CLOB в 10 млн строк это разные ресурсы, как по мне, хоть и ответ одинаковый 10 млн.
Да ему до фонаря. Кретин задачу поставил - дебил задачу исполнил. Дальше хоть трава не расти.
27 сен 17, 11:20    [20826171]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
однако за время пути собака ...
Guest
MaximaXXL
хоть и ответ одинаковый 10 млн.
Пока считается каунт, пока считаются ресурсы по результатам каунтов, пока по результатам расчетов ... что-то предпринимается, строк у же не одинаково - в одной таблице 10000001, а в другой 9999999 строк. Бегом пересчитывать!
27 сен 17, 11:26    [20826193]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Ломоносов
Guest
однако за время пути собака ...
Пока считается каунт, пока считаются ресурсы по результатам каунтов, пока по результатам расчетов ... что-то предпринимается, строк у же не одинаково - в одной таблице 10000001, а в другой 9999999 строк. Бегом пересчитывать!


если где-то удалилась запись, значит в какой-нибудь таблице она добавилась.
27 сен 17, 11:39    [20826263]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
SY
Да ради бога:

SELECT  OWNER,
        TABLE_NAME,
        XMLCAST(
                XMLQUERY(
                         '/ROWSET/ROW/CNT'
                         PASSING DBMS_XMLGEN.GETXMLTYPE(
                                                        'SELECT  COUNT(*) CNT
                                                           FROM  "' || OWNER || '". "' || TABLE_NAME || '"'
                                                       )
                         RETURNING CONTENT
                        )
                AS NUMBER
               ) ROW_COUNT
  FROM  DBA_TABLES T
  WHERE OWNER = '&SCHEMA_NAME'
    AND TABLE_NAME NOT LIKE 'MLOG$\_%' ESCAPE '\' -- exclude materialized view logs
    AND NVL(IOT_TYPE,'NOT_IOT') NOT IN ('IOT_OVERFLOW','IOT_MAPPING') -- exclude IOT overflow and mapping
    AND TEMPORARY = 'N' -- exclude temporary tables
    AND SECONDARY = 'N' -- exclude Oracle Text index tables and other "non-tables"
    AND TABLE_NAME NOT IN (
                           SELECT  E.TABLE_NAME
                             FROM  DBA_EXTERNAL_TABLES E
                             WHERE E.OWNER = T.OWNER
                          ) -- exclude external tables
  ORDER BY OWNER,
           TABLE_NAME
/


SY.


SY по скорости одинаково, но уже одним select-ом . Спасибо.
27 сен 17, 17:38    [20827462]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
ora601
Member

Откуда:
Сообщений: 749
andrey_anonymous
агрегатное мат. вью.


UNION ALL

C Триггерами тоже забавно. Давайте тогда уже берите Кафку и стримьте дельту в Хадуп и будет реалтайм но латенси каунт :) (Хотя некоторые ентерпрайзы и не до такого додумываются)
28 сен 17, 01:09    [20827954]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2738
murzus
SY
Да ради бога:

SELECT  OWNER,
        TABLE_NAME,
        XMLCAST(
                XMLQUERY(
                         '/ROWSET/ROW/CNT'
                         PASSING DBMS_XMLGEN.GETXMLTYPE(
                                                        'SELECT  COUNT(*) CNT
                                                           FROM  "' || OWNER || '". "' || TABLE_NAME || '"'
                                                       )
                         RETURNING CONTENT
                        )
                AS NUMBER
               ) ROW_COUNT
  FROM  DBA_TABLES T
  WHERE OWNER = '&SCHEMA_NAME'
    AND TABLE_NAME NOT LIKE 'MLOG$\_%' ESCAPE '\' -- exclude materialized view logs
    AND NVL(IOT_TYPE,'NOT_IOT') NOT IN ('IOT_OVERFLOW','IOT_MAPPING') -- exclude IOT overflow and mapping
    AND TEMPORARY = 'N' -- exclude temporary tables
    AND SECONDARY = 'N' -- exclude Oracle Text index tables and other "non-tables"
    AND TABLE_NAME NOT IN (
                           SELECT  E.TABLE_NAME
                             FROM  DBA_EXTERNAL_TABLES E
                             WHERE E.OWNER = T.OWNER
                          ) -- exclude external tables
  ORDER BY OWNER,
           TABLE_NAME
/


SY.


SY по скорости одинаково, но уже одним select-ом . Спасибо.

Насчет одного селекта, вроде бы и правильно, но улыбает =)
28 сен 17, 09:55    [20828302]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

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


SY по скорости одинаково, но уже одним select-ом . Спасибо.

Насчет одного селекта, вроде бы и правильно, но улыбает =)


А что улыбает? Хоть что-то удалось выудить из кучи лирики и вопросов на вопрос.
28 сен 17, 10:41    [20828453]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 995
murzus
AlexFF__|
пропущено...

Насчет одного селекта, вроде бы и правильно, но улыбает =)


А что улыбает?

Тебе селект в параметрах dbms_xmlgen‘а ни на что не намекает?
28 сен 17, 10:57    [20828521]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

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


А что улыбает?

Тебе селект в параметрах dbms_xmlgen‘а ни на что не намекает?

Ну тот-же count(*) , я не понял что вызвало улыбку.
28 сен 17, 11:04    [20828553]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 995
murzus
я не понял что вызвало улыбку.

понимание улыбающимся количества этих селектов.


murzus
SY по скорости одинаково, но уже одним select-ом
28 сен 17, 11:09    [20828567]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
[quot проходил мимо...]
murzus
я не понял что вызвало улыбку.

понимание улыбающимся количества этих селектов.


Да понял я сколько там селектов, я тестировал на схеме с 50 таб.
Про один селект, я говорил что не нужно ПЛСКЛ анонимный блок писать с лупом
Мне вот не смешно, что один ответ из всех комментов, и то не решает.
28 сен 17, 12:06    [20828746]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 341
AlexFF__|
murzus
пропущено...


SY по скорости одинаково, но уже одним select-ом . Спасибо.

Насчет одного селекта, вроде бы и правильно, но улыбает =)


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

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

Откуда:
Сообщений: 24
Stax
AlexFF__|
пропущено...

Насчет одного селекта, вроде бы и правильно, но улыбает =)


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

.....
stax

Откуда у вас информация что не будет согласован? Кто вообще сказал что там будут меняться данные?
Давайте абстрагируемся - пусть БД будет вообще простаивающая.
28 сен 17, 13:26    [20828933]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 341
murzus
Откуда у вас информация что не будет согласован? Кто вообще сказал что там будут меняться данные?
Давайте абстрагируемся - пусть БД будет вообще простаивающая.


мож я неправильно выразился

под несогласованностью я я имелл ввиду,
что если за время со старта и до начала count(*) конкретной таблички к-во строк в ней (табличке) поменяется (с коммит) то ето будет учтено

count(*) будет посчитан на момент старта SELECT COUNT(*) CNT ..., а не на момент SELECT OWNER, ...

конечно если "БД будет вообще простаивающая" то получим согласованный результат

......
stax
28 сен 17, 13:55    [20828998]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 330
Stax

конечно если "БД будет вообще простаивающая" то получим согласованный результат

......
stax


Получим стечение обстоятельств, такое же как и X залилось X удалилось.


murzus
А что улыбает? Хоть что-то удалось выудить из кучи лирики и вопросов на вопрос.


Я бы сказал по другому, люди хотели понять зачем чтоб предложить решение.
Похоже на одно "молодое дарование" которое доказывало мне что SQL убогий язык потому что не может суммировать 2 поля типа Date.
А на вопрос: А зачем их суммировать? В чем смысл?
Говорил: -Ну я так хочу, а он не может.

Посему я думаю что многие хотели Вам помочь, предложить оптимальное решение, но не могли понять для чего это надо ...
28 сен 17, 14:40    [20829090]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4805
MaximaXXL,

А ты не молодое дарование?
По впечатлением примерно в прошлом году закончил универ.
28 сен 17, 14:55    [20829149]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 330
dbms_photoshop,

А чем, извините, навеяно такое впечатление?
28 сен 17, 15:03    [20829172]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4805
MaximaXXL,

судя по стилю
судя по желанию помогать всем немощным, не способным польвоваться поиском, и писать тривиальные запросы тыщу раз написанные
судя по тому, что есть определенные способности, но техника еще не отшлифована
и проч

Я могу ошибаться.
28 сен 17, 15:16    [20829240]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

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

судя по стилю
судя по желанию помогать всем немощным, не способным польвоваться поиском, и писать тривиальные запросы тыщу раз написанные
судя по тому, что есть определенные способности, но техника еще не отшлифована
и проч

Я могу ошибаться.


Можно сразу было указать немощному вариант (иди в поиск, или учись писать запросы)? Зачем засорять эфир и тратить время?
28 сен 17, 16:14    [20829478]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4805
murzus
Можно сразу было указать немощному вариант (иди в поиск, или учись писать запросы)? Зачем засорять эфир и тратить время?
Я стараюсь не отвечать, если пациент необучаем, но иногда таки влезаю в топик, как сделал в этом случае. Каюсь.
28 сен 17, 16:35    [20829554]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
dbms_photoshop
murzus
Можно сразу было указать немощному вариант (иди в поиск, или учись писать запросы)? Зачем засорять эфир и тратить время?
Я стараюсь не отвечать, если пациент необучаем, но иногда таки влезаю в топик, как сделал в этом случае. Каюсь.

И как вы определяете, что пациент не обучаем?
28 сен 17, 16:53    [20829638]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4805
murzus
dbms_photoshop
пропущено...
Я стараюсь не отвечать, если пациент необучаем, но иногда таки влезаю в топик, как сделал в этом случае. Каюсь.

И как вы определяете, что пациент не обучаем?
Я думаю мыслящий человек способен был бы в гугле написать хотя бы oracle count from,
потом походить по ссылкам и понять что все уже обсуждено тыщу раз.

При наличии минимального мышления человек мог бы упростить задачу. Есть текстовый файл, можно ли посчитать число пробелов (или ,например, переносов строк) не читая весь файл. Ответ был бы - можно если один раз это число сохранить во вспомогательной структуре и потом поддерживать при изменениях в файле.

Ну и так далее, если вопрос примитивен, тыщу раз обсуждаля и легко гуглится, то ТС скорее всего необучаем.
С другой стороны понятно что всегда будут утверждающие что count(*) быстрее count(1) или наоборот.

К сообщению приложен файл. Размер - 22Kb
28 сен 17, 17:03    [20829685]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
MaximaXXL
Stax
конечно если "БД будет вообще простаивающая" то получим согласованный результат

......
stax


Получим стечение обстоятельств, такое же как и X залилось X удалилось.


murzus
А что улыбает? Хоть что-то удалось выудить из кучи лирики и вопросов на вопрос.


Я бы сказал по другому, люди хотели понять зачем чтоб предложить решение.
Похоже на одно "молодое дарование" которое доказывало мне что SQL убогий язык потому что не может суммировать 2 поля типа Date.
А на вопрос: А зачем их суммировать? В чем смысл?
Говорил: -Ну я так хочу, а он не может.

Посему я думаю что многие хотели Вам помочь, предложить оптимальное решение, но не могли понять для чего это надо ...


Вы вероятно лучше поняли суть вопроса, чем дбмс_фотошоп, но все равно не до конца.
Это нужно просто для того чтобы быстрее считать реальное количество строк в таблицах чем count(*) from table. Не знаю как еще проще объяснить.
28 сен 17, 17:19    [20829756]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27283
murzus
Это нужно просто для того чтобы быстрее считать реальное количество строк в таблицах чем count(*) from table. Не знаю как еще проще объяснить.
Подсчёт ради подсчета - это и есть необучаемость.
28 сен 17, 17:24    [20829775]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
murzus
Member

Откуда:
Сообщений: 24
Elic
murzus
Это нужно просто для того чтобы быстрее считать реальное количество строк в таблицах чем count(*) from table. Не знаю как еще проще объяснить.
Подсчёт ради подсчета - это и есть необучаемость.


Профит во времени на больших базах.
Переформулирую вопрос: нужно запрос который отработает быстрее чем select count(*) from table , и тоже вернет количество строк в таб.
28 сен 17, 17:33    [20829818]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27283
murzus
Профит во времени на больших базах.
Переформулирую вопрос: нужно запрос который отработает быстрее чем select count(*) from table , и тоже вернет количество строк в таб.
Что в лоб что по лбу: зацикленность на неправильно выбранном способе решения какой-то непонятной задачи да и ещё с претензией на всеобщность "задачи".
28 сен 17, 17:39    [20829839]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
xtender
Member

Откуда: Мск
Сообщений: 4491
murzus,

будет здорово если укажете в своем резюме: считал количество строк во всех таблицах базы данных.
28 сен 17, 19:10    [20830035]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5413
murzus
нужно запрос который отработает быстрее чем select count(*) from table

Актуальную статистику и num_rows в dba_tables не предлагать.

В чистом виде:
- Штурман, приборы!
- 42!
- Что 42?
- А что приборы?

Что уж там мелочиться-то, обвешайте всю базу триггерами на after insert/delete on each row и truncate. Пусть каждый чих записывает +/- 1 или "признак сброса данных" в одну е#$эпическую таблицу.

Потом практически одним sum() group by получите свой результат.

Сударь, раскройте же уже общественности смысл этого "точного" подсчёта звёзд на небе и песчинок в океане!
29 сен 17, 09:53    [20830878]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5413
mishga
Ну еще вариант, завести регистровую таблицу с двумя столбцами (имя таблицы, кол-во строк) и прицепить к каждой таблице а БД триггер

Хм, уже предлагали.
Не заметил при прошлом прочтении топика.
29 сен 17, 09:56    [20830890]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8621
env
mishga
Ну еще вариант, завести регистровую таблицу с двумя столбцами (имя таблицы, кол-во строк) и прицепить к каждой таблице а БД триггер

Хм, уже предлагали.
Не заметил при прошлом прочтении топика.


Ну да, наплевать что INSERT/DELETE в любую таблицу будет сериализирован. Наплевать что deadlock пойдет. Зато count будет быстрый .

SY.
29 сен 17, 14:10    [20831759]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27283
SY
Ну да, наплевать что INSERT/DELETE в любую таблицу будет сериализирован. Наплевать что deadlock пойдет. Зато count будет быстрый .
Соломон, складывается впечатление, что ты ржёшь не над потугами ТС.
29 сен 17, 14:20    [20831796]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Задорнов
Guest
Elic
Соломон, складывается впечатление, что ты ржёшь не над потугами ТС.
У Соломона американский менталитет, он русский юмор не всегда понимает.
29 сен 17, 14:58    [20831922]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
Параноик
Guest
Теперь, когда murzus пишет count(*), у него дергается глаз.
29 сен 17, 15:50    [20832105]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
mishga
Member

Откуда: München
Сообщений: 136
SY
Ну да, наплевать что INSERT/DELETE в любую таблицу будет сериализирован. Наплевать что deadlock пойдет. Зато count будет быстрый .

SY.


Поясните, плиз.
29 сен 17, 17:23    [20832355]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8621
mishga
Поясните, плиз.


А что тут пояснять? Что будет если две сессии хотят обновить ту-же строку? Первая обновляет а вот вторая ждет пока первая не соизволит commit/rollback - вот и сериализация. A теперь первая обновляет строку X а вторая Y. Затем первая пытается обновить строку Y а вторая X получaeм deadlock.

SY.
30 сен 17, 00:07    [20832892]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
уточнятор
Guest
SY
ту-же строку?
глядя со стороны приложения - ту же таблицу.
30 сен 17, 07:18    [20833032]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8621
уточнятор
SY
ту-же строку?
глядя со стороны приложения - ту же таблицу.



А зря в корень - сериализация/deadlock произойдет из-за попытки обновить ту-же строку в "регистровой таблице". А вызвано это будет тригером другой таблицы или напрямую это детали.

SY.
30 сен 17, 13:47    [20833347]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить select count(*) from table  [new]
mishga
Member

Откуда: München
Сообщений: 136
SY,

Я бы сказал, что с триггерами и регистровой таблицей дедлок будет более вероятен, чем без них. Но не обязателен. Зависит от характера транзакций.
6 окт 17, 16:02    [20848809]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
Все форумы / Oracle Ответить