|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
Добрый вечер! FB 2.55 Есть запрос вида: Код: sql 1. 2. 3. 4. 5. 6. 7.
Всё работало достаточно быстро, но когда число записей в таблицах table2 и table3 превысило миллион, начало напрягать (не скачком, а постепенное замедление выполнения, сейчас запрос выполняется около полутора секунд). Начал перебирать варианты, поскольку запрос в скобках (выборка из Table2 и Table3) по-прежнему исполнялся быстро (возвращал 14 записей за 20ms). Попробовал вынести этот запрос (в скобках который) под WITH в конструкцию WITH ........ SELECT ...., попробовал этот-же запрос соединить JOIN'ом с основным запросом. В обоих случаях общий запрос выполнялся, выдавал те-же записи, но увы, скорость практически не менялась, оба они исполнялись за те-же полторы секунды. Пришлось пойти на радикальные меры. Создал процедуру в ней сначала выполняется запрос из Table1 и Table2, результат заливается во временную таблицу и уже она JOIN'ится с Table1. Общее время получения результата чуть более 20ms. Т.е. задача решена, снова всё летает, но осталась заноза, может быть можно решить задачу ускорения запроса без использования временной таблицы? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2016, 18:48 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
zeon11но осталась заноза, может быть можно решить задачу ускорения запроса без использования временной таблицы? Планы запросов и ddl таблиц есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2016, 20:52 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
wadmanzeon11но осталась заноза, может быть можно решить задачу ускорения запроса без использования временной таблицы? Планы запросов и ddl таблиц есть? Чую себя гопником. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2016, 20:53 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
wadmanwadmanпропущено... Планы запросов и ddl таблиц есть? Чую себя гопником. - Есть смысл жизни? - Нет! - А если найду? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2016, 21:03 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
Неудобно что скрипт неполный. Вообще говоря, проблема не в запросе в скобках, а в том как его понял оптимизатор. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2016, 02:45 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
Вот собственно запрос: Код: sql 1. 2. 3. 4. 5. 6. 7.
Процедура GET_CHILD выводит иерархию дерева. таблица CASEEXPERT "деревянная", в ней хранится шаблон-опросник, на основе которого оценивается качество лечения пациента. Здесь проблем нет, всё отрабатывается очень быстро. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Таблица CASEEXPERTING - заголовок ответов медицинского эксперта по конкретной истории болезни (CASERECORD) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
в CASEEXPERTING_CASEEXPERT детальная расшифровка ответов эксперта Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Вот план из IBExpert'a: План PLAN JOIN (P INDEX (FK_CASEEXPERTING_CASEEXPERT_2), C INDEX (PK_CASEEXPERTING)) PLAN SORT (JOIN (S INDEX (RDB$PRIMARY61), GET_CHILD NATURAL)(S INDEX (SHOP_XPARENT))(S INDEX (RDB$PRIMARY35))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (XPKSERVICE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_KBK))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_FINANCE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_EATER))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_STATUS))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (PK_STATUS))SORT ((S NATURAL))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (RDB$PRIMARY44))(GET_CHILD NATURAL)(S INDEX (WARE_XPARENT))(S INDEX (PK_FILES))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_CASEEXPERT))(GET_CHILD NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (RDB$PRIMARY117))(GET_CHILD NATURAL)(S INDEX (OMS_PERIOD_XPARENT))(S INDEX (PK_STENCIL))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_DIRECTORY))(GET_CHILD NATURAL)(S INDEX (UNQ1_DIRECTORY_NAME))(S INDEX (PK_CASEEXPERT))) Адаптированный план PLAN JOIN (P INDEX (FK_CASEEXPERTING_CASEEXPERT_2), C INDEX (PK_CASEEXPERTING)) PLAN SORT (JOIN (S INDEX (INTEG_108), GET_CHILD NATURAL)(S INDEX (SHOP_XPARENT))(S INDEX (INTEG_68))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (XPKSERVICE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_KBK))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_FINANCE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_EATER))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_STATUS))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (PK_STATUS))SORT ((S NATURAL))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (INTEG_134))(GET_CHILD NATURAL)(S INDEX (WARE_XPARENT))(S INDEX (PK_FILES))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_CASEEXPERT))(GET_CHILD NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (INTEG_212))(GET_CHILD NATURAL)(S INDEX (OMS_PERIOD_XPARENT))(S INDEX (PK_STENCIL))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_DIRECTORY))(GET_CHILD NATURAL)(S INDEX (UNQ1_DIRECTORY_NAME))(S INDEX (PK_CASEEXPERT))) ------ Performance info ------ Prepare time = 0ms Execute time = 4s 968ms Avg fetch time = 146.12 ms Current memory = 18 268 368 Max memory = 18 860 944 Memory buffers = 2 048 Reads from disk to cache = 120 355 Writes from cache to disk = 0 Fetches from cache = 5 833 926 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2016, 13:54 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
zeon11 Код: sql 1. 2.
Попробуй заменить это на Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2016, 14:00 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
hvlad, Код: sql 1. 2. 3. 4. 5. 6. 7.
План PLAN JOIN (P INDEX (FK_CASEEXPERTING_CASEEXPERT_2), C INDEX (PK_CASEEXPERTING)) PLAN JOIN (S INDEX (RDB$PRIMARY61), GET_CHILD NATURAL)(S INDEX (SHOP_XPARENT))(S INDEX (RDB$PRIMARY35))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (XPKSERVICE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_KBK))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_FINANCE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_EATER))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_STATUS))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (PK_STATUS))SORT ((S NATURAL))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (RDB$PRIMARY44))(GET_CHILD NATURAL)(S INDEX (WARE_XPARENT))(S INDEX (PK_FILES))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_CASEEXPERT))(GET_CHILD NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (RDB$PRIMARY117))(GET_CHILD NATURAL)(S INDEX (OMS_PERIOD_XPARENT))(S INDEX (PK_STENCIL))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_DIRECTORY))(GET_CHILD NATURAL)(S INDEX (UNQ1_DIRECTORY_NAME))(S INDEX (PK_CASEEXPERT)) Адаптированный план PLAN JOIN (P INDEX (FK_CASEEXPERTING_CASEEXPERT_2), C INDEX (PK_CASEEXPERTING)) PLAN JOIN (S INDEX (INTEG_108), GET_CHILD NATURAL)(S INDEX (SHOP_XPARENT))(S INDEX (INTEG_68))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (XPKSERVICE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_KBK))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_FINANCE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_EATER))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_STATUS))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (PK_STATUS))SORT ((S NATURAL))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (INTEG_134))(GET_CHILD NATURAL)(S INDEX (WARE_XPARENT))(S INDEX (PK_FILES))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_CASEEXPERT))(GET_CHILD NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (INTEG_212))(GET_CHILD NATURAL)(S INDEX (OMS_PERIOD_XPARENT))(S INDEX (PK_STENCIL))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_DIRECTORY))(GET_CHILD NATURAL)(S INDEX (UNQ1_DIRECTORY_NAME))(S INDEX (PK_CASEEXPERT)) ------ Performance info ------ Prepare time = 0ms Execute time = 4s 797ms Avg fetch time = 154.74 ms Current memory = 18 649 224 Max memory = 24 646 116 Memory buffers = 2 048 Reads from disk to cache = 120 448 Writes from cache to disk = 0 Fetches from cache = 5 833 954 Похоже, ничего не изменилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2016, 14:45 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
zeon11, похоже, придётся смотреть в get_child Еще полезно посмотреть на потабличную статистику ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2016, 15:59 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
Get_child никогда не подводил. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
А как по-табличную статистику получить? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2016, 16:40 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
zeon11А как по-табличную статистику получить?Ну ты же в IBE запросы выполняешь... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2016, 16:42 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
zeon11Get_child никогда не подводил.Или это не тот get_child, или планы не от того запроса ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2016, 16:44 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
hvlad, get_child у меня был универсальной процедурой, работающей со многими таблицами-деревьями, поэтому и план был такой монструозный, выше я представил скрипт из которого выкинул обработки для других таблиц. Сейчас сделал другую процедуру: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
В IBE нажал кнопку Copy Analisis to Clipboard. Эта база старая, тут ещё меньше 1 млн. записей. Query ------------------------------------------------ select s.*, (select p.val from caseexperting_caseexpert p inner join caseexperting c on (p.xcaseexperting=c.xcaseexperting) where s.xcaseexpert=p.xcaseexpert and c.xcaserecord=:XCASERECORD) res from get_child_nn(0) g left join caseexpert s on (g.x=s.xcaseexpert) where s.use =1 Plan ------------------------------------------------ PLAN JOIN (P INDEX (FK_CASEEXPERTING_CASEEXPERT_2), C INDEX (PK_CASEEXPERTING)) PLAN JOIN (S INDEX (PK_CASEEXPERT), GET_CHILD_NN NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (PK_CASEEXPERT)) Query Time ------------------------------------------------ Prepare : 16.00 ms Execute : 4 859.00 ms Avg fetch time: 186.88 ms Memory ------------------------------------------------ Current: 19 020 632 Max : 24 646 116 Buffers: 2 048 Operations ------------------------------------------------ Read : 120 448 Writes : 0 Fetches: 5 833 954 Marks : 0 Enchanced Info: +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+ | Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts | Backouts | Purges | Expunges | | | Total | reads | reads | | | | | | | +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+ |CASEEXPERT | 0 | 233 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |CASEEXPERTING | 0 | 833097 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |CASEEXPERTING_CASEEXPERT | 0 | 833097 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+ ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2016, 18:03 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
Гм, насколько я догадываюсь, подзапрос в основном select'е не может вернуть более одной записи, поэтому его можно внести в тело основного запроса, например вот так Код: sql 1. 2. 3. 4. 5. 6. 7.
Ещё интересно посмотреть на план и статистику вот такого запроса Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2016, 18:29 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
hvlad, Мне нужно именно вывести на клиента полностью шаблон со всеми вариантами и прикрутить колонку в которой врач-эксперт в свое время поставил значение. на рисунке это колонка RES. Значения там 100 (имеется ввиду 100 %), поскольку конкретная карта заполняется автоматом на основании поля DEF, типа всех лечим хорошо, по всем параметрам на 100%, но эксперт может оценить каждый из 14 параметров конкретного пациента и в 0%, 25%, 50%, 75%. Тут запрос может быть только с левым джойном. если Join'ить три таблицы и процедуру, то получим не тот результат - выведутся всего 14 строчек с установленными параметрами. В принципе, как уже писал выше задачу скорости решил через заливку во временную таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2016, 19:23 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
Попробуй ещё вот такое, если не надоело Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2016, 01:48 |
|
Есть-ли возможность ускорить запрос?
|
|||
---|---|---|---|
#18+
hvladПопробуй ещё вот такое, если не надоело Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
ОПА! Волшебник! Снимаю шляпу! 109ms к 'холодному' серверу! Query ------------------------------------------------ SELECT S.*, (SELECT P.VAL FROM CASEEXPERTING_CASEEXPERT P RIGHT JOIN CASEEXPERTING C ON P.XCASEEXPERTING = C.XCASEEXPERTING WHERE S.XCASEEXPERT = P.XCASEEXPERT AND C.XCASERECORD = :XCASERECORD AND P.XCASEEXPERT IS NOT NULL ) RES FROM GET_CHILD_NN(0) G LEFT JOIN CASEEXPERT S ON G.X = S.XCASEEXPERT WHERE S.USE = 1 AND S.XCASEEXPERT IS NOT NULL ORDER BY S.VISORDER Plan ------------------------------------------------ PLAN JOIN (C INDEX (FK_CASEEXPERTING_1), P INDEX (PK_CASEEXPERTING_CASEEXPERT)) PLAN SORT (JOIN (S INDEX (PK_CASEEXPERT), GET_CHILD_NN NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (PK_CASEEXPERT))) Query Time ------------------------------------------------ Prepare : 0.00 ms Execute : 109.00 ms Avg fetch time: 4.19 ms Memory ------------------------------------------------ Current: 17 803 988 Max : 18 860 908 Buffers: 2 048 Operations ------------------------------------------------ Read : 22 Writes : 0 Fetches: 1 576 Marks : 0 Enchanced Info: +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+ | Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts | Backouts | Purges | Expunges | | | Total | reads | reads | | | | | | | +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+ |CASEEXPERT | 0 | 233 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |CASEEXPERTING | 0 | 78 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |CASEEXPERTING_CASEEXPERT | 0 | 14 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+ запрос к 'разогретому' серверу 16ms! запрос к 'горячему' серверу 0ms! hvlad, !!!!!!!!!!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2016, 04:54 |
|
|
start [/forum/topic.php?desktop=1&fid=40&tid=1561860]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 169ms |
0 / 0 |