SQL.RU
 client/server technologies
 
 Главная | Документация | Статьи | Книги | Форум | Опросы | Рассылка | Работа | Поиск | FAQ |

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

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

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

select count(*)
from t

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

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

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

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

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

 Re: грубый count   [new]
Бабичев Сергей
Member

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

 Re: грубый count   [new]
Бабичев Сергей
Member

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

 Re: грубый count   [new]
Alexey181
Member

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

 Re: грубый count   [new]
Viewer
Member

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

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

 Re: грубый count   [new]
Splain
Member

Откуда: Череповец
Сообщений: 904
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

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

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

 Re: грубый count   [new]
Elic
Member

Откуда: Минск
Сообщений: 20557
grok
требуется получить count быстрее, зато можно не точно
select count(*) * 1e4 from t sample block(1e-2);
6 июл 09, 11:11    [7379471] Ответить | Цитировать    Сообщить модератору

 Re: грубый count   [new]
oragraf
Member

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

 Re: грубый count   [new]
oragraf
Member

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

 Re: грубый count   [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 4538
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

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

Все форумы / Oracle Ответить
Generated time: 62ms.
Rambler's Top100 Powered by ActualForum 1.5.3 [s1] Copyright (c) Alex Sibilev 2000-2010