powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
10 сообщений из 60, страница 3 из 3
Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
    #39340706
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.В таблице PA строк много, в таблице CB строк меньше тысячи.
Всего в PA порядка 1М строк.
Для фильтра trunc(PA.MOMENT) = trunc(sysdate) около 1-2 тысяч строк.
Для фильтра PA.MOMENT > CB.CHANGED около 3-5 тысяч строк (CB.CHANGED очень редко отстает от текущей даты больше чем на несколько дней).
...
Рейтинг: 0 / 0
Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
    #39340916
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Код: plsql
1.
where trunc(PA.MOMENT) = trunc(sysdate)

Запрос возвращает около десятка строк, выполняется моментально. PA.MOMENT проиндексирован.Где-то ты врёшь.
...
Рейтинг: 0 / 0
Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
    #39340999
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем мне врать, спрашивая совета на форуме?
Запрос выполняется 80мс, я считаю это моментальным.

Код: 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.
------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                     | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                              |                        |     1 |    71 |  1509   (1)| 00:00:19 |
|   1 |  HASH GROUP BY                                |                        |     1 |    71 |  1509   (1)| 00:00:19 |
|   2 |   VIEW                                        |                        |     1 |    71 |  1509   (1)| 00:00:19 |
|*  3 |    FILTER                                     |                        |       |       |            |          |
|   4 |     HASH GROUP BY                             |                        |     1 |   486 |  1509   (1)| 00:00:19 |
|   5 |      NESTED LOOPS OUTER                       |                        |     1 |   486 |  1508   (1)| 00:00:19 |
|   6 |       VIEW                                    |                        |     1 |   450 |  1507   (1)| 00:00:19 |
|   7 |        NESTED LOOPS OUTER                     |                        |     1 |   730 |  1507   (1)| 00:00:19 |
|   8 |         VIEW                                  |                        |     1 |   702 |  1505   (1)| 00:00:19 |
|*  9 |          TABLE ACCESS BY INDEX ROWID          | BM_SERVICE_MONEY       |     1 |    31 |   253   (0)| 00:00:04 |
|  10 |           NESTED LOOPS                        |                        |     1 |   250 |  1505   (1)| 00:00:19 |
|  11 |            NESTED LOOPS                       |                        |     1 |   219 |  1251   (1)| 00:00:16 |
|  12 |             NESTED LOOPS                      |                        |     3 |   624 |  1248   (1)| 00:00:15 |
|  13 |              NESTED LOOPS                     |                        |    22 |  4048 |   908   (1)| 00:00:11 |
|  14 |               NESTED LOOPS                    |                        |    14 |  2436 |   867   (1)| 00:00:11 |
|* 15 |                HASH JOIN                      |                        |   107 | 13803 |   207   (2)| 00:00:03 |
|  16 |                 NESTED LOOPS                  |                        |   302 | 25670 |    11  (10)| 00:00:01 |
|* 17 |                  HASH JOIN                    |                        |   302 | 24160 |    11  (10)| 00:00:01 |
|* 18 |                   TABLE ACCESS FULL           | CASHBACK_STATUS        |     2 |    18 |     3   (0)| 00:00:01 |
|* 19 |                   HASH JOIN                   |                        |   402 | 28542 |     8  (13)| 00:00:01 |
|  20 |                    TABLE ACCESS BY INDEX ROWID| CASHBACK_ACL           |     6 |   234 |     1   (0)| 00:00:01 |
|  21 |                     NESTED LOOPS              |                        |     6 |   288 |     4   (0)| 00:00:01 |
|  22 |                      TABLE ACCESS FULL        | CASHBACK_TYPES         |     1 |     9 |     3   (0)| 00:00:01 |
|* 23 |                      INDEX RANGE SCAN         | CASHBACK_ACL_TYPE      |     6 |       |     0   (0)| 00:00:01 |
|  24 |                    TABLE ACCESS FULL          | CASHBACK               |    67 |  1541 |     3   (0)| 00:00:01 |
|* 25 |                  INDEX UNIQUE SCAN            | CUSTOMERS_PK           |     1 |     5 |     0   (0)| 00:00:01 |
|* 26 |                 TABLE ACCESS FULL             | SERVICES               | 29747 |  1278K|   195   (2)| 00:00:03 |
|* 27 |                TABLE ACCESS FULL              | BM_TARIFF              |     1 |    45 |     6   (0)| 00:00:01 |
|  28 |               TABLE ACCESS BY INDEX ROWID     | BM_SERVICE_TARIFF      |     2 |    20 |     3   (0)| 00:00:01 |
|* 29 |                INDEX RANGE SCAN               | SERTARIFF_SERVICE_IDX  |     2 |       |     1   (0)| 00:00:01 |
|* 30 |              TABLE ACCESS BY INDEX ROWID      | BM_PERIODIC_ACCT       |     1 |    24 |    51   (0)| 00:00:01 |
|* 31 |               INDEX RANGE SCAN                | PER_ACCT_SERVICE_IDX   |    57 |       |     2   (0)| 00:00:01 |
|* 32 |             TABLE ACCESS BY INDEX ROWID       | BM_TARIFFEL            |     1 |    11 |     1   (0)| 00:00:01 |
|* 33 |              INDEX UNIQUE SCAN                | TAREL_PK               |     1 |       |     0   (0)| 00:00:01 |
|* 34 |            INDEX RANGE SCAN                   | SVRM_PERIODIC_ACCT_IDX |   333 |       |     2   (0)| 00:00:01 |
|* 35 |         TABLE ACCESS BY INDEX ROWID           | SERVICES_EXT           |     1 |    28 |     2   (0)| 00:00:01 |
|* 36 |          INDEX RANGE SCAN                     | SRV_EXT_SRV_ID_IDX     |     1 |       |     1   (0)| 00:00:01 |
|* 37 |       TABLE ACCESS BY INDEX ROWID             | DICT                   |     1 |    36 |     1   (0)| 00:00:01 |
|* 38 |        INDEX UNIQUE SCAN                      | DICT_QUNIQ_IDX         |     1 |       |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
    #39341018
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PA это BM_PERIODIC_ACCT.
DDL такой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE BM_PERIODIC_ACCT
(
  PERIODIC_ACCT_ID      NUMBER                  NOT NULL,
  SERVICE_TARIFF_ID     NUMBER                  NOT NULL,
  TARIFFEL_ID           NUMBER                  NOT NULL,
  PERIOD_START          DATE                    NOT NULL,
  PERIOD_STOP           DATE                    NOT NULL,
  MOMENT                DATE                    NOT NULL,
  PERIOD_CF             NUMBER(15,5)            NOT NULL,
  POSTPAID_CALC_MOMENT  DATE
);

