powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
3 сообщений из 28, страница 2 из 2
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
    #37941986
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во всяком случае у этой версии. Надо будет прогнать на репрезентативной выборке.
...
Рейтинг: 0 / 0
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
    #37942288
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockyа, стоп, у оракула что - всё наоборот?
джойн убирается хотя не должен был?Ну тут хитрость в том, что foreign key - вполне себе trusted, а глубже оптимизатор видать не копает. Если сделать невалидный внешний ключ, то все изменится:

Код: 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.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

[...skipped...]

SQL> -- create table detail (id integer, master_id integer references master);
SQL> create table detail (id integer, master_id integer);

Table created.

SQL> insert into detail values (1, 1);

1 row created.

SQL> insert into detail values (2, 2);

1 row created.

SQL> insert into detail values (3, 4);

1 row created.

SQL> alter table detail add foreign key(master_id) references master novalidate;

Table altered.

SQL> explain plan for select d.* from detail d join master m on (d.master_id = m.id);

Explained.

SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------

---------------------------------------------------------------------
| Id  | Operation          | Name      | Rows  | Bytes | Cost (%CPU)|
---------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |     4 |   156 |     3   (0)|
|   1 |  NESTED LOOPS      |           |     4 |   156 |     3   (0)|
|   2 |   TABLE ACCESS FULL| DETAIL    |     3 |    78 |     3   (0)|
|*  3 |   INDEX RANGE SCAN | MASTER_PK |     1 |    13 |     0   (0)|
---------------------------------------------------------------------

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

   3 - access("D"."MASTER_ID"="M"."ID")

Note
-----
   - 'PLAN_TABLE' is old version

18 rows selected.

SQL> select d.* from detail d join master m on (d.master_id = m.id);

        ID  MASTER_ID
---------- ----------
         1          1
         1          1
         2          2
...
Рейтинг: 0 / 0
Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
    #37942369
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov Andreylockyа, стоп, у оракула что - всё наоборот?
джойн убирается хотя не должен был?Ну тут хитрость в том, что foreign key - вполне себе trusted, а глубже оптимизатор видать не копает. Если сделать невалидный внешний ключ, то все изменится:

В общем, одни излишне доверяют, другие - излишне не доверяют
Никто не без греха :(
...
Рейтинг: 0 / 0
3 сообщений из 28, страница 2 из 2
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Не вижу join elimination в Oracle и Sql Server'e для примитивной выборки master-detail
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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