powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Странности оптимизатора
10 сообщений из 10, страница 1 из 1
Странности оптимизатора
    #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
Странности оптимизатора
    #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
Странности оптимизатора
    #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
Странности оптимизатора
    #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
Странности оптимизатора
    #34799624
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛойВопросы:
1) кто знает, зачем тут сортировка в файлах, если записи выдаются по этому плану запроса УЖЕ упорядоченными?
Они упорядочены по tabname owner tabid colno, информикс не знает что tabname owner tabid уникальны в данном случае и знать не может.
Информикс допускает таблицы с одинаковыми именами и разными владельцами, читайте про ansi совместимые бд.

АнатоЛой2) почему syscolumns зелёный, а systables нет :)потому что парсер универсальный, подозреваю что в mssql есть таблица syscolumns а systables нет.
...
Рейтинг: 0 / 0
Странности оптимизатора
    #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
Странности оптимизатора
    #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
Странности оптимизатора
    #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
Странности оптимизатора
    #34800322
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис
Я считаю что сортировки не будет только в том случае если эта таблица первая в плане. И поле по которому сортируем "первое" в индексе.

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

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

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

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


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