powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
21 сообщений из 46, страница 2 из 2
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706635
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидМожет, в сильно-конкурентной среде
или просто когда база не влазит в кеш :-)
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706638
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидбудет создана таблица t(id, x) с 500 тыс записями, но физ. расположение строк в ней будет отвратительным с т.зр. навигации по ID-индексу.

на самом деле это не так. Это важно когда при навигации по индексу отбирается множество записей. Если ты обираешь только первую, то фактор кластеризации должен быть пофигу, т.к прыжков не будет.
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706639
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЯ разницу как-то не ощутил.

а я вот ощутил

Код: plaintext
1.
2.
TRN_ID    DONE_SEARCHS    AVG_MS_FOR_ONE_SEARCH
39    1000    0
44    1000    18

для 1

------ Информация о производительности ------
Время подготовки запроса = 0ms
Время выполнения запроса = 2s 91ms
Current memory = 147 993 352
Max memory = 166 714 048
Memory buffers = 16 384
Reads from disk to cache = 0
Writes from cache to disk = 0
Чтений из кэша = 2 029 809

для 2

------ Информация о производительности ------
Время подготовки запроса = 0ms
Время выполнения запроса = 19s 126ms
Current memory = 147 996 304
Max memory = 166 714 048
Memory buffers = 16 384
Reads from disk to cache = 0
Writes from cache to disk = 0
Чтений из кэша = 2 237 706
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706648
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТаблоидМожет, в сильно-конкурентной средеили просто когда база не влазит в кеш :-)Дык у мну в ФБ-3 кеш 512к, я не вижу в трейсе reads>0.
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706652
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидМожно, ес-сно. Но только если объем записей для SORT'a не очень большой.
как показывают мои тесты, даже при миллионах записей PLAN ORDER получается хреновее из-за disk io вместо plan SORT. Который выдает результат за N секунд, а не сразу, но зато навсегда.
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706653
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

если что, рекомендую перечитать
http://ibaseforum.ru/viewtopic.php?f=4&t=4175
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706682
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТаблоидМожно, ес-сно. Но только если объем записей для SORT'a не очень большой.
как показывают мои тесты, даже при миллионах записей PLAN ORDER получается хреновее из-за disk io вместо plan SORT. Который выдает результат за N секунд, а не сразу, но зато навсегда.
- - -
если что, рекомендую перечитать
http://ibaseforum.ru/viewtopic.php?f=4&t=4175 Да, я читал её. И перечитал только что снова :-)
Там речь идёт о сравнении ORDER vs SORT для источника данных кардинальностью 14 млн строк. Такие объемы вряд ли перелопачиваются в OLTP-среде. У мну в текущих настройках для одного документа будут перелопачены 50 * 15 * 2 = 4500 строк - и это только в самом худшем случае. Длина записи таблицы (её имя: QDistr), в которой идёт это - 42 байта.

Хотя, один из индексов в ней действительно с не самой лучшей селективностью, но PLAN ORDER был как раз НЕ по нему, а по другому:
Код: plaintext
PLAN (Q  ORDER QDISTR_DOC_SND   INDEX (QDISTR_WARE_SND_OPTYPE) )
TAB_NAMEIDX_NAMELAST_STATCURR_STATDIFF_STATLAST_DONEQDISTRPK_QDISTR5,87758165693231E-75,87233557780564E-75,24607912666397E-1026.07.2014 22:42:14QDISTRQDISTR_DOC_SND 5,85617226533941E-6 5,85370435146615E-62,46791387326084E-926.07.2014 22:42:14QDISTRQDISTR_SNDOP_RCVOP_SND_ID_DESC5,38363792657037E-65,38022004548111E-63,41788108926266E-926.07.2014 22:42:14QDISTRQDISTR_SND_ID5,85610359848943E-65,85366979066748E-62,43380782194436E-926.07.2014 22:42:14QDISTR QDISTR_WARE_SND_OPTYPE 0,000500000023748726 0,000500000023748726026.07.2014 22:42:14
И вот этот индекс, по которому идёт навигация, он-то как раз с хорошей селективностью.

Хотя она у него такая "хорошая" за счет второго поля (там составной ключ: doc_id, snd_id). По первому полю
Код: sql
1.
запрос select 1.000000000 * count(distinct q.doc_id) / count(*) from  qdistr q

- возвращает гадость: 0,016215913.

Это похоже на пример из статьи:kdv
Код: plaintext
1.
ndex Depth Keys  KeyLen  MaxDup TotalDup  Uniques Selectivity  Size, mb
A      3  14287963 0.00  4827799 14286515     1448 0.0006906    82.03


Если навигация по индексу с плохой селективностью (а для составного индекса - с плохой селективностью "префикс"-полей) всегда тормозит, то сиё очень плохо. Потому что как только мы добавим в таблицу какой-нить составной индекс, оптимизатор может запросто выбрать его, в т.ч. для PLAN ORDER'a. И - "куку" :(

Согласен вот с этим:автор4. для небольшого количества записей "стоимость" сортировки на диске или выборки в порядке индекса может быть одинаковой.- но увидел это в своём тесте только для 2.5. А вот для 3.0 разница оказалась очень серьёзной, в пользу PLAN SORT'a. База та у мну сохранилась, её саму и примеры я высылал dimitr'у.

PS. К сож-ю, в этой статье не сказано про влияние на время сортировки значений TempCacheLimit'a и TempBlockSize (впрочем, были ли они тогда, в 1.5 ?).

PPS. И еще. Полуофф (?).
Зачем тут говорится про то, что "недофетчили, оттого и быстро":kdvВторой запрос, с выборкой в порядке индекса B, несмотря на мгновенность выполнения выдает только часть записей в grid, поэтому то же самое считывание страниц и их вытеснение из кэша может начаться по мере того, как пользователь будет нажимать в grid кнопку PageDn (или стрелку вниз).- ?
Ведь ясно же, что такое сравнение некорректно и надо было сразу Shift-F9 жмякать :-)
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706706
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидХотя она у него такая "хорошая" за счет второго поля (там составной ключ: doc_id, snd_id). По первому полю
Код: sql
1.
запрос select 1.000000000 * count(distinct q.doc_id) / count(*) from  qdistr q

- возвращает гадость: 0,016215913.
посегментная селективность есть в rdb$index_segments, не надо изобретать велосипед

Таблоидкак только мы добавим в таблицу какой-нить составной индекс, оптимизатор может запросто выбрать его, в т.ч. для PLAN ORDER'a
для INDEX-плана не выберет, времени ФБ 1.5 давно позади, а ты все поезда под откос пускаешь. А для ORDER-плана селективность вообще пофиг.
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706714
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

1. Я запускал твой тест и там с точностью наоборот. Навигация оказалась быстрее
2. Про недофетчили. В гридах дельфей это очень частый режим.

Кстати быстрее может быть не только когда недофетчили, но и когда есть ограничитель ROWS.

Где то в fbdevel ДЕ рассуждал о подсказках оптимизатору. Там как раз говорилось об SORT vs ORDER.
Предлагалось ввести подсказки типа
[OPTIMIZE FOR {FIRST | ALL} ROWS]
Так вот для OPTIMIZE FOR FIRST ROWS будет использоваться навигация по индексу, а для OPTIMIZE FOR ALL ROWS сортировка. Потом решили отложить подсказки. Сейчас когда в запросе есть FIRST/ROWS оптимизатор меняет стратегию на OPTIMIZE FOR FIRST ROWS, по умолчанию же стоит OPTIMIZE FOR ALL ROWS.

Хотя пока это заметно только на запросах с JOIN. Когда же в запросе всего одна таблица, то всё равно преобладает навигация по индексу.
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706716
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

кстати запрос

Код: sql
1.
select id from t where x = :x and id >= :y ORDER BY id rows 1


эквивалентен
Код: sql
1.
SELECT min(id) FROM t WHERE x = :x AND id >= :y
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706718
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис1. Я запускал твой тест и там с точностью наоборот. Навигация оказалась быстрееЧисло коннектов-молотилок + сколько ты дал времени им поработать перед тем, как сравнивать ?
(и как сравнивал: просто добавил/убавил "+0" из той ХП и перекомпилил её ?)

Симонов Денис2. Про недофетчили. В гридах дельфей это очень частый режим.Я знаю. Но у мну нет тут гридов :-)
Есть ХП, которая, вместо возврата строк в грид, должна обработать эти строки в опр. порядке, причём обязательно все .

Симонов ДенисГде то в fbdevel ДЕ рассуждал о подсказках оптимизатору.Один и тот же запрос с where f = :x будет молотить разное кол-во строк при разных :x, т.к. данные всегда могут быть перекошенными.
Без гистограмм распределения значений сколько не подсказывай оптимизатору, толку большого не будет.
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706721
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Код: sql
1.
select id from t where x = :x and id >= :y ORDER BY id rows 1

эквивалентен
Код: sql
1.
SELECT min(id) FROM t WHERE x = :x AND id >= :y

При наличии индекса по ID. Но второй мне как-то более понятным кажется.
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706722
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЧисло коннектов-молотилок + сколько ты дал времени им поработать перед тем, как сравнивать ?

речь не об OLTP тесте (там я самостоятельно ничего менять не буду), а о том EB что ты здесь привёл.

ТаблоидБез гистограмм распределения значений сколько не подсказывай оптимизатору, толку большого не будет.

в трекере для Beta2 они есть в планах. Но не факт что это будет работать нормально с параметрами.
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706743
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> Без гистограмм распределения значений сколько
Таблоид> не подсказывай оптимизатору, толку большого не будет.

С чего это вдруг? Это смотря какие хинты и как реализовать.
Ты до их появления знаешь, что они будут "юажными" что ли?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706754
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамТаблоид> Без гистограмм распределения значений сколько
Таблоид> не подсказывай оптимизатору, толку большого не будет.

С чего это вдруг? Это смотря какие хинты и как реализовать.Ну так если оптимизатор будет знать распределение данных и НЕ будет составлять план параметризованного запроса заранее, до получения конкретного значения параметра, то... зачем тогда вообще хинты ? :)
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706762
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

есть куча запросов с непараметризованными предикатами. Классический пример: WHERE IS_DELETED = 0 AND blah-blah-blah - тут тебе и константа и охрененный перекос в распределении.
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706780
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrесть куча запросов с непараметризованными предикатами. Классический пример: WHERE IS_DELETED = 0 AND blah-blah-blah - тут тебе и константа и охрененный перекос в распределении.я видел эти дебаты по поводу подсказок (летом в прошлом году они были ?), но что там решили в итоге - не дочитал. Искать в fb-devel'e невозможно, в почте яндекса (куда мне идёт пересыл) - тоже.
Хинты - зло. Рано или поздно они устаревают ввиду изменений в данных. План должен быть другим, но не становится таковым.
Даже с изменением PLAN ORDER на PLAN SORT (добавлением "+0") - возможна ситуация, когда надо будет вернуть всё взад. Я уж не говорю про всякие искуственные замены inner join'ов на left join'ы, воткнутые в авральном порядке, "чтобы сейчас хоть как-то работало, а попозже обязательно разберёмся" (ога, ну-ну...).

Если будет какая-то возможность отследить (трейсом ?) запросы, идущие с хинтами, то это еще ладно, фиг с ними. Но если хинты будут проскакивать мимо всяких средств отслежки, то это бомба себе под табуретку.
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706794
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

не в случае двух обсуждаемых типов хинтов
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706799
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисне в случае двух обсуждаемых типов хинтовчто именно "не в случае" ? Думаешь, не понадобится отлов таких вариантов запросов (с ALL_ROWS | FIRST_ROWS) ?
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706830
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

я тебе про гистограммы, ты мне про хинты. Продолжаем разговаривать (с) :-)
...
Рейтинг: 0 / 0
PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
    #38706856
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидумаешь, не понадобится отлов таких вариантов запросов (с ALL_ROWS | FIRST_ROWS) ?

со временем такие вещи не меняются. Если конечно DBA конкретный косяк, то отлов может потребоваться. А гистограммы даже с константами могут быть очень востребованы.
...
Рейтинг: 0 / 0
21 сообщений из 46, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / PLAN ORDER (навигация по индексу) и сохранение считанных recId в аналоге TreeSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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