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

Откуда: Middlebury, CT USA
Сообщений: 8680
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

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

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

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

Откуда: Middlebury, CT USA
Сообщений: 8680
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
Сообщений: 8680
Да ради бога:

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

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


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

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

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

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

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

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

Откуда: СПб
Сообщений: 2966
Важно, чтобы топикстартер видел эти компромиссы
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

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


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

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27484
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

Откуда:
Сообщений: 2762
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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
Все форумы / Oracle Ответить