|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
Есть 2 таблицы: Service (14 253 068 записей) - в таблице по обращениям человека собран набор услуг(разновидностей) которые человек использует. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Таблица разновидностей по всем услугам [SRC sq RIZNOVID_JKP (2160 записей) - Таблица разновидностеl]CREATE TABLE RIZNOVID_JKP ( BD SMALLINT NOT NULL, - номер БД DICT SMALLINT NOT NULL, - номер справочника в БД CODE SMALLINT NOT NULL, - код разновидности CODE1 SMALLINT NOT NULL, CONFG VARCHAR(1) default '', NAME VARCHAR(50), - название разновидности NAME_NEW VARCHAR(50), PAR SMALLINT default 1, PAR1 SMALLINT default 0, COUNT_USE INTEGER, - количество использований (сколько раз встречается в БД) LAST_USE DATE - максимальная дата_е из таблицы сервис ); [/SRC] Для заполнения таблицы разновидностей использую хранимку. В хранимке идет сначала заполнение разновидностями - это операция проходит за 2-3 секунды. А потом идет заполнение 2 полей: COUNT_USE - количество использований в таблице сервис LAST_USE - максимальная DATА_E каждой разновидности по таблице сервис. Вот как я это делаю: Код: sql 1. 2. 3. 4. 5.
dict=41 - это услуга квартплата. таких update 8 штук, на каждую услугу. При разных услугах меняется столбец posl. Для отопления dict=15 и posl2 В чем у меня проблема: Каждый select count, в отдельности, выполняется 10-15 секунд. что при размере таблицы в 2160 записей получаем около 9 часов на выполнение. Вот план запроса Код: sql 1.
План PLAN (SERVICE INDEX (PK_SERVICE)) ------ Информация о производительности ------ Время подготовки запроса = 31ms Время выполнения запроса = 12s 547ms Среднее время на получение одной записи = 12 547.00 ms Current memory = 437 161 904 Max memory = 443 031 472 Memory buffers = 50 000 Reads from disk to cache = 134 682 Writes from cache to disk = 1 Чтений из кэша = 14 387 685 Можно ли как-то ускорить процесс прописывания в каждую разновидность COUNT_USE и LAST_USE Тут конечно проблема еще связана с таблицей Service. Если бы в ней было меньше записей - все бы работало чуть быстрее. Но уменьшить ее увы никак. П.С. Пока пиал пришла мысль - а ускорится ли процесс, если каждую разновидность по услугам в Service расписать не в ширину, а в высоту. Что скажите. Правда записей могу получить в 8 раз больше, т.е. 14млн*8. -------------------------- Firebird 3.0.4.33054; IBExpert 2018.5.14.1; Windows 10 32-bit; 4Gb RAM; SSD 512Mb + HDD 1 Tb; Настройки по умолчанию Среда разработки: Delphi XE2 + FIBPlus 7.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2019, 12:41 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
akrush, не рассматривали вариант разнести разные виды работ в разные таблицы? Учитывая что данные есть - вместо громоздкой текущей таблицы сделать view что бы не сразу перелопачивать софт. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2019, 13:40 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
Dmitriy_3206, Идея интересная. Сейчас попробую сделать 8 вьюх и из них выбирать, если я правильно понял направление :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2019, 13:58 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
Dmitriy_3206, Спасибо за подсказку. Не долго думаю соорудил запрос: Код: sql 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.
Теперь создам таблицу и результат в таблицу. Тогда выборка в хранимке будет идти уже просто по таблице. План запроса и время работы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Это не 9 часов. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2019, 14:11 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
а подправить хранимку для работы с другой таблицей - это не проблема :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2019, 14:12 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
Все получилось. Спасибо за "ускорительный пинок" в нужном направлении. отработало все максимум минуты за 3 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2019, 15:05 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
akrush, а у Вас таблица service индексы какие-нибудь имеет? Вижу что запросы идут по натуралу. Тогда это не дело. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2019, 18:08 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
akrush, попробуй переписать на merge ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2019, 19:36 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
KreatorXXIakrush, а у Вас таблица service индексы какие-нибудь имеет? Вижу что запросы идут по натуралу. Тогда это не дело. Значит плохо смотрите. В первом посте есть ДДЛ таблицы с праймари кеем Дальше по тексту есть запрос с планом и там видно что он выполняется как раз по ключу. По поводу перебора натуралом - заметил что если использовать count или max, то идет натуралом. Но может ошибаюсь, тогда подскажите по какому полю желательно достроить дополнительный индекс. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2019, 21:44 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
Симонов Денисakrush, попробуй переписать на merge Денис, подскажите как, хотя бы условным примером по моим таблицам ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2019, 21:45 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
akrush, сначала неплохо бы проверить сколько будет выполняться вот такой запрос Код: sql 1. 2. 3. 4. 5. 6. 7.
З.Ы. 50K буферов тут маловато ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2019, 22:04 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
akrush, я на 100 процентов могу быть неправ. На вот запрос: Код: sql 1.
И я бы попробовал создать индекс с posl1, bd, typ. И ещё бы туда добавил бы дату в обратном порядке (имею ввиду весь индекс сделал бы по убыванию). Именно в этом запросе индекс с датой не поможет. Потому что есть count. А без count можно хорошо сократить время выборки. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 12:12 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
Симонов Денис, Запустил. Запустил давно, еще в ок. 09:00 по Киевскому времени. Эксперт ушел в себя и до сих пор не вернулся. Перезапустил ФБ чтобы оборвать процесс :( ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 12:33 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
KreatorXXIakrush, я на 100 процентов могу быть неправ. На вот запрос: Код: sql 1.
И я бы попробовал создать индекс с posl1, bd, typ. И ещё бы туда добавил бы дату в обратном порядке (имею ввиду весь индекс сделал бы по убыванию). Именно в этом запросе индекс с датой не поможет. Потому что есть count. А без count можно хорошо сократить время выборки. В целом и так уже сократили. с более чем 9 часов на 3 минуты. Но я понял суть. попробую накидать таких индексов. П.С. Эта база только моя для анализа и создания таблиц прекодировок, поэтому избыточность не существенна. Уперся в проблему по сути только на одном клиенте, где большая база сервис. На остальных, даже где было 26 БД, сервис был поменьше - 1.7 млн записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 13:12 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
akrushЭксперт ушел в себя и до сих пор не вернулся. Перезапустил ФБ чтобы оборвать процесс :(Надо было весь комп перезапустить. Ресетом. Но надёжнее - пробки выкрутить. На подстанции. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 13:37 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
KreatorXXIИ я бы попробовал создать индекс с posl1, bd, typ. И ещё бы туда добавил бы дату в обратном порядке (имею ввиду весь индекс сделал бы по убыванию). Именно в этом запросе индекс с датой не поможет. Потому что есть count. А без count можно хорошо сократить время выборки. Создал индексы Код: sql 1. 2.
только на все 8 услуг. размер БД чуток вырос, на 1,2Гб, но это не смертельно. Обработка сократилась до 1 минуты. :) Спасибо за подсказку. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 13:38 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
akrushСимонов Денис, Запустил. Запустил давно, еще в ок. 09:00 по Киевскому времени. Эксперт ушел в себя и до сих пор не вернулся. Перезапустил ФБ чтобы оборвать процесс :(\ А вот после создания вышеприведенных индексов - все отработало: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 13:48 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
akrush Код: sql 1.
ну ё-маё. Структура у вас полный трындец. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 13:58 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
akrushСоздал индексы Код: sql 1. 2.
Второй индекс полностью дублирует первый. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 14:01 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
akrushakrushСимонов Денис, Запустил. Запустил давно, еще в ок. 09:00 по Киевскому времени. Эксперт ушел в себя и до сих пор не вернулся. Перезапустил ФБ чтобы оборвать процесс :(\ А вот после создания вышеприведенных индексов - все отработало: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
к RIZNOVID_JKP dict ещё индекс сделай ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 14:02 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
akrushakrushСимонов Денис, Запустил. Запустил давно, еще в ок. 09:00 по Киевскому времени. Эксперт ушел в себя и до сих пор не вернулся. Перезапустил ФБ чтобы оборвать процесс :(\ А вот после создания вышеприведенных индексов - все отработало: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Запрос надо переделать. Зачем два раза s.posl1? И, да, пробовать merge, если нужен update. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 14:14 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
Симонов Денисakrush Код: sql 1.
ну ё-маё. Структура у вас полный трындец. Трындец - потому что Кларион 2.1 ДОС. Я веду конвертацию в ФБ и некоторые выборки потом формирую. В целом уже была тема "Кларин отфаербердить" Жаль только что директору это не надо и я это делаю на полном энтузиазме и в свободное, от основной работы, время. Но уже почти на финише конвертации Clarion 2.1 DOS -> Firebird 3.0 Так куча всего: и битовые поля, где значения могут быть как 1 бит, так и несколько бит. И это все надо правильно разобрать хотябы по текущему, последнему "пониманию" структуры БД. Ладно, простите за лирическое отступление. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 14:55 |
|
Помогите с оптимизацией
|
|||
---|---|---|---|
#18+
Симонов Денисakrushпропущено... \ А вот после создания вышеприведенных индексов - все отработало: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
к RIZNOVID_JKP dict ещё индекс сделай Я правильно понял, желательно создать индекс: CREATE INDEX IDX_RIZNOVID_JKP ON RIZNOVID_JKP (BD, DICT, CODE); или только на поле DICT? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 14:57 |
|
|
start [/forum/topic.php?fid=40&fpage=20&tid=1560590]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
others: | 49ms |
total: | 215ms |
0 / 0 |