2013-05-13 2 views
0

Я хочу, чтобы запрос, который выбирает количество строк в каждой таблице , но они не обновляются статистически .so такого запроса не будет точно:Быстрый запрос, который выбирает количество строк в каждой таблице

выберите table_name, num_rows из user_tables

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

с сайта ask tom он предложить функцию включает этот запрос,

'SELECT COUNT (*) от' || p_tname INTO l_columnValue;

такой запрос со счетом (*) действительно медленный, и он не даст мне быстрых результатов.
Есть ли запрос, который может дать мне, сколько строк в таблице происходит быстро?

+1

С ограничениями и требованиями, которые вы предоставили, я собираюсь сказать «нет». Если эта система используется тысячами людей, и каждый из них обновляет данные в разных схемах, нет ни одной таблицы с этой информацией, если вы не создадите представление/таблицу, а во втором заполняете ее, это может быть устаревшим. Ссылка: http://stackoverflow.com/questions/14125731/oracle-row-count-of-table-by-count-vs-num-rows-from-dba-tables – xQbert

+1

Не могу ли я спросить, ПОЧЕМУ вам нужно мгновение + точное количество строк в любых/всех таблицах в любой момент времени? Разумно обновленная статистика должна дать вам разумный (если не точный) ответ, нет? – tbone

+0

xqbert благодарит вас за комментарий @tbone Я хочу удалить пустые таблицы, поэтому я должен быть точным с результатами, чтобы не удалять неправильные таблицы. и excat = много времени. – MMD

ответ

2

Вы сказали в комментарии, что хотите удалить (удалить?) Пустые таблицы. Если вы не хотите, точное количество, но только хочу знать, если таблица пуста вы можете сделать подсчет ярлыка:

select count(*) from table_name where rownum < 2; 

Оптимизатор остановится, когда она достигнет первой строки - план выполнения показывает ' count stopkey "- так будет быстро. Он вернет ноль для пустой таблицы, а другой для таблицы с любыми данными - вы не представляете, сколько данных, но вам, похоже, не все равно.

У вас все еще есть небольшое состояние гонки между счетом и падением, конечно.

Это похоже на очень необычную вещь, которую нужно делать - либо ваше приложение использует таблицу, и в этом случае ее падение сломает что-то, даже если оно пустое; или нет, и в этом случае не имеет значения, имеет ли он (предположительно избыточный), и его можно отбросить независимо. Если вы считаете, что может быть путаница, это звучит так, как будто ваш источник (включая DDL) требует некоторой работы, может быть?


Чтобы проверить, имеет ли таблица в двух схемах строку, просто подсчитайте их из обоих; либо с профсоюзом:

select max(c) from (
    select count(*) as c from schema1.table_name where rownum < 2 
    union all 
    select count(*) as c from schema2.table_name where rownum < 2 
); 

... или с greatest и два суб-выбирает, например:

select greatest(
    (select count(*) from schema1.table_name where rownum < 2), 
    (select count(*) from schema2.table_name where rownum < 2) 
) from dual; 

Либо будет возвращать одно, если либо таблица имеет какие-либо строки, и будет возвращать только нулевой п они были пусты.

+0

Мне нужно проверить, что эта таблица не имеет столбцов в двух схемах (exp: tab1 в schema1 имеет 0 столбцов, но tab1 в schema2 имеет coulumns, она не должна быть отброшена, потому что есть связь между ними), поэтому мы можем настроить querry, что вы упомянутый для 2 схемы? и я подготовил файл дампа, если некоторые из этих пустых таблиц влияют на мое приложение. – MMD

+0

@ user2373598 - Я не понимаю, что вы имеете в виду. Вы имеете в виду строки (т. Е. Данные), а не столбцы? –

+0

интересно, так что это будет быстро, потому что я указываю, чтобы считать только две строки. но «select count (*) from table_name» упоминает имя таблицы с правильным количеством отсчетов? запрос схемы полезен спасибо – MMD

0

Вы можете сделать таблицу для хранения подсчетов для каждой таблицы. Затем установите триггер для запуска INSERT для каждой из таблиц, которые вы подсчитываете, обновляя основную таблицу.

Вам также необходимо включить триггер для DELETE.

+1

Обратите внимание, что для этого потребуется, чтобы каждая операция «INSERT» и «DELETE» на столе необходимо будет сериализовать. Это резко повлияет на масштабируемость системы и, вероятно, приведет к остановке всей системы, если она не будет очень маленькой системой. Существует очень веская причина, по которой Oracle не пытается поддерживать данные такого рода транзакционно. –

+1

Но это приведет к одновременному обновлению двух одновременных обновлений (что приведет к неточным подсчетам) или будет сериализоваться, что замедлит работу ... –

2

Полное раскрытие информации: Я изначально предложил запрос, который специально подсчитывает колонку, которая (a) индексирована и (b) не равна нулю. @AlexPoole и @JustinCave отметили (см. Их комментарии ниже), что Oracle будет оптимизировать COUNT(*), чтобы это сделать в любом случае. Таким образом, этот ответ был значительно изменен.


Там хорошее объяснение here почему User_Tables не должны использоваться для точного подсчета строк, даже если статистика в актуальном состоянии.

Если ваши таблицы имеют индексы, которые можно использовать для ускорения подсчета, выполняя сканирование индекса, а не сканирование таблицы, Oracle будет использовать их. Это сделает счет быстрее, хотя и не мгновенно. Тем не менее, это единственный способ узнать точное количество.

Чтобы проверить наличие пустых (нулевых строк) таблиц, воспользуйтесь ответом, опубликованным Alex Poole.

+1

Oracle будет с радостью оптимизировать 'COUNT (*)', чтобы выполнить проверку индекс первичного ключа, если таковой существует.Не нужно явно указывать «COUNT (indexed_notnull_column)». –

+1

Разве Oracle не может выбрать этот индекс для плана выполнения, даже с 'count (*)'? –

+0

Спасибо, Джастин и Алекс, я этого не знал. Простой запрос «COUNT» с «EXPLAIN PLAN» сказал бы мне столько же. Во всяком случае, это означает, что мой ответ вводит в заблуждение, поэтому я хотел бы удалить его, но ваши комментарии ценны, и я не хочу, чтобы они уходили с ответом. Какие-либо предложения? –

Смежные вопросы