CREATE INDEX PER_ACCT_MOMENT_IDX ON BM_PERIODIC_ACCT (MOMENT);
CREATE INDEX PER_ACCT_SERVICE_IDX ON BM_PERIODIC_ACCT (SERVICE_TARIFF_ID);
CREATE INDEX PER_ACCT_START_IDX ON BM_PERIODIC_ACCT (PERIOD_START);
CREATE INDEX PER_ACCT_STOP_IDX ON BM_PERIODIC_ACCT (PERIOD_STOP);
CREATE INDEX PER_ACCT_TARIFFEL_IDX ON BM_PERIODIC_ACCT (TARIFFEL_ID);
CREATE UNIQUE INDEX PERIODIC_ACCT_PK ON BM_PERIODIC_ACCT (PERIODIC_ACCT_ID);
...
Рейтинг: 0 / 0
Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
    #39341051
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.А зачем мне врать, спрашивая совета на форуме?Потому что маловероятно, что ты никак не можешь догнать, что моментальная проиндексированность никакой погоды не делает.
...
Рейтинг: 0 / 0
Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
    #39341123
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я как-бы о другом говорил.
Поскольку PA.MOMENT проиндексировано, то условие PA.MOMENT > CB.CHANGED должно использовать индекс и не должно быть причиной долгого выполнения запроса.
Поэтому причиной долгого выполнения запроса при условии PA.MOMENT > CB.CHANGED должно быть не отсутствие индексов (для PA.MOMENT или CB.CHANGED), а что-то другое.
Но мне непонятно, что это может быть, если при условии trunc(PA.MOMENT) = trunc(sysdate) запрос выполняется моментально, кардинальность в обоих вариантах различается не так уж и сильно.
...
Рейтинг: 0 / 0
Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
    #39341329
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicAlibek B.
Код: plsql
1.
where trunc(PA.MOMENT) = trunc(sysdate)

