SQL оставил соединение - замедление на меньшем столе? - PullRequest
0 голосов
/ 25 октября 2018

Использование SQL Server Express.У меня есть основная таблица транзакций продаж, которая хранит историю всех данных транзакций продаж.Эта таблица обновляется ежедневно, чтобы добавить новую строку, фиксирующую любые изменения в транзакции продажи.

Из этой таблицы у меня создано два представления - одно для Sales_Closed и одно для Open_Bookings.Каждое представление возвращает один и тот же набор столбцов, только данные фильтруются соответственно.

Когда я select * от каждого, происходит следующее:

  • Bookings_open - работает за 1 секунду, возвращает ~ 28 000 строк.
  • Sales_Closed- работает за 4 секунды, возвращает ~ 200 000 строк.

Дополнительно - я создал таблицу для сбора всех комбинаций релевантных данных, необходимых для моего окончательного результата, отчет, показывающий открытые заказы и закрытые продажи 1 год назад и 1 год вперед.Столбцы из этой таблицы с заголовком Work_Template_month: UPC, Местоположение, Канал, Тип продаж, Месяц, Год и финансовый год.

Запуск Select * из этой таблицы возвращает:

  • Work_Template_month - выполняется за 23 секунды - 1 995 552 строки (вауцеры, и да, он должен быть таким большим, потому что яделать больше, чем описано в последующих частях SQL)

Так что теперь самое интересное: если я выполню этот SQL-запрос здесь, и поменяю местами (строка 14)

LEFT OUTER JOIN dbo.bookings_open AS E  

с

LEFT OUTER JOIN dbo.sales_closed AS E

Sales_Closed выполняется за 23 секунды

Bookings_open выполняется за 3: 00 !!!!

Почему бы меньший столзаймет в 8 раз больше времени!

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

В итоге я использовал представление для Open_Bookings, чтобы создать таблицу (с точными столбцами), которая теперь называется Open_bookings_tbl.

Я заменил строку 14 на: LEFT OUTER JOIN dbo.bookings_open_tbl AS E

Это теперь выполняется за 19 секунд, и я все еще растерялся, счастлив, но озадачен.План выполнения ниже.

Bookings_table_Execution_Plan

0 голосов
/ 25 октября 2018

Ваш критерий соединения - это проблема

ON D.upc = E.upc 
                           AND D.sales_type = E.sales_type 
                           AND D.channel = E.channel_name 
                           AND D.month = E.shipped_month 
                           AND D.year = E.shipped_year 
                           AND D.adj_location = E.adj_location

ЕСЛИ было бы лучше, если бы соединение было по первичному ключу с внешним ключом, то вместо этого вы запрашиваете несколько полей, поэтому у executuin есть хешированный поиск вЭто.Попробуйте добавить покрывающие индексы в sales_type, Channel_month_year и adj_location

...