powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ускорить подсчет уникальных значений
3 сообщений из 3, страница 1 из 1
Ускорить подсчет уникальных значений
    #39294508
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть длинная таблица с колонкой, в которой сравнительно мало уникальных значений.
По этой колонке есть индекс.
Нужно получить количество уникальных значений.
Объясните, пожалуйста, почему оракл делает фулскан, разве индекс не проще было бы использовать?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
SQL>create table t1 as select trunc(ora_hash(level)/1000000) a, rpad('-', 1000, '-') b, rpad('-', 1000, '-') c, rpad('-', 1000, '-') d, rpad('-', 1000, '-') e, rpad('-', 1000, '-') f from dual connect by level <= 1000000;

Table created.

SQL>create index i1 on t1(a);

Index created.

SQL>call dbms_stats.gather_table_stats(ownname=>'', tabname=>'T1');

Call completed.

SQL>select * from (select a, count(1) c from t1 group by a order by 2 desc) where rownum < 20;
         A          C
---------- ----------
      1964        299
       382        287
      2332        285
       803        284
       816        283
      1633        282
       550        281
       960        281
      4149        280
      2572        280
      3493        279
      2189        278
       145        277
      1725        276
       153        275
       949        275
      2987        274
      3087        274
      3264        273

19 rows selected.

SQL>select min(c), max(c) from (select count(1) c from t1 group by a);
    MIN(C)     MAX(C)
---------- ----------
       179        299

SQL>select count(distinct a) from t1;
COUNT(DISTINCTA)
----------------
            4295

SQL>explain plan for select count(distinct a) from t1;

Explained.

SQL>select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 405047221

---------------------------------------------------------------------------------
| Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |          |     1 |    13 |   271K  (1)| 00:54:22 |
|   1 |  SORT AGGREGATE      |          |     1 |    13 |            |          |
|   2 |   VIEW               | VW_DAG_0 |  4295 | 55835 |   271K  (1)| 00:54:22 |
|   3 |    HASH GROUP BY     |          |  4295 | 17180 |   271K  (1)| 00:54:22 |
|   4 |     TABLE ACCESS FULL| T1       |  1000K|  3906K|   271K  (1)| 00:54:21 |
---------------------------------------------------------------------------------

11 rows selected.

...
Рейтинг: 0 / 0
Ускорить подсчет уникальных значений
    #39294509
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--, почему оракл делает фулсканnullable
...
Рейтинг: 0 / 0
Ускорить подсчет уникальных значений
    #39294589
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicnullableпрошу прощения, упустил из виду
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ускорить подсчет уникальных значений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]