Запрос возвращает около десятка строк, выполняется моментально. PA.MOMENT проиндексирован.Где-то ты врёшь.Ну почему же
С некоторых версий нормально юзает индекс по дате при TRUNC (INDEX FULL SCAN)
А с использованием Transitive Closure (с 10.2, вроде) может юзать CHECK констрэйнты и использовать нормальный IRS
Код: plsql
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.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
tst> create table t1 as select rownum id, trunc(sysdate)+rownum-5 dt from dual connect by level <= 10;

Table created.

tst> create index t1_idx on t1(dt);

Index created.

tst> exec dbms_stats.gather_table_stats(user, 't1', cascade=>true)

PL/SQL procedure successfully completed.

tst> select count(*) from t1 where trunc(dt) =  trunc(sysdate);

  COUNT(*)
----------
         1

tst> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
SQL_ID  1x3wvdx30ffpy, child number 0
-------------------------------------
select count(*) from t1 where trunc(dt) =  trunc(sysdate)

Plan hash value: 3693069535

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       |     3 (100)|          |
|   1 |  SORT AGGREGATE    |      |     1 |     8 |            |          |
|*  2 |   TABLE ACCESS FULL| T1   |     1 |     8 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(TRUNC(INTERNAL_FUNCTION("DT"))=TRUNC(SYSDATE@!))


19 rows selected.

tst> alter table t1 modify (dt not null);

Table altered.

tst> select count(*) from t1 where trunc(dt) =  trunc(sysdate);

  COUNT(*)
----------
         1

tst> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
SQL_ID  1x3wvdx30ffpy, child number 0
-------------------------------------
select count(*) from t1 where trunc(dt) =  trunc(sysdate)

Plan hash value: 2615206913

---------------------------------------------------------------------------
| Id  | Operation        | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT |        |       |       |     1 (100)|          |
|   1 |  SORT AGGREGATE  |        |     1 |     8 |            |          |
|*  2 |   INDEX FULL SCAN| T1_IDX |     1 |     8 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(TRUNC(INTERNAL_FUNCTION("DT"))=TRUNC(SYSDATE@!))


19 rows selected.

tst> alter table t1 add constraint t1_chk check(dt=trunc(dt));

Table altered.

tst> select count(*) from t1 where trunc(dt) =  trunc(sysdate);

  COUNT(*)
----------
         1

tst> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
SQL_ID  1x3wvdx30ffpy, child number 0
-------------------------------------
select count(*) from t1 where trunc(dt) =  trunc(sysdate)

Plan hash value: 657220527

----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        |       |       |     1 (100)|          |
|   1 |  SORT AGGREGATE   |        |     1 |     8 |            |          |
|*  2 |   INDEX RANGE SCAN| T1_IDX |     1 |     8 |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("DT"=TRUNC(SYSDATE@!))
       filter(TRUNC(INTERNAL_FUNCTION("DT"))=TRUNC(SYSDATE@!))


20 rows selected.

...
Рейтинг: 0 / 0
Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
    #39341334
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровНу почему жеЗдесь и по духу, и по факту не тот случай.
...
Рейтинг: 0 / 0
Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
    #39341381
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровElicпропущено...
Где-то ты врёшь.Ну почему же
С некоторых версий нормально юзает индекс по дате при TRUNC (INDEX FULL SCAN)
А с использованием Transitive Closure (с 10.2, вроде) может юзать CHECK констрэйнты и использовать нормальный IRS
Слишком притянуто за уши )
Первый случай чистый подлог, использующий факт нахождения всех нужных данных в индексе.
Во втором случае фокус не работает с bind.
К запросу ТС это не имеет отношения.
...
Рейтинг: 0 / 0
Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
    #39341412
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет, конечно
Мне просто показалось, что Elic намекает на то, что в данном случае индекс не будет использован (каюсь, смотрел только на заголовок темы, в тонкости не вникал)
...
Рейтинг: 0 / 0
10 сообщений из 60, страница 3 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подскажите, как правильно составить запрос, чтобы эффективно использовались индексы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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