Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / Странности оптимизатора / 10 сообщений из 10, страница 1 из 1
13.09.2007, 19:26
    #34799027
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности оптимизатора
Вопросы:
1) кто знает, зачем тут сортировка в файлах, если записи выдаются по этому плану запроса УЖЕ упорядоченными?
2) почему syscolumns зелёный, а systables нет :)

Код: plaintext
1.
2.
3.
4.
select {+ EXPLAIN} c.colname, c.coltype, c.collength, c.colno 
  from informix.syscolumns c, informix.systables t 
    where c.tabid = t.tabid and t.tabname = 'sd_title'
  order by c.colno ASC
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 --------------------- 
DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:
 --------------------- 

Estimated Cost: 7
Estimated # of Rows Returned: 17
 Temporary Files Required For: Order By 

 --------------------- 
  1) tolik.t: INDEX PATH

    (1) Index Keys: tabname owner
        Lower Index Filter: tolik.t.tabname = 'sd_title'

  2) tolik.c: INDEX PATH

    (1) Index Keys: tabid colno
        Lower Index Filter: tolik.c.tabid = tolik.t.tabid
NESTED LOOP JOIN
...
Рейтинг: 0 / 0
13.09.2007, 19:34
    #34799045
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности оптимизатора
АнатоЛой
1) кто знает, зачем тут сортировка в файлах, если записи выдаются по этому плану запроса УЖЕ упорядоченными?
Ну или почему
Код: plaintext
1.
2.
CREATE TABLE "informix".loy10(id integer);
CREATE TABLE "tolik".loy10(id integer);
во второй строке вызывает ошибку -310 "Table already exists in database",
а вот уникального индекса systables(tabname) нет, в то время как есть уникальный индекс systables(tabname, owner)...
...
Рейтинг: 0 / 0
13.09.2007, 22:03
    #34799259
Выбегалло
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности оптимизатора
АнатоЛойВопросы:
1) кто знает, зачем тут сортировка в файлах, если записи выдаются по этому плану запроса УЖЕ упорядоченными?
2) почему syscolumns зелёный, а systables нет :)

Код: plaintext
1.
2.
3.
4.
select {+ EXPLAIN} c.colname, c.coltype, c.collength, c.colno 
  from informix.syscolumns c, informix.systables t 
    where c.tabid = t.tabid and t.tabname = 'sd_title'
  order by c.colno ASC
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 --------------------- 
DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:
 --------------------- 

Estimated Cost: 7
Estimated # of Rows Returned: 17
 Temporary Files Required For: Order By 

 --------------------- 
  1) tolik.t: INDEX PATH

    (1) Index Keys: tabname owner
        Lower Index Filter: tolik.t.tabname = 'sd_title'

  2) tolik.c: INDEX PATH

    (1) Index Keys: tabid colno
        Lower Index Filter: tolik.c.tabid = tolik.t.tabid
NESTED LOOP JOIN


если вместо tabname = 'sd_title' вы поставите любое другое условие ("<>", BETWEEN, IN (...) ) - вам сразу станет ясно, зачем промежуточная сортировка.
...
Рейтинг: 0 / 0
13.09.2007, 22:06
    #34799265
Выбегалло
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности оптимизатора
АнатоЛой АнатоЛой
1) кто знает, зачем тут сортировка в файлах, если записи выдаются по этому плану запроса УЖЕ упорядоченными?
Ну или почему
Код: plaintext
1.
2.
CREATE TABLE "informix".loy10(id integer);
CREATE TABLE "tolik".loy10(id integer);
во второй строке вызывает ошибку -310 "Table already exists in database",
а вот уникального индекса systables(tabname) нет, в то время как есть уникальный индекс systables(tabname, owner)...

Ну он же не ругается, что нарушена уникальность индекса ? А в документации честно пишут, что имя таблицы должно быть уникальным внутри базы, и владелец нии..волнует. Так вот оно исторически сложилось.
...
Рейтинг: 0 / 0
14.09.2007, 08:48
    #34799624
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности оптимизатора
АнатоЛойВопросы:
1) кто знает, зачем тут сортировка в файлах, если записи выдаются по этому плану запроса УЖЕ упорядоченными?
Они упорядочены по tabname owner tabid colno, информикс не знает что tabname owner tabid уникальны в данном случае и знать не может.
Информикс допускает таблицы с одинаковыми именами и разными владельцами, читайте про ansi совместимые бд.

АнатоЛой2) почему syscolumns зелёный, а systables нет :)потому что парсер универсальный, подозреваю что в mssql есть таблица syscolumns а systables нет.
...
Рейтинг: 0 / 0
14.09.2007, 11:39
    #34800221
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности оптимизатора
Выбегалло
Если вместо tabname = 'sd_title' вы поставите любое другое условие ("<>", BETWEEN, IN (...) ) - вам сразу станет ясно, зачем промежуточная сортировка.


Ну да, ну да, это-то я понимаю :)
Но у меня-то не ЕСЛИ! :)

ВыбегаллоТак вот оно исторически сложилось.
Это был для меня один из наиболее вероятных ответов, но тут ответил Денис:

Журавлев Денис
Информикс допускает таблицы с одинаковыми именами и разными владельцами, читайте про ansi совместимые бд.

Восполнил свои пробелы в теории, проверил на практике - таки оно работает :)
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE DATABASE tmp_ansi  WITH LOG MODE ANSI;
DATABASE tmp_ansi;
CREATE TABLE "informix".tmp_table1(id integer);
CREATE TABLE "loy".tmp_table1(id integer);
-- чистка
DROP DATABASE tmp_ansi;

Журавлев ДенисОни упорядочены по tabname owner tabid colno, информикс не знает что tabname owner tabid уникальны в данном случае и знать не может.

Пасибо, вот теперь я это уже понимаю и причём следующим образом:

В связи с поддержкой ANSI-совместимых БД сложновато в таблице systables описать уникальность поля tabname для не ANSI-совместимых БД. По крайней мере, я с ходу не придумал как это сделать так, чтобы приведённому запросу в его оригинальном виде полегчало.

Журавлёв, садитесь - зачёт! :)
...
Рейтинг: 0 / 0
14.09.2007, 11:52
    #34800291
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности оптимизатора
АнатоЛой
В связи с поддержкой ANSI-совместимых БД сложновато в таблице systables описать уникальность поля tabname для не ANSI-совместимых БД. По крайней мере, я с ходу не придумал как это сделать так, чтобы приведённому запросу в его оригинальном виде полегчало.Я так не думаю.
Я считаю что сортировки не будет только в том случае если эта таблица первая в плане. И поле по которому сортируем "первое" в индексе.

Код: 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.
select {+ EXPLAIN,first_rows} c.colname, c.coltype, c.collength, c.colno
  from informix.syscolumns c
    where c.tabid  =  (select  t.tabid from informix.systables t where t.tabname = 'sd_title')
  order by c.colno ASC

DIRECTIVES FOLLOWED: 
EXPLAIN 
FIRST_ROWS 
DIRECTIVES NOT FOLLOWED: 

Estimated Cost: 4
Estimated # of Rows Returned: 7

  1) informix.c: INDEX PATH

    (1) Index Keys: tabid colno 
        Lower Index Filter: informix.c.tabid = <subquery> 

    Subquery:
    ---------
    Estimated Cost: 2
    Estimated # of Rows Returned: 1

      1) informix.t: INDEX PATH

        (1) Index Keys: tabname owner 
            Lower Index Filter: informix.t.tabname = 'sd_title' 

select {+ EXPLAIN,first_rows} c.colname, c.coltype, c.collength, c.colno
  from informix.syscolumns c
    where c.tabid  in  (select  t.tabid from informix.systables t where t.tabname = 'sd_title')
  order by c.colno ASC

DIRECTIVES FOLLOWED: 
EXPLAIN 
FIRST_ROWS 
DIRECTIVES NOT FOLLOWED: 

Estimated Cost: 5
Estimated # of Rows Returned: 7
 Temporary Files Required For: Order By   

  1) informix.c: INDEX PATH

    (1) Index Keys: tabid colno 
        Lower Index Filter: informix.c.tabid = ANY <subquery> 

    Subquery:
    ---------
    Estimated Cost: 2
    Estimated # of Rows Returned: 1

      1) informix.t: INDEX PATH

        (1) Index Keys: tabname owner 
            Lower Index Filter: informix.t.tabname = 'sd_title' 
Никакой связи с системными таблицами нет, на пользовательских таблицах с такми-же индексами будет все тоже самое.

Никаких странностей тут нет. Все математически идеально.
...
Рейтинг: 0 / 0
14.09.2007, 11:53
    #34800294
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности оптимизатора
Продолжим практическое занятие:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT {+ EXPLAIN} c.colname, c.coltype, c.collength, c.colno 
  FROM informix.syscolumns c
     , informix.systables t 
    WHERE c.tabid = t.tabid 
      AND t.tabname = 'sd_title' 
      AND t.owner = 'informix'
  ORDER BY c.tabid ASC, c.colno ASC

И шо бы вы думали?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 3872
Estimated # of Rows Returned: 8207
 Temporary Files Required For: Order By 
  1) tolik.t: INDEX PATH

    (1) Index Keys: tabname owner
        Lower Index Filter: (tolik.t.owner = 'informix' AND tolik.t.tabname = 'sd_title' )

  2) tolik.c: INDEX PATH

    (1) Index Keys: tabid colno
        Lower Index Filter: tolik.c.tabid = tolik.t.tabid
NESTED LOOP JOIN

Нет пророка в своём отечестве
Никак информикс не увязал наличие двух уникальных индексов systables(tabname, owner) и systables(tabid), чтобы понять что из systables он достанет не больше одной записи, и значит использование индекса syscolumns(tabid, colno) возвращает уже упорядоченную последовательность, требуемую фильтром...
...
Рейтинг: 0 / 0
14.09.2007, 12:02
    #34800322
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности оптимизатора
Журавлев Денис
Я считаю что сортировки не будет только в том случае если эта таблица первая в плане. И поле по которому сортируем "первое" в индексе.

Мне показалось, или таки в обоих ваших запросах это "жирное" условие соблюдено, и тем не менее оптимизация разная?!

Журавлев Денис

Никаких странностей тут нет. Все математически идеально.

Вот здесь не понял.
В чём отличия для поведения в случае с "=", и в случае с "IN"?
...
Рейтинг: 0 / 0
14.09.2007, 12:12
    #34800353
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности оптимизатора
АнатоЛойМне показалось, или таки в обоих ваших запросах это "жирное" условие соблюдено, и тем не менее оптимизация разная?!Индеск-то табид колно. Поэтому в случае [tabid=] colno -- будет "первым", а в случае [tabid in] не будет.
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Странности оптимизатора / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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