запрос count () занимает больше 20 секунд - PullRequest
1 голос
/ 15 июля 2010

Table_a = 7022536 строк

Table_b (GTT) = 5601 строк

Запрос:

  SELECT COUNT (a.ssn_head)
    FROM table_a a, table_b b
   WHERE b.hoh = a.head AND a.flag = 'Y';

занимает 20+ секунд, чтобы принести 17214 записей.

Объясните план так:

Plan hash value: 1901401324
--------------------------------------------------------------------------------
| Id  | Operation           | Name                           | Rows  | Bytes | C
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                                |     1 |    25 | 1
|   1 |  SORT AGGREGATE     |                                |     1 |    25 |
|*  2 |   HASH JOIN         |                                |   114K|  2801K| 1
|   3 |    TABLE ACCESS FULL| table_b                        | 49188 |   528K|
|   4 |    REMOTE           | table_a                        |  7022K|    93M| 1
--------------------------------------------------------------------------------

table_b (GTT) не имеет индексов ... Я думаю, так как запрос проходит через весь table_b, он всегда будет выполнять полныйСканирование таблиц .. верно?

table_a имеет индекс для head

Как можно ускорить выполнение этого запроса?

Ответы [ 2 ]

5 голосов
/ 15 июля 2010

Хох в table_b уникален?Если это так, то

SELECT COUNT (a.ssn_head)
FROM table_a a, table_b b
WHERE b.hoh = a.head AND a.flag = 'Y';

логически эквивалентно

SELECT COUNT (a.ssn_head)
FROM table_a a
WHERE a.flag = 'Y'
and a.head in (select hoh FROM table_b);

Учитывая, что больший объем данных находится на удаленном сервере, я бы предложил перенести запрос туда с помощью DRIVING_SITEнамек.

SELECT /*+DRIVING_SITE (r) */ COUNT (r.col_a)
FROM owner.table@other r
WHERE r.col_b in (select l.col_c FROM local l);

Это должно работать с синонимом вместо table @ dblink.Но это, вероятно, не будет работать с видом.

3 голосов
/ 15 июля 2010

Создайте материализованное представление table_a на локальном сервере и оперируйте этим.

Может также помочь (мягко) поставить индекс для a.flag, но это будет незначительно по сравнению с локальной работой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...