|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
#40139989
![]() Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
Ссылка на вложение:
Ссылка на вложение 2:
Ссылка на вложение 3:
|
||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#18+
mssql2005 Всем привет! готовим udf mssql базы для переезда на postgresql (санкции да и вообще все морально устарело, win11 отрубила поддержку tls1.x, 'старого' sql драйвера и т.д. - 20ти летний серверный софт 'умирает' понемногу... денег на обновление не выделяют...) вопрос по оптимизации select - одним запросом выбираем id объектов + 20 (однотипных) left join подгоняем к ним значения атрибутов mssql справляется а postgresql (на той же базе/миграция на том же запросе) 'умирает'(резко тормозит) если left join более 8~10 оставив пока postgresql в стороне просто хочу попытаться ускорить выборку на mssql например через cte (поскольку left join берет инфу из одних и тех же 4х таблиц многократно) ... структура бд от вендора (не можем менять), используем базу лет 20ть проблем нет - работает, так что вопрос чисто по ускорению запроса 1. есть 3 таблицы значений атрибутов (id атрибута, значение атрибута и т.д.) для хранения строк, чисел и дат 2. есть одна таблица связи атрибутов с объектами (id объекта, id атрибута и т.д.) в left join я просто многократно обращаюсь к этим таблицам чтобы по id объекта (из основного запроса по выборке объектов) и id атрибута получить значение атрибута вот что мы использовали последние 20 лет Код: 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.
вот тоже самое через cte Код: 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. 46.
вопрос чисто эмпирический - можно ли как то ускорить запрос многократно использующий в left join одни и те-же таблицы (в данном случае) каким либо другим подходом к выборке? или это все упирается в железо сервера? ps на mssql сейчас отдельная виртуалка winserver2003+mssql2005 (здесь по скорости все более менее, количество left join глотает нормально), на postgres просто виртуалка win8.1+posgresql16 (здесь все это вообще выглядит 'мертвым' при большом количестве left join) ... |
||||||||||||||||||||||
:
Нравится:
Не нравится:
|
||||||||||||||||||||||
12.02.2025, 12:19 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2025, 14:01 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
#40140001
![]() Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
Ссылка на вложение:
Ссылка на вложение 2:
Ссылка на вложение 3:
|
||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#18+
... |
||||||||||||||||||||||
:
Нравится:
Не нравится:
|
||||||||||||||||||||||
12.02.2025, 15:41 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
неожиданно на postgresql стрельнула вот такая конструкция Код: 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. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70.
(самая длинная таблица 9 562 038 строк - подрезаем ее через in = только нужные атрибуты = получается где то 2 700 099 - неважно...) говорим что материализация не нужна as NOT MATERIALIZED( типа в память упаковываем (как я понял) и дальше работаем с ней в запросе - выигрыш на коротких выборках = до 200 - на порядок, на длинных минимум в два раза быстрее в mssql нет эффекта - не нашел флага не материализовать - наверно аналог табличная переменная короче в памяти формируем блок и многократно его используем... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2025, 17:41 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
В статье по EAV в википедии есть вариант конкретно для постгре (и для мс) https://en.wikipedia.org/wiki/Entity–attribute–value_model#PostgreSQL:_JSONB_columns Это переход на JSON хранение. Но он подразумевает изменение структуры, поэтому, возможно, не подойдет. Сам не пользовался, но судя по гуглу такой подход вполне используют. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2025, 20:21 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
Да, в той же статье есть еще всякие разные подходы оптимизации EAV. Отдельно описаны. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2025, 20:24 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
Тяпа-ляпа [игнорируется] ну не знаю... по факту так = в памяти получается быстрее - так оптимизатор их строит, в конечном счете убив неделю на разборки (вылавливая микросекунды на конструирование запроса), отправив все планы на анализ в https://explain.tensor.ru/ - получил только одну рекомендацию = добавить индексов ну и настроить железо под postgresql, и сам сервер постгрис в общем пока все печально ps пойду в их тему - postgres может там найду что Спасибо всем! ... |
|||
:
Изменено: 10.03.2025, 09:35 - ef1
Нравится:
Не нравится:
|
|||
10.03.2025, 09:31 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
ef1 [игнорируется] Все джойны выполняются в памяти, если уж быть точным, даже если данные не в кэше, а на диске на начало выполнения запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2025, 12:15 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
Добрый день. Есть варианты оптимизации запроса, желательно пробовать на данных похожие на реальные. Можно ли получить скрипты на создания таблиц и обезличенные тестовые данные? Если не позволяет размер файлов прикрепить к форуму, можно ссылку на облако. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2025, 11:14 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
ArtToms [игнорируется] скрипты таблиц не проблема - а вот обезличенные данные - проблема - база коммерческая... в принципе запросы идут по 6 таблицам объекты + типы объектов + атрибуты(строковые + числа + дата/время) + связь объектов с атрибутами... да и в mssql все летает, основной трабл в postgresql (https://resql.ru/forum/topic.php?fid=53&tid=2187215) - цель именно там скорость получить в их оптимизаторе.. но за предложение спасибо)) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2025, 09:23 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
ef1 [игнорируется] Добрый день. Попробовать не могу, нет таблиц, хотя бы покажу, что я хотел попробовать. 1. Уменьшить число внешних соединений, выделил полужирным, можно попробовать заменить на внутреннее соединение (inner). Внешнее оставить только к rw, и так в других местах, уменьшаем в два раза. Должно повлиять на скорость выполнения. 2. В MSSQL внешние соединения удавалось сделать внутренними с помощью cross apply. Вот это я хотел попробовать. From lsdbo.Ric_Get_Select(2,100000038900005,'PSft, PHrd, PExp, PSrv, pPls','','',0,'') rw left join --select * From lsdbo.Ric_Get_Select(2,4000000015666,'PSft, PHrd, PExp, PSrv, pPls','','',0,'') rw left join LSDBO.attrib_value AS av ON rw.id = av.Object_ID AND av.Attrib_ID = 100004068400000 LEFT JOIN LSDBO.value_string AS vv ON av.Value_ID = vv.id AND av.Attrib_ID = 100004068400000 left join LSDBO.attrib_value AS av1 ON rw.id = av1.Object_ID AND av1.Attrib_ID = 3000000000101 LEFT JOIN LSDBO.value_string AS vv1 ON av1.Value_ID = vv1.id AND av1.Attrib_ID = 3000000000101 LEFT JOIN ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2025, 09:53 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
ef1 [игнорируется] А можно хотя бы скрипты таблиц? Можно оставить только поля указанные в запросе, попробую накидать тестовые данные. Есть еще один вариант изменения запроса, хочу попробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2025, 13:21 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
ef1 [игнорируется] что мешает вытянуть сначала все объекты и все их атрибуты и поверх PIVOT (для PG crosstab)? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2025, 01:24 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
#40140346
![]() Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
Ссылка на вложение:
|
||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#18+
ShIgor [игнорируется] в общем то ничего за исключением переменной длины столбцов и динамического crosstab в postgresql - изучаю как раз не подскажите синтаксис pivot для поворота на примере t-sql запроса cte объект и его атрибуты Код: 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.
... |
||||||||||||||||
:
Изменено: 13.03.2025, 10:09 - ef1
Нравится:
Не нравится:
|
||||||||||||||||
13.03.2025, 10:07 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
ArtToms [игнорируется] предлагаю через удаленный рабочий стол (например anydesk) посмотреть в MS студии - так будет проще всего - напишите zaytsev@cad.ru - потестим ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2025, 10:23 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
ef1 [игнорируется] упс... к сожалению pivot попробовать здесь не могу = база старая sql compatibility level = server 2000(80) - удалось переехать только на 2005, уровень совместимости поднять не могу (( нет лицензий хотя-бы на 2008 так что мы в пролете )) - это одна из причин 'бегства' на PostgreSQL.... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2025, 10:46 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
ef1 [игнорируется] наверное переменной не длины, а переменного количества столбцов атрибутов у разных объектов? это решается перечислением всех возможных вариантов для каждого объекта, т.е. в плоской таблице у каждого объекта должно быть то количество строк атрибутов, сколько всего столбцов планируется в Pivot вне зависимости, есть они физически у объекта или нет, даже в том случае если объект вообще не имеет атрибутов, например при необходимости вывести 15 атрибутов в столбцы, каждый объект должен иметь 15 строк атрибутов. пример pivot? в интернете вариантов масса, он каждый получается уникальный.. могу набросать с вашими метаданными.. сейчас только времени нет, на досуге.. а, ну и в PG не силен, только знаю что он (PG) есть :) ... |
|||
:
Изменено: 13.03.2025, 11:17 - ShIgor
Нравится:
Не нравится:
|
|||
13.03.2025, 11:16 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
нет лицензий хотя-бы на 2008 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2025, 11:21 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
к сожалению pivot попробовать здесь не могу ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2025, 11:23 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
ShIgor [игнорируется] спасибо!!! в ожидании досуга, пробую разобраться (смущает только требование функции агрегации, а в моем случае агрегировать в общем то нечего) - ps примеров да - навалом, да и 2005 оказалось поддерживает pivot, ок... до связи! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2025, 12:13 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
На postgresql создал тестовые таблицы для выполнения запросов, теперь есть на чем пробовать запросы. Привожу вариант преобразования внешнего соединения во внутреннее. На MSSQL, такая замена значительно увеличивала скорость выполнения запросов. Привожу запросы на postgresql. Переделал фрагмент из вашего запроса и новый вариант. Непонятно зачем вот это условие AND av.Attrib_ID = 100004068400000 в left join value_string AS vv? Отметил полужирным, поставил комментарий, у меня на результаты не повлияло. Интересно на боевой базе данные изменятся? В вашем запросе можно переделать подобным образом все аналогичные блоки. Попробуйте переделайте весь запрос и попробуйте на боевой базе. Интересно как изменится скорость на postgresql? Цитата [игнорируется] select rw.id, vv.value
From Ric_Get_Select (2,100000038900005,'PSft, PHrd, PExp, PSrv, pPls','','',0,'') rw
left join attrib_value AS av ON rw.id = av.Object_ID AND av.Attrib_ID = 100004068400000
left join value_string AS vv ON av.Value_ID = vv.id --AND av.Attrib_ID = 100004068400000
order by rw.id Цитата [игнорируется] select rw.id, vv.value
From Ric_Get_Select (2,100000038900005,'PSft, PHrd, PExp, PSrv, pPls','','',0,'') rw
cross join lateral (select max(vvv.value) as value
from attrib_value av
inner join value_string vvv on av.Value_ID = vvv.id
where rw.id = av.Object_ID
and av.Attrib_ID = 100004068400000) vv
order by rw.id ... |
|||
:
Изменено: 13.03.2025, 20:56 - ArtToms
Нравится:
Не нравится:
|
|||
13.03.2025, 20:53 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
|
|||
---|---|---|---|
#18+
ArtToms [игнорируется] !!! щас буду пробовать вот скрипты таблиц (но лучше конечно на удаленном столе подключится к реальной базе и MSSQL и PostgreSQL - базы идентичны = была миграция средствами разработчика = владельца структуры данных БД ) MSSQL object_reference - таблица объектов Код: 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. 46. 47. 48. 49.
object_type- таблица типов объектов Код: 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.
attrib_value - таблица связей объектов и атрибутов Код: 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.
value_string - таблица строковых значений атрибутов Код: 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.
value_numeric - таблица числовых значений атрибутов Код: 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.
value_datetime- таблица дата время значений атрибутов Код: 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.
object_reference - таблица объектов Код: 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. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65.
object_type- таблица типов объектов Код: 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.
attrib_value - таблица связей объектов и атрибутов Код: 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. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74.
value_string - таблица строковых значений атрибутов Код: 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.
value_numeric - таблица числовых значений атрибутов Код: 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.
value_datetime- таблица дата время значений атрибутов Код: 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. 46. 47. 48.
индексы ric- в postgresql - мои по рекомендациям от https://explain.tensor.ru/ - типа к делу не относятся ... |
|||
:
Изменено: 14.03.2025, 09:18 - ef1
Нравится:
Не нравится:
|
|||
14.03.2025, 09:15 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
#40140361
![]() Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
Ссылка на вложение:
Ссылка на вложение 2:
|
|||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#18+
ArtToms [игнорируется] тесты по запросу из начала топика - по первому предложению (в общем то и там и там одно и тоже - наиболее 'полный по ограничениям' запрос чуть быстрее) mssql 2005 (10 выборок, база рабочая кешированная)postgres16 (~5 выборок, тестовая база - практически не кешированная)щас второе подготовлю внутреннее соединение... ... |
|||||||||||||||||||
:
Нравится:
Не нравится:
|
|||||||||||||||||||
14.03.2025, 10:02 |
|
оптимизация '+10left join' на cte (подготовка к переезду mssql>postgresql)
#40140362
![]() Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
Ссылка на вложение:
Ссылка на вложение 2:
|
|||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#18+
ArtToms [игнорируется] во по планам по запросам по второму без --AND av.Attrib_ID = 100004068400000 mssqlpostgresqlexplain analyze ->https://explain.tensor.ru/ название pg_test_zaytsev_01 - не знаю откроется по ссылке или нет (публичный архив simple plan) https://explain.tensor.ru/archive/explain/bc5285eb94ce30b11d55bd4105a1f75a:0:2025-03-14#explain ... |
|||||||||||||||||||
:
Нравится:
Не нравится:
|
|||||||||||||||||||
14.03.2025, 10:22 |
|
|
start [/forum/topic.php?fid=46&msg=40140359&tid=2187185]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
others: | 286ms |
total: | 435ms |
0 / 0 |