Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Навигация по индексу FB3 / 19 сообщений из 19, страница 1 из 1
01.12.2014, 19:23
    #38821824
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
Поскольку Beta уже вышла можно про оптимизатор спрашивать.

Имеем такой запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
    SERVICE.CODE_SERVICE,
    WEBUSER.LOGIN
FROM
    SERVICE
JOIN WEBUSER ON SERVICE.CODE_WEBUSER = WEBUSER.CODE_WEBUSER
--WHERE WEBUSER.LOGIN = 'Abrek'
ORDER BY SERVICE.BYDATE
ROWS 1



План и статистика в Fb3
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
План
PLAN JOIN (SERVICE ORDER SERVICE_IDX_BYDATE, WEBUSER INDEX (PK_WEBUSER))

Select Expression
    -> First N Records
        ->  Nested Loop Join (inner)
            -> Table "SERVICE" Access By ID
                -> Index "SERVICE_IDX_BYDATE" Full Scan
            -> Filter
                -> Table "WEBUSER" Access By ID
                    -> Bitmap
                        -> Index "PK_WEBUSER" Unique Scan

------ Информация о производительности ------
Время подготовки запроса = 0ms
Время выполнения запроса = 16ms
Среднее время на получение одной записи = 16,00 ms
Current memory = 140 557 976
Max memory = 143 829 864
Memory buffers = 8 192
Reads from disk to cache = 0
Writes from cache to disk = 0
Чтений из кэша = 50


В Fb2.5 понятное дело всё плохо:

План и статистика в Fb2.5
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
План
PLAN SORT (JOIN (WEBUSER NATURAL, SERVICE INDEX (FK_SERVICE_REF_WEBUSER)))

------ Информация о производительности ------
Время подготовки запроса = 16ms
Время выполнения запроса = 4m 7s 246ms
Среднее время на получение одной записи = 247 246,00 ms
Current memory = 17 704 596
Max memory = 268 172 356
Memory buffers = 1 024
Reads from disk to cache = 288 355
Writes from cache to disk = 0
Чтений из кэша = 24 059 934


Но только стоит разкомментировать условие WHERE WEBUSER.LOGIN = 'Abrek', получаем всё наоборот:

План и статистика в Fb3
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
План
PLAN JOIN (SERVICE ORDER SERVICE_IDX_BYDATE, WEBUSER INDEX (PK_WEBUSER))

Select Expression
    -> First N Records
        ->  Nested Loop Join (inner)
            -> Table "SERVICE" Access By ID
                -> Index "SERVICE_IDX_BYDATE" Full Scan
            -> Filter
                -> Table "WEBUSER" Access By ID
                    -> Bitmap
                        -> Index "PK_WEBUSER" Unique Scan

------ Информация о производительности ------
Время подготовки запроса = 16ms
Время выполнения запроса = 2s 730ms
Среднее время на получение одной записи = 2 730,00 ms
Current memory = 141 176 288
Max memory = 143 829 864
Memory buffers = 8 192
Reads from disk to cache = 18 708
Writes from cache to disk = 0
Чтений из кэша = 2 982 836



План и статистика в Fb2.5
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
План
PLAN SORT (JOIN (WEBUSER INDEX (UNQ_WEBUSER_LOGIN), SERVICE INDEX (FK_SERVICE_REF_WEBUSER)))

------ Информация о производительности ------
Время подготовки запроса = 0ms
Время выполнения запроса = 31ms
Среднее время на получение одной записи = 31,00 ms
Current memory = 17 719 212
Max memory = 268 172 356
Memory buffers = 1 024
Reads from disk to cache = 474
Writes from cache to disk = 0
Чтений из кэша = 6 350


Изменяем запрос на такой

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
    SERVICE.CODE_SERVICE,
    WEBUSER.LOGIN
FROM
    SERVICE
JOIN WEBUSER ON SERVICE.CODE_WEBUSER = WEBUSER.CODE_WEBUSER
WHERE WEBUSER.LOGIN = 'Abrek'
ORDER BY SERVICE.BYDATE+0
ROWS 1



и получаем в FB3

Код: 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.
План
PLAN SORT (JOIN (WEBUSER INDEX (UNQ_WEBUSER_LOGIN), SERVICE INDEX (FK_SERVICE_REF_WEBUSER)))

Select Expression
    -> First N Records
        -> Sort (record length: 92, key length: 12)
            ->  Nested Loop Join (inner)
                -> Filter
                    -> Table "WEBUSER" Access By ID
                        -> Bitmap
                            -> Index "UNQ_WEBUSER_LOGIN" Unique Scan
                -> Filter
                    -> Table "SERVICE" Access By ID
                        -> Bitmap
                            -> Index "FK_SERVICE_REF_WEBUSER" Range Scan (full match)

------ Информация о производительности ------
Время подготовки запроса = 0ms
Время выполнения запроса = 46ms
Среднее время на получение одной записи = 46,00 ms
Current memory = 140 579 832
Max memory = 143 829 864
Memory buffers = 8 192
Reads from disk to cache = 496
Writes from cache to disk = 0
Чтений из кэша = 6 373


Т.е. трёшка не понимает, когда надо отказаться от навигации по индексу, а когда нет. Причём без ограничителя ROWS оценка идёт правильно и навигация по индексу заменяется внешней сортировкой.
...
Рейтинг: 0 / 0
01.12.2014, 20:48
    #38821937
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
ROWS считается хинтом и отключает оценку стоимости в пользу принудительного использования плана ORDER. Как видим, это не всегда является удачной мыслью.
...
Рейтинг: 0 / 0
01.12.2014, 23:52
    #38822057
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
dimitr,

это я уже понял. Просто думал может к релизу планируются изменения на этот счёт.

Ещё хотел спросить. Если в плане будет отображаться стоимостная оценка и кардинальность, то можно для индексов писать ещё и селективность? Если эти сведения будут проще понять почему оптимизатор выбрал именно такой план. Тем более что селективность самого индекса верна только для равенства, а для остальных сравнений используются некоторые константы, вот пусть они и выводятся.
...
Рейтинг: 0 / 0
02.12.2014, 00:33
    #38822065
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
Симонов Денис> в плане ... можно для индексов писать ещё и селективность?

Кстати, да, интересная идея, +1. При чём не только из-за
констант и пр., но и поскольку селективность меняется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.12.2014, 01:16
    #38822071
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
Симонов Денис,

Кстати, вопрос светочам (бо неуч, каюсь - 3 сервера в голове удержать одновременно ;( ) - селективность индекса пересчитывается когда?
...
Рейтинг: 0 / 0
02.12.2014, 01:25
    #38822072
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
DarkMaster,

при alter index active (включая restore), и set statistics index ...
...
Рейтинг: 0 / 0
02.12.2014, 01:26
    #38822074
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
DarkMasterселективность индекса пересчитывается когда?1) при вводе create index ... on ...
2) при вводе set statistics index ...

Селективность НЕ пересчитывается, если сначала индекс создать, а затем заливать в таблицу данные. Поэтому после всяких bulk-апдейтов (или просто на периодической основе) надо делать set statictics index, если не хотим огрести тормоза на неверных планах с inner-join'ами. Операция эта не требует отрубания юзеров.
...
Рейтинг: 0 / 0
02.12.2014, 02:55
    #38822095
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
kdv, Таблоид - спасибо, в очередной раз внесли ясность...

Вдогодку - есть ли смысл (для компонент) на автомате генерить SET STATISTICS после заведомо больших порций данных, влитых через скрипт (ими же исполненный) и где (примерно) эта магическая граница для больших порций (есть кое-какая задумка, но пока в плане прикидок - стоит оно или нет)...
...
Рейтинг: 0 / 0
02.12.2014, 04:29
    #38822108
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
DarkMaster> есть ли смысл (для компонент)

Чего-чего?

DarkMaster> генерить SET STATISTICS после заведомо больших порций данных,
DarkMaster> влитых через скрипт (ими же исполненный)

Есть. Зависит от соотношения новых данных
к старым и содержания индексируемых полей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.12.2014, 10:21
    #38822224
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
DarkMasterгде (примерно) эта магическая граница для больших порцийОгребание тормозов на запросах, которые раньше летали - вот и вся "магическая граница" :-)
Создай скриптик, который будет делать 5-6 запросов к твоей базе, и "фоткать" время их выполнения до и после.
Запросы должны быть не вымученными, а такими, которые часто используются, ну и достаточно "тяжелыми". В запросах обязательно должны быть inner join'ы тех таблиц, которые сейчас менялись. Т.е. такие должны быть места, на которых оптимизатор будет делать выбор .
Ну, и пусть твой скрипт сравнивает время. Если оно отличается на 25% и более - этот же скрипт пусть и пересчитывает статистику. ИМХО.
...
Рейтинг: 0 / 0
02.12.2014, 10:25
    #38822232
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
PS. А вообще, пересчет статистики - очень быстрая операция. Даже на больших таблицах и при сотнях работающих роботах. Не говоря уже про работу обычных юзеров. Так что нет смысла заморачиваться, скажу шершавым языком агитпропа: "залил - пересчитывай!"
...
Рейтинг: 0 / 0
02.12.2014, 10:26
    #38822235
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
Гаджимурадов РустамDarkMaster> есть ли смысл (для компонент)
Чего-чего?


IBO ;)
...
Рейтинг: 0 / 0
02.12.2014, 10:28
    #38822240
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
Таблоид,

Ну ты у нас известный нагибатор ;) Спасибо за информацию... Правда не думаю, что что-то придумается универсальное ;(
...
Рейтинг: 0 / 0
02.12.2014, 11:00
    #38822278
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
Таблоид> Ну, и пусть твой скрипт сравнивает время. Если оно отличается на
Таблоид> 25% и более - этот же скрипт пусть и пересчитывает статистику.

Сколько букв, ппц, время, скрипт, сравни...
Правило собсно простое - если заливаешь
больше 25% неравнораспределённых данных -
можно уже пересчитывать. Дотошные могут
уменьшить цифру до 20%, 15%.

DarkMaster> IBO ;)

Да хоть IBX. При чём тут статистика индексов? :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.12.2014, 11:27
    #38822312
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
Гаджимурадов РустамДа хоть IBX. При чём тут статистика индексов? :)
насколько я понял, речь про допилить компоненты для автоматического обновления статистики после массовой заливки
...
Рейтинг: 0 / 0
02.12.2014, 11:34
    #38822330
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
dimitrГаджимурадов РустамДа хоть IBX. При чём тут статистика индексов? :)
насколько я понял, речь про допилить компоненты для автоматического обновления статистики после массовой заливки

Абсолютно верно.
...
Рейтинг: 0 / 0
02.12.2014, 11:48
    #38822347
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
Какой ужас... Мне бы такое в голову не пришло. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.12.2014, 19:58
    #38822997
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
Приурочить к штатному свипу-бэкапу ночером не судьба?
...
Рейтинг: 0 / 0
02.12.2014, 22:30
    #38823069
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навигация по индексу FB3
Ivan_Pisarevsky,

Да без проблем - так оно и крутится сейчас. Просто например в моем зоопарке пару раз в месяц в базу влетает порядка 1 млн. записей - в остальном штатная работа пользователей без массовых операций аплейта/делита Вот и пришла идея совместить в том же роботе,что данные вливает еще и перестройку индексов при необходимости.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Навигация по индексу FB3 / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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