powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
10 сообщений из 10, страница 1 из 1
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
    #38646331
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

LI-T6.3.0.31129

Создаем таблицу с одним индексированным varchar-полем, в которое пишем:
1) 200 строк вида 'a'
2) 500 тыс длинных строк вида 'bbbbbbbbbb . . .' || uuid_to_char(gen_uuid())
3) снова 200 строк вида 'c':

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
recreate table tx(s varchar(1000)); commit;
insert into tx select 'a' from rdb$types rows 200;
commit;
set term ^;
execute block as
declare n int = 500000;
begin
  while(n>0) do
    insert into tx values(lpad(uuid_to_char(gen_uuid()),1000,'b'))
    returning :n-1 into n;
end
^set term ;^
commit;
insert into tx select 'c' from rdb$types rows 200;
commit;
create index tx_s on tx(s);
commit;

Далее смотрим на план запроса:
Код: sql
1.
select s from (select s from tx order by s) where s >= :s order by s rows 1

- вот он:
Код: plaintext
PLAN  SORT  (TX ORDER TX_S)

Для :s = 'a' будем видеть:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Execute time = 4s 343ms
Avg fetch time = 4 343,00 ms
Current memory = 0
Max memory = 0
Memory buffers = 524 288
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 1 502 565
Вопрос, соб-сно, очевиден: зачем сортировать то, что и так уже вылезает отсортированным из derived-таблицы ?
Разве тут не достаточно преобразования запроса к
Код: sql
1.
select s from (select s from tx) where s >= :s order by s rows 1

с планом PLAN (TX ORDER TX_S) - ?
...
Рейтинг: 0 / 0
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
    #38646356
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

ты бы explain план лучше привёл
...
Рейтинг: 0 / 0
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
    #38646358
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

зачем писать глупые запросы и потом пытаться их оптимизировать?
...
Рейтинг: 0 / 0
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
    #38646391
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисты бы explain план лучше привёл
Код: 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.
SQL> set stat on;
SQL> set explain on;

-- хороший индеец:
SQL> select 1 from (select s from tx) where s >= 'a' order by s rows 1;

Select Expression
    -> First N Records
        -> Filter
            -> Table "TX" Access By ID
                -> Index "TX_S" Range Scan (lower bound: 1/1)

    CONSTANT
============
           1

Current memory = 8898785576
Delta memory = 419112
Max memory = 9539762224
Elapsed time= 0.002 sec
Cpu = 0.000 sec
Buffers = 524288
Reads = 0
Writes = 0
Fetches = 98


-- плохой индеец (BTW: зачем тут два раза "Filter" ?):
SQL> select 1 from (select s from tx order by s) where s >= 'a' order by s rows 1;

Select Expression
    -> First N Records
        -> Sort (record length: 1026, key length: 1008)
            -> Filter
                -> Filter
                    -> Table "TX" Access By ID
                        -> Index "TX_S" Range Scan (lower bound: 1/1)

    CONSTANT
============
           1

Current memory = 8899050816
Delta memory = 265240
Max memory = 9541833272
Elapsed time= 4.232 sec
Cpu = 0.000 sec
Buffers = 524288
Reads = 0
Writes = 0
Fetches = 1502569
...
Рейтинг: 0 / 0
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
    #38646400
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrзачем писать глупые запросы и потом пытаться их оптимизировать?то, что внутри DT - это на самом деле вьюха (была). За каким псом в неё было добавлено order by, трудно сказать. Наверное, она еще в какой-то самодеятельности участвовала, и там было как раз нужно, чтобы она возвращала данные в упорядоченном виде.

ЗЫ. Глупо-не_глупо, но таки вопрос! а что, если доступа к коду вьюхи нету, но есть необходимость задействовать именно её ? в 3.х ведь будет такое, что DDL нельзя посмотреть всем кому не лень, так ?
...
Рейтинг: 0 / 0
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
    #38646413
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидв 3.х ведь будет такое, что DDL нельзя посмотреть всем кому не лень, так ?
кто-то это обещал или ты сам додумал?
...
Рейтинг: 0 / 0
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
    #38646416
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидчто DDL нельзя посмотреть всем кому не лень, так
с чего ты это взял? В обсуждениях было, а в трекере планов не видно

Таблоид(BTW: зачем тут два раза "Filter" ?)
хз. Наверное перестраховывается

P.S. ORDER BY внутри вьюхи зло
...
Рейтинг: 0 / 0
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
    #38646433
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТаблоидв 3.х ведь будет такое, что DDL нельзя посмотреть всем кому не лень, так ?кто-то это обещал или ты сам додумал?обещаний не видел / не помню, но терзает смутное сомнение, что в fb-devel'e видел... но там с поиском беда. Ладно. Нет так нет.
...
Рейтинг: 0 / 0
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
    #38646434
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисP.S. ORDER BY внутри вьюхи злоне всегда: order by ... rows 1
...
Рейтинг: 0 / 0
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
    #38646450
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

если внутри вьюхи применён order by ... rows 1, то это уже совсем другая песня, в неё вроде даже как предикаты перестают пропихиваться. Я имею ввиду когда просто order by добавлено без всяких rows. Смысла в этом мало, тем более если дальше переупорядочивание идёт
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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