|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Здравствуйте! Помогите, пожалуйста, с оптимизацией запроса. Есть 2 таблицы. 1) Таблица типов товаров (идентификатор типа, наименование типа). Код: plaintext 1. 2. 3.
2) Таблица товаров (ID - идентификатор товара, BOX - номер партии, A_ID - тип товара, OTHER - тип товара, при его отсутствии в Справочнике №1). Код: plaintext 1. 2. 3. 4. 5. 6.
Задача. Для каждой партии товаров вывести число товаров в ней и тип товара, если он совпадает для всех товаров в этой партии. Получается: Код: plaintext 1. 2. 3. 4.
Решил следующим образом, но дико не нравится 2 подзапроса для определения второго столбца A_STR (долго работает на больших объемах данных). Код: 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.
Запрос явно не оптимален, дико туплю)) Комрады, просьба подсказать) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 22:07 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Tketano A_ID - тип товара, OTHER - тип товара, при его отсутствии в Справочнике №1). Tketano Задача. Для каждой партии товаров вывести число товаров в ней и тип товара, если он совпадает для всех товаров в этой партии. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 22:38 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Tketano, Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 23:00 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 23:01 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 07:04 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Впрочем, так будет симпотичнее Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 07:09 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Всем спасибо!! Сейчас буду изучать предложенные варианты, сходу не все столбцы в cte пока понятны. Кстати, если необходимо вывести ещё несколько полей типа BOX (сведения для целой партии, которые одинаковы для всех строк в рамках партии), то лучше их добавить сразу в group by после BOX? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 10:47 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
invmТогда каким образом в результат попал BOX 3? Информация о всех партиях (BOX) в любом случае должна попасть в выборку, как и число товаров в ней. Что-то ни одно решение не работает правильно... Да, еще забыл уточнить, SQL Server 2008. IIF подменить не проблема, но варианты с FIRST_VALUE совсем не подходят =) Вот пример исходных данных таблицы товаров, где начинается некорректный подсчет: Код: plaintext 1. 2. 3. 4. 5. 6.
Ожидаемый результат: Код: plaintext 1. 2. 3. 4.
На всякий уточню. Значение null в столбцах A_ID и OTHER интерпретируется как отдельное значение, т.е. если, например, в столбце OTHER всего 2 значения null и '123', то итоговый резальтат будет null. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 11:39 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Извиняюсь, ошибся немного в данных. Код: plaintext 1. 2. 3. 4. 5. 6.
Ожидаемый результат: Код: plaintext 1. 2. 3. 4.
Исходные данные: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 11:53 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Tketano варианты с FIRST_VALUE совсем не подходят =) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 12:19 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
aleks222 Впрочем, так будет симпотичнее Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Если данные двух столбцов одновременно не нужны, то получается такой вариант: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 15:19 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
court, Спасибо. Интересное и рабочее решение на первый взгляд. Причем это самый производительный вариант из всех предложенных на реальных данных... Большое спасибо! Ушел разбираться в коде запроса 8) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 15:23 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Tketano aleks222 Впрочем, так будет симпотичнее Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Если данные двух столбцов одновременно не нужны, то получается такой вариант: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Правильно? Бред. 1. Ты ничего не понял. 2. Если тебе надо быстро - нехрен пихать под группировку соединение таблиц. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 05:39 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Эквивалентное преобразование к 2008 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 05:59 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
court Tketano варианты с FIRST_VALUE совсем не подходят =) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
А какой смысл flag1 и flag2 втягивать в cte? Почему не вытащить isnull(a.A_STR,t.OTHER), а затем применить к этому значению агрегатные функции? Типа так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Ну и по сути cte становится уже не нужна, можно в один select все вывести. Или я не понял идею. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 17:37 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
aleks222 Эквивалентное преобразование к 2008 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Хм, видимо действительно не понял. Т.е. идея вначале проверить уникальность A_ID (как числа) и столбца OTHER без лишних связок с другими таблицами и только потом подтянуть другие данные? Дополнительно 2 вопроса: 1) Если в таблице Товаров кроме BOX есть еще BOX_NUMBER (отображаемый номер партии) и он идентичен для всех строк с одним и тем же BOX, то на каком этапе его лучше вытягивать? В group by таблицы x (group by BOX, BOX_NUMBER)? 2) Если столбец OTHER на самом деле делится на 2 столбца: строка и дата, которые соединяются для отображения в специальном формате, то лучше эти данные сразу соединить в таблице t (OTHER_STR+' '+CONVERT(char(10), OTHER_DATE, 104)) или адаптировать запрос с учетом нового типизированного столбца даты и соединить данные в итоговом селекте? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 18:26 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Tketano 1) Если в таблице Товаров кроме BOX есть еще BOX_NUMBER (отображаемый номер партии) Код: sql 1.
BOX, то на каком этапе его лучше вытягивать? В group by таблицы x (group by BOX, BOX_NUMBER)? 2) Если столбец OTHER на самом деле делится на 2 столбца: строка и дата, которые соединяются для отображения в специальном формате, то лучше эти данные сразу соединить в таблице t (OTHER_STR+' '+CONVERT(char(10), OTHER_DATE, 104)) или адаптировать запрос с учетом нового типизированного столбца даты и соединить данные в итоговом селекте? 1. min/max(BOX_NUMBER) group by BOX 2. пофиг. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2020, 05:25 |
|
|
start [/forum/topic.php?fid=46&fpage=71&tid=1686577]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 155ms |
0 / 0 |