Скорость запросов в SSMS против Excel MS Query - PullRequest
0 голосов
/ 12 февраля 2020

Поэтому я часто использую MS Query в Excel для встраивания SQL запросов к серверу в электронные таблицы, и это прекрасно работает, но есть проблема скорости, которая всегда беспокоила меня. Возьмем следующий запрос, например:

SELECT
    CAST(r.OrderNo AS INT) AS OrderNo,
    o.Priority,
    r.JobNo,
    r.PartNo,
    r.WorkCntr,
    o.QtyToMake,
    r.ActualPcsGood,
    r.TotEstHrs AS [EstHrs],
    o.QtyToMake* CASE r.TotEstHrs  WHEN 0 THEN 1 ELSE r.TotEstHrs END AS [TotalEstHrs],
    SUM(o.QtyToMake*CASE r.TotEstHrs  WHEN 0 THEN 1 ELSE r.TotEstHrs END) OVER(PARTITION BY r.OrderNo, r.WorkCntr) AS  [Total Hrs per WC per Order],
    CASE
        WHEN o.QtyToMake = 1 AND r.ActualPcsGood >= 1 THEN ROUND(CASE r.TotEstHrs  WHEN 0 THEN 1 ELSE r.TotEstHrs END/SUM(o.QtyToMake*CASE r.TotEstHrs  WHEN 0 THEN 1 ELSE r.TotEstHrs END) OVER (PARTITION BY r.OrderNo,r.WorkCntr), 10) 
        WHEN o.QtyToMake > 1 AND r.ActualPcsGood >= 1 AND r.ActualPcsGood <= o.QtyToMake THEN ROUND((r.ActualPcsGood*CASE r.TotEstHrs  WHEN 0 THEN 1 ELSE r.TotEstHrs END)/SUM(o.QtyToMake*CASE r.TotEstHrs  WHEN 0 THEN 1 ELSE r.TotEstHrs END) OVER(PARTITION BY r.OrderNo, r.WorkCntr), 10)
        WHEN o.QtyToMake > 1 AND r.ActualPcsGood > o.QtyToMake THEN ROUND((o.QtyToMake*CASE r.TotEstHrs  WHEN 0 THEN 1 ELSE r.TotEstHrs END)/SUM(o.QtyToMake*CASE r.TotEstHrs  WHEN 0 THEN 1 ELSE r.TotEstHrs END) OVER(PARTITION BY r.OrderNo, r.WorkCntr), 10)
        ELSE 0
    END AS [Item % per WC per Order]
FROM OrderDet o
    JOIN OrderRouting r ON o.JobNo = r.JobNo AND o.OrderNo = r.OrderNo
WHERE r.WorkCntr IN ('Cutting', 'Framing', 'Assembly', 'Grinding', 'ZincNation', 'Z-Straight', 'Painting', 'Glazing', 'Locknprep', 'Testing', 'Packaging')
    AND o.QtyToMake >= 1
GROUP BY r.OrderNo, o.Priority, r.JobNo, r.PartNo, r.WorkCntr, o.QtyToMake, r.ActualPcsGood, r.TotEstHrs
ORDER BY 2 DESC,  CAST(SUBSTRING(r.PartNo, CHARINDEX('.',r.PartNo)+1, CHARINDEX('.',r.PartNo+'.',CHARINDEX('.',r.PartNo)+1) - CHARINDEX('.',r.PartNo)-1) AS INT), 4, 5;

, который выполняется за 2 секунды (125 тыс. Строк) в SQL Server Management Studio. Точно такой же запрос, скопированный и вставленный в MS Query, занимает 17 секунд. Это всего лишь один пример, но практически любой запрос, который мне приходит в голову, гораздо медленнее вычисляется в Excel, и это особенно утомительно, когда это лист с несколькими запросами. Некоторые листы могут занять 5+ минут при нажатии «Refre sh All»

Я не знаю, есть ли у кого-нибудь ответ на этот вопрос, но мне просто интересно, могу ли я что-нибудь сделать с этим. Я использую 32-разрядную версию Excel, которая, по-видимому, ограничена 2 ГБ ОЗУ, однако, когда я выполняю запросы, я замечаю, что процесс Excel никогда не занимает больше 1 ГБ ОЗУ, хотя загрузка ЦП действительно превышает 90%. при выполнении этого конкретного запроса, не уверен, что это актуально. Мой P C - это ОЗУ i5, 3.2 ГГц, 8 ГМ. Я думал об обновлении, чтобы посмотреть, поможет ли это, но, честно говоря, не знаю, будет ли это вообще иметь значение. Я предполагаю, что MS Query настолько стар и неоптимизирован по сравнению с SSMS, но я решил задать этот вопрос в надежде получить больше понимания от любого, кто может быть осведомлен об этом предмете. Спасибо

...