Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Медленно исполняющийся запрос
|
|||
|---|---|---|---|
|
#18+
Имеем примерно следующую ситуацию. 1. Классы Items с полем Name - некое динамически пополняемое и очищаемое хранилище, несколько сотен тысяч записей. Items1 c полями Id,Name,Param,Parent - древовидный справочник, несколько тысяч записей. Items2 c полями Name, Item1Id - линейный справочник, под миллион записей, динамически пополняемый. ItemsToItems2 с полями ItemId и Item2Id - класс, обеспечивающий отношение многие ко многим для хранилища Items и справочника Items2 Запрос, выдающий для каждого элемента справочника Items1 количество записей в хранилище, которые имеют связь через объекты класса ItemsToItems2 со справочником Items2,которые, в свою очередь, связаны с соответствующим элементом справочника Items1 SELECT Id AS Item1Id,Parent AS pId, Param,Name, (SELECT COUNT(DISTINCT ItemId) FROM ItemsToItems2 WHERE Item2Id->Item1Id=Items1.ID) AS ItemsCount FROM Items1 ORDER BY Param. Запрос выполняется около минуты, что есть много. Какие меры можно принять для ускорения запроса, как его оптимизировать, какие индексы нарисовать? Что любопытно, при некоторых вариантах выбора поля и направления сортировки (ORDER BY Param DESC) запрос выполняется за пару секунд (жаль, что не всегда нужна именно такая сортировка, точнее она совсем никогда не нужна). Можно было бы, конечно, при записи в Items увеличивать какой-нибудь счетчик для Items1, но на запрос могут быть наложены дополнительные условия, а на все варианты условий счетчиков не напасешься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2008, 20:13 |
|
||
|
Медленно исполняющийся запрос
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Во-первых, можно создать вычислимое (Calculated) поле в Items1 которое бы вернуло количество записей из ItemsToItems2 Во-вторых, можно использовать глобалы и при операции Insert/Delete/Update записывать количество записей для конкретной группы. Поле Calculated сразу бы возвращало из глобала значение. В-третьих можно грамотно использовать индексы, построить индекс на таблицу ItemsToItems2 по полю Item2Id P.S. 2 метод этот модифицированный 1 метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2008, 06:28 |
|
||
|
Медленно исполняющийся запрос
|
|||
|---|---|---|---|
|
#18+
1) $SYSTEM.SQL.TuneTable; 2) Для ускорения соединений рекомендую на все Relationship поставить индекс; 3) Для ускорения в частности count рекомендую bitmap -индекс; 4) В индексе можно хранить некоторые данные, например Param для order by ; 5) Смотрите план запроса и его стоимость в SMP: [Домашняя страница] > [SQL] > [Исполнить SQL запрос]. PS: еще можете воспользоваться материалами DevCon 2008 , например, Understanding and Optimizing SQL Performance ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2008, 11:56 |
|
||
|
Медленно исполняющийся запрос
|
|||
|---|---|---|---|
|
#18+
Что-то производительность Cache' не радует. Есть класс, состоящий из ссылок на классы-справочники и нескольких текстовых полей, полмиллиона записей. Если запрос выдать без сортировки, первая запись появляется практически мгновенно. Если добавить правило ORDER BY по любому полю (по всем созданы индексы, по справочникам - bitmap), то время выдачи первой записи колеблется от 5 до 15 секунд. Что еще можно сделать для ускорения, учитывая, что размер таблицы быстро изменяется и может быть в пределах от нуля до нескольких миллионов записей, а разные запросы могут выдавать разную долю этих записей (т.е. установка для класса значений количества записей и доли записей, возвращаемых типовым запросом вроде как бессмысленна)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 19:26 |
|
||
|
Медленно исполняющийся запрос
|
|||
|---|---|---|---|
|
#18+
Hisbreht Victor , где тестовый пример? Без примера как отвечать на твои вопросы? ---------- Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 08:14 |
|
||
|
Медленно исполняющийся запрос
|
|||
|---|---|---|---|
|
#18+
Для запроса из первого поста создал соответствующие таблички: Items - 500000 записей Items1 - 50000 записей Items2 - 850000 записей ItemsToItems2 - 1100000 записей В Items2 индекс Код: plaintext 1. В ItemsToItems2 индекс Код: plaintext 1. Приведённый запрос выполнился за 34 секунды Изменил индекс в ItemsToItems2 на Код: plaintext 1. Запрос выполнился за 26 секунд Добавил в ItemsToItems2 вычислимое поле и индекс по нему: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Изменил запрос: Код: plaintext 1. 2. 3. Время выполнения: 17 секунд Время засекалось от создания %ResultSet до окончания пустого цикла WHILE rs.Next() {} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 14:54 |
|
||
|
Медленно исполняющийся запрос
|
|||
|---|---|---|---|
|
#18+
Если и это сильно много, можно сделать так: Добавляем индекс в ItemsToItems2 Код: plaintext 1. А в Items1 создаём хранимую процедуру Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Теперь запрос принимает вид Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 15:51 |
|
||
|
Медленно исполняющийся запрос
|
|||
|---|---|---|---|
|
#18+
CJIECAPb Добавил в ItemsToItems2 вычислимое поле и индекс по нему: Код: plaintext 1. 2. 3. 4. 5. 6. 7. На приведенный код Cache, естественно, ругается, что такого метода нет. Что тут имелось ввиду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2008, 11:44 |
|
||
|
Медленно исполняющийся запрос
|
|||
|---|---|---|---|
|
#18+
Hisbreht Victor CJIECAPb Добавил в ItemsToItems2 вычислимое поле и индекс по нему: Код: plaintext 1. 2. 3. 4. 5. 6. 7. На приведенный код Cache, естественно, ругается, что такого метода нет. Что тут имелось ввиду? Хм. У меня работает. У вас какая версия каше? В классе Item2Id поле Item1Id какой тип имеет? Если %String - замените на Items1. В ##class(Items2) параметра SqlComputeCode пропишите полное имя класса (если пакет по умолчанию User, то ##class(User.Items2)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2008, 12:29 |
|
||
|
Медленно исполняющийся запрос
|
|||
|---|---|---|---|
|
#18+
CJIECAPbХм. У меня работает. У вас какая версия каше? В классе Item2Id поле Item1Id какой тип имеет? Если %String - замените на Items1. В ##class(Items2) параметра SqlComputeCode пропишите полное имя класса (если пакет по умолчанию User, то ##class(User.Items2))В общих чертах заработало, просто немного ошибся при копировании текста, но возникла другая проблема, условие запроса WHERE Item1Id=Items1.ID возвращает всегда "ложь". Почему это может быть? При отборе Item1Id видно, какие он принимает значения. Такой объект в Items1 есть, но сравнение всегда ложно. И так любая операция сравнения кроме !=, которая всегда возвращает "истина". С чем это может быть связано, где я опять мог ошибиться? Бился как пчелка об мед, но пока не понял, что бы это значило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2008, 21:19 |
|
||
|
Медленно исполняющийся запрос
|
|||
|---|---|---|---|
|
#18+
Hisbreht Victor CJIECAPbХм. У меня работает. У вас какая версия каше? В классе Item2Id поле Item1Id какой тип имеет? Если %String - замените на Items1. В ##class(Items2) параметра SqlComputeCode пропишите полное имя класса (если пакет по умолчанию User, то ##class(User.Items2))В общих чертах заработало, просто немного ошибся при копировании текста, но возникла другая проблема, условие запроса WHERE Item1Id=Items1.ID возвращает всегда "ложь". Почему это может быть? При отборе Item1Id видно, какие он принимает значения. Такой объект в Items1 есть, но сравнение всегда ложно. И так любая операция сравнения кроме !=, которая всегда возвращает "истина". С чем это может быть связано, где я опять мог ошибиться? Бился как пчелка об мед, но пока не понял, что бы это значило. Если Код: plaintext 1. Выполни Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 08:10 |
|
||
|
|

start [/forum/topic.php?fid=39&fpage=69&tid=1558828]: |
0ms |
get settings: |
4ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 310ms |

| 0 / 0 |
