powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / (+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
19 сообщений из 44, страница 2 из 2
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840662
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Victor Cookin,

Какова логика establishment и establishment_license? Не надо ли создать внешний ключ по establishment_id между ними?

Victor Cookinestablishment_id не может быть равен nullПриведи полный DDL всех трех таблиц с их констрейнтами.
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840663
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
кит северных морейто есть на самом деле ему нужны все establishment БЕЗ establishment_license, и с адресами - у кого есть. для этого не нужен FOJ между е и el.

плюс я сильно подозреваю что во вьюхе на самом деле надо было написать where el. establishment_id is null, и тогда оптимизатор разобрался бы в этом сам.это все гадания... и проще спросить напрямую
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840664
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Cookin,

Victor Cookinestablishment_id не может быть равен null

Тьфу ты, конечно же может. То что в базе такого нет, не значит что не может быть висячих лицензий без бизнеса.
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840669
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Моя ошибка в том, что я создал вьюху, которая показывает не только
А) бизнесы без лицензий, но и
Б) лицензии без бизнесов.
Собственно, каждодневная забота, это чтобы не было А).
Б) - это нужно когда чистят базу.
А поскольку в establishment_license стоит FK на establishment.establishment_ID, то и в принципе FULL JOIN во вьюхе не нужен, так как случай Б возможен только при отключении FK, что исключено.
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840670
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Victor Cookin,

если бы establishment_ID был NOT NULL и был FK, оракл бы сам догадался FOJ заменить на left join
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840671
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переписал VW_NOLICENSE_VK с FULL JOIN на LEFT JOIN
Теперь всё работает одинаково быстро.
Странно, Оптимизатор плюёт на FK, получается.
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840672
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Victor CookinСтранно, Оптимизатор плюёт на FK, получается.он не "плюёт", а делает логично, учитывая, что поле establishment_ID nullable в establishment_license
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840673
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Только что проверил establishment_id - и NOT NULL и FK в establishment_license
Вот establishment_license_id - только NOT NULL
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840676
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
DROP TABLE MDHE.ESTABLISHMENT_LICENSE CASCADE CONSTRAINTS;

CREATE TABLE MDHE.ESTABLISHMENT_LICENSE
(
  ESTABLISHMENT_ID          NUMBER              NOT NULL,
  APPROVED_BY               NUMBER,
  NOTES                     VARCHAR2(500 BYTE),
  LICENSE_TYPE_CODE         VARCHAR2(30 BYTE),
  ESTABLISHMENT_LICENSE_ID  NUMBER              NOT NULL,
  BEGIN_DATE                DATE,
  EXPIRATION_DATE           DATE,
  STATUS_CODE               VARCHAR2(30 BYTE)   DEFAULT 'VALID'               NOT NULL,
  IS_CONDITIONAL            CHAR(1 BYTE)        DEFAULT 'N'                   NOT NULL,
  LICENSE_FEE               NUMBER              DEFAULT 0                     NOT NULL,
  CONDITIONAL_REASON_ID     NUMBER(4),
  CONDITIONAL_DAYS_ID       NUMBER(4)
)
TABLESPACE DATA
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          80K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
LOGGING 
NOCOMPRESS 
NOCACHE
MONITORING;

COMMENT ON TABLE MDHE.ESTABLISHMENT_LICENSE IS 'This table contains all the liceses that an establishment has had.
It will generate a history OF licenses AS they EXPIRE AND get renew.';

COMMENT ON COLUMN MDHE.ESTABLISHMENT_LICENSE.STATUS_CODE IS 'To determine the licese status (VALID, CANCEL, ON_HOLD, Etc)
NOTE: No ACTIVE status IS necesary, the Expiration DATE will determine IF license IS active OR NOT.';

COMMENT ON COLUMN MDHE.ESTABLISHMENT_LICENSE.IS_CONDITIONAL IS 'IF "N" then the license is a full license, other wise is a conditional (not to be renewed) license';


CREATE INDEX MDHE.ESTABLISHMENT_LICENSE_ID2 ON MDHE.ESTABLISHMENT_LICENSE
(LICENSE_TYPE_CODE)
LOGGING
TABLESPACE DATA
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );

CREATE INDEX MDHE.ESTABLISHMENT_LICENSE_IX1 ON MDHE.ESTABLISHMENT_LICENSE
(ESTABLISHMENT_ID)
LOGGING
TABLESPACE INDX
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );

CREATE UNIQUE INDEX MDHE.PK_ESTABLISHMENT_LICENSE ON MDHE.ESTABLISHMENT_LICENSE
(ESTABLISHMENT_LICENSE_ID)
LOGGING
TABLESPACE INDX
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );

CREATE OR REPLACE TRIGGER MDHE.SET_LICENSE_STATUS
BEFORE UPDATE OR INSERT ON MDHE.ESTABLISHMENT_LICENSE
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN


  /* first check to see if the exp date has changed, if it has and if the status is valid then check to see if its a valid end date */
  IF ((:NEW.STATUS_CODE = 'VALID') AND (TRUNC(:NEW.Expiration_date) < TRUNC(SYSDATE))) THEN
    -- IF  LicenseEndMonthDayOK(:new.expiration_date, :new.license_type_code) = 0 THEN
   -- IF LicenseEndMonthDayOK(to_date('07/28/2009','mm/dd/yyyy'), 32) = 0 THEN

             RAISE_APPLICATION_ERROR (-20999,'Invalid Expiration Date');
   --  END IF;
  END IF;
  IF :OLD.license_type_code IN  ('08','17','32','39','51','59','81')
     AND :OLD.Expiration_date < TRUNC(SYSDATE)
     AND :OLD.STATUS_CODE = 'VALID'
     AND :OLD.STATUS_CODE = :NEW.STATUS_CODE THEN
         :NEW.STATUS_CODE := 'CANCEL';
  END IF;
  IF :OLD.license_type_code NOT IN  ('08','17','32','39','51','59','81')
     AND :OLD.Expiration_date < TRUNC(SYSDATE)
     AND :OLD.STATUS_CODE = 'VALID'
     AND :OLD.STATUS_CODE = :NEW.STATUS_CODE THEN
       :NEW.STATUS_CODE := 'EXPIRED';
  END IF;

END;
/


ALTER TABLE MDHE.ESTABLISHMENT_LICENSE ADD (
  CONSTRAINT PK_ESTABLISHMENT_LICENSE
  PRIMARY KEY
  (ESTABLISHMENT_LICENSE_ID)
  USING INDEX MDHE.PK_ESTABLISHMENT_LICENSE
  ENABLE VALIDATE);

ALTER TABLE MDHE.ESTABLISHMENT_LICENSE ADD (
  CONSTRAINT FK_LICENCE_ESTABLISHMENT 
  FOREIGN KEY (ESTABLISHMENT_ID) 
  REFERENCES MDHE.ESTABLISHMENT (ESTABLISHMENT_ID)
  ENABLE VALIDATE
,  CONSTRAINT FK_LICENSE_TYPE 
  FOREIGN KEY (LICENSE_TYPE_CODE) 
  REFERENCES MDHE.LICENSE_TYPE (LICENSE_TYPE_CODE)
  DISABLE NOVALIDATE);
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840678
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Victor CookinТолько что проверил establishment_id - и NOT NULL и FK в establishment_licenseне верю©. Покажи трассу 10053 для
Код: plsql
1.
2.
3.
4.
select e.establishment_id, el.establishment_id 
from establishment e 
     full join establishment_license el
     on e.establishment_id  = el.establishment_id 
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840691
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

У меня нет доступа к файлам трасс. Если подскажете как сделать в без записи в файлы, сделаю.
Я - разработчик, не DBA

вот план:

Plan Hash Value : 975423473

-----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
-----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 178273 | 4635098 | 87 | 00:00:01 |
| 1 | VIEW | VW_FOJ_0 | 178273 | 4635098 | 87 | 00:00:01 |
| * 2 | HASH JOIN FULL OUTER | | 178273 | 1782730 | 87 | 00:00:01 |
| 3 | INDEX STORAGE FAST FULL SCAN | PK_ESTABLISHMENT | 28057 | 140285 | 13 | 00:00:01 |
| 4 | INDEX STORAGE FAST FULL SCAN | ESTABLISHMENT_LICENSE_IX1 | 177388 | 886940 | 74 | 00:00:01 |
-----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 2 - access("E"."ESTABLISHMENT_ID"="EL"."ESTABLISHMENT_ID")
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840694
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Код: 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.
SQL Monitoring Report

SQL Text
------------------------------
select/*+ GATHER_PLAN_STATISTICS MONITOR */ e.establishment_id, el.establishment_id from establishment e full join establishment_license el on e.establishment_id = el.establishment_id

Global Information
------------------------------
 Status              :  DONE (ALL ROWS)                                    
 Instance ID         :  3                                                  
 Session             :  MDHE (113:20617)                                   
 SQL ID              :  5mh955qrd56hb                                      
 SQL Execution ID    :  50331651                                           
 Execution Started   :  07/23/2019 11:52:04                                
 First Refresh Time  :  07/23/2019 11:52:04                                
 Last Refresh Time   :  07/23/2019 11:52:05                                
 Duration            :  1s                                                 
 Module/Action       :  TOAD Freeware 13.1.0.78/34909424,64289200,52344192 
 Service             :  mdhetst_dg                                         
 Program             :  Toad.exe                                           
 Fetch Calls         :  224                                                

Global Stats
=================================================
| Elapsed |   Cpu   |  Other   | Fetch | Buffer |
| Time(s) | Time(s) | Waits(s) | Calls |  Gets  |
=================================================
|    0.21 |    0.07 |     0.14 |   224 |    453 |
=================================================

SQL Plan Monitoring Details (Plan Hash Value=975423473)
===================================================================================================================================================================
| Id |            Operation             |           Name            |  Rows   | Cost |   Time    | Start  | Execs |   Rows   |  Mem  | Activity | Activity Detail |
|    |                                  |                           | (Estim) |      | Active(s) | Active |       | (Actual) | (Max) |   (%)    |   (# samples)   |
===================================================================================================================================================================
|  0 | SELECT STATEMENT                 |                           |         |      |         2 |     +0 |     1 |     178K |     . |          |                 |
|  1 |   VIEW                           | VW_FOJ_0                  |    178K |   87 |         2 |     +0 |     1 |     178K |     . |          |                 |
|  2 |    HASH JOIN FULL OUTER          |                           |    178K |   87 |         2 |     +0 |     1 |     178K |   7MB |          |                 |
|  3 |     INDEX STORAGE FAST FULL SCAN | PK_ESTABLISHMENT          |   28057 |   13 |         1 |     +0 |     1 |    28057 |     . |          |                 |
|  4 |     INDEX STORAGE FAST FULL SCAN | ESTABLISHMENT_LICENSE_IX1 |    177K |   74 |         2 |     +0 |     1 |     177K |     . |          |                 |
===================================================================================================================================================================
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840705
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Cookin
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
ALTER TABLE MDHE.ESTABLISHMENT_LICENSE ADD (
  CONSTRAINT FK_LICENCE_ESTABLISHMENT 
  FOREIGN KEY (ESTABLISHMENT_ID) 
  REFERENCES MDHE.ESTABLISHMENT (ESTABLISHMENT_ID)
  ENABLE VALIDATE
,  CONSTRAINT FK_LICENSE_TYPE 
  FOREIGN KEY (LICENSE_TYPE_CODE) 
  REFERENCES MDHE.LICENSE_TYPE (LICENSE_TYPE_CODE)
DISABLE NOVALIDATE);
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840715
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей,

Ну меня не интересует LICENSE_TYPE_CODE. И я его нигде не запрашиваю. И таблицу LICENSE_TYPE не трогаю. Какое это всё может иметь влияние на план?
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840716
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Cookinкит северных морей,

Ну меня не интересует LICENSE_TYPE_CODE. И я его нигде не запрашиваю. И таблицу LICENSE_TYPE не трогаю. Какое это всё может иметь влияние на план?

никакого. я невнимательно прочитал ddl.
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840724
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей,
странное всё таки поведение, может из-за того что EXADATA?

Код: sql
1.
2.
3.
4.
5.
6.
BANNER,CON_ID
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production,0
PL/SQL Release 12.2.0.1.0 - Production,0
CORE	12.2.0.1.0	Production,0
TNS for Linux: Version 12.2.0.1.0 - Production,0
NLSRTL Version 12.2.0.1.0 - Production,0
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840725
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Cookin,

Приведи VW_NOLICENSE_VK для полноты картины.

SY.
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840728
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Victor Cookinстранное всё таки поведениепроверил только что на нескольких базах 12.1-19.3: действительно, несмотря на то, что у оракла есть трансформация FULL_OUTER_JOIN_TO_OUTER, но она не учитывает внешние ключи. Видимо, не подумали, что разработчик может воткнуть FOJ на таблицах, связанных через FK + not null...
...
Рейтинг: 0 / 0
(+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
    #39840729
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

21932966

сейчас я исправил FULL на LEFT и всё заработало, но вроде должно было бы работать и с FULL
...
Рейтинг: 0 / 0
19 сообщений из 44, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / (+) уввеличивает время исполнения, даже когда результат один и тот же. Почему?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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