Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 грубый count  [new]
grok
Member

Откуда:
Сообщений: 1677
подскажите возможно ли такое сделать

есть большая таблица

select count(*)
from t

работает долго

требуется получить count быстрее, зато можно не точно

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

допустимая ошибка 10%

если способы так сделать ?
3 июл 09, 10:14    [7371848]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
Если по таблице время от времени собирается статистика, то можно поглядеть, сколько в ней было строк на момент последнего сбора статистики
3 июл 09, 10:15    [7371854]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
select table_name, num_rows, last_analyzed
  from user_tables
3 июл 09, 10:16    [7371857]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
Alexey181
Member

Откуда: default city
Сообщений: 904
можно еще матвьюху создать с REFRESH ON COMMIT чтобы точно знать сколько строк
3 июл 09, 10:45    [7372029]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5260
Alexey181
можно еще матвьюху создать с REFRESH ON COMMIT чтобы точно знать сколько строк

может еще и кодом вьюхи поделимся? ;)
3 июл 09, 10:52    [7372083]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
Splain
Member

Откуда: Череповец
Сообщений: 924
grok
нужна грубая оценка числа записей в таблице

допустимая ошибка 10%

если способы так сделать ?


SQL> SET TIMING ON
SQL> SET ECHO ON
SQL> SET LINESIZE 1024
SQL> 
Connected.
SQL> 
SQL> select num_rows, blocks from all_tables where table_name = 'USER_TABLE';

  NUM_ROWS     BLOCKS                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
---------- ----------                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
   6505460     125781                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

Elapsed: 00:00:00.21
SQL> 
SQL> DEFINE n=1
SQL> 
SQL> select count(*)*100/&n as count_ from user_table sample block (&n);
old   1: select count(*)*100/&n as count_ from user_table sample block (&n)
new   1: select count(*)*100/1 as count_ from user_table sample block (1)

    COUNT_                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
----------                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
   7006700                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

Elapsed: 00:00:06.96
SQL> 
SQL> DEFINE n=5
SQL> 
SQL> /
old   1: select count(*)*100/&n as count_ from user_table sample block (&n)
new   1: select count(*)*100/5 as count_ from user_table sample block (5)

    COUNT_                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
----------                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
   6621140                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

Elapsed: 00:00:20.32
SQL> 
SQL> exit

3 июл 09, 11:35    [7372388]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
G.M.
Member

Откуда:
Сообщений: 342
Alexey181
можно еще матвьюху создать с REFRESH ON COMMIT чтобы точно знать сколько строк

А на каком запросе ее делать?
3 июл 09, 12:00    [7372588]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28593
grok
требуется получить count быстрее, зато можно не точно
select count(*) * 1e4 from t sample block(1e-2);
6 июл 09, 11:11    [7379471]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1173
Elic
grok
требуется получить count быстрее, зато можно не точно
select count(*) * 1e4 from t sample block(1e-2);
Уж больно недетерминировано. У меня из 10 раз три раза ноль вернул. :)
6 июл 09, 11:50    [7379768]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1173
автор,
А
SELECT COUNT (DISTINCT PK_id) FROM TABLE
+ unique index ffs не годится?
6 июл 09, 11:54    [7379799]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7797
Блог
oragraf,

а зачем distinct?
6 июл 09, 12:12    [7379944]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
stax..
Guest
oragraf
автор,
А
SELECT COUNT (DISTINCT PK_id) FROM TABLE
+ unique index ffs не годится?

імхо
простой select count(*) from t, сам (оптимизатор) подцепит индекс, возможно его просто нет

а если сделать sample (10) (без block) и умножить на 10?
.....
stax
6 июл 09, 13:25    [7380484]     Ответить | Цитировать Сообщить модератору
 Re: грубый count  [new]
Mishka999
Member

Откуда:
Сообщений: 35
DBA_TABLES.NUM_ROWS + DBA_TAB_MODIFICATIONS.INSERTS - DBA_TAB_MODIFICATINS.DELETES
6 июл 09, 16:21    [7381912]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить