Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ? / 10 сообщений из 10, страница 1 из 1
20.05.2014, 13:32:30
    #38646331
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
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
20.05.2014, 13:42:57
    #38646356
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
Таблоид,

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

зачем писать глупые запросы и потом пытаться их оптимизировать?
...
Рейтинг: 0 / 0
20.05.2014, 13:53:21
    #38646391
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
Симонов Денисты бы 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
20.05.2014, 13:57:30
    #38646400
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sel * from (sel * from T order by INDEXED_FLD ) order by INDEXED_FLD: в плане SORT. Why ?
dimitrзачем писать глупые запросы и потом пытаться их оптимизировать?то, что внутри DT - это на самом деле вьюха (была). За каким псом в неё было добавлено order by, трудно сказать. Наверное, она еще в какой-то самодеятельности участвовала, и там было как раз нужно, чтобы она возвращала данные в упорядоченном виде.

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

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

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

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


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