Я пытаюсь ускорить мой запрос. Мне нужно запустить 2 скалярнозначных функции для каждой строки с несколькими столбцами в качестве параметров.Самый эффективный способ выполнения нескольких скалярных функций в строке
функция делает расчет на основе текущих итогов, и нет простого способа (что я знаю), чтобы сделать это в сервере SQL 2008.
Часть КТР моего запрос получает все строки Мне нужны расчеты, и его нужно запускать индивидуально для каждого уровня. Связь для клиентов в магазинах - «один ко многим», но вы не можете получить расчет на уровне клиента (Store = «All») на основе каждого из своих расчетов магазинов.
Моя первая попытка состояла в том, чтобы вызовы функций выполнялись в инструкции SELECT, но я читал, что они будут работать синхронно, что не обязательно. Попытка, приведенная ниже, пыталась превратить вычисление в значение таблицы в попытке запустить их асинхронно.
Мне было интересно, если OUTER APPLY - это путь, или если бы был более эффективный способ сделать это.
Дайте мне знать, если вам нужна дополнительная информация!
DECLARE @StartTime INT
SET @StartTime=20170101
DECLARE @EndTime INT
SET @EndTime=20170131
;WITH IsAvgStores AS (
SELECT
COALESCE(ParentClient,'All') AS ParentClient,
COALESCE(Client,'All') AS Client,
COALESCE(Store,'All') AS Store,
MAX(Answer_Threshold),
MAX(SL_Threshold)
FROM
client_hierarchy
WHERE
GETDATE() BETWEEN EFF_BEGIN_DATE AND EFF_END_DATE
GROUP BY ROLLUP(ParentClient,Client,Store)
)
SELECT I.ParentClient,I.Client,I.Store
,SL.isAvg_SL_String
,A.isAvg_ASA_String
INTO #isAvgTemp
FROM IsAvgStores I
OUTER APPLY (SELECT dbo.isAvg_S_B(ParentClient,Client,Store,Answer_Threshold,@StartTime,@EndTime) AS isAvg_SL_String
) SL
OUTER APPLY (SELECT dbo.isAvg_A_B(ParentClient,Client,Store,SL_Threshold,@StartTime,@EndTime) AS isAvg_ASA_String
) A
WHERE ParentClient<>'All'
SELECT *
FROM #isAvgTemp
Я не вижу, как работает rollup – Paparazzi
@Paparazzi, вы правы, я забыл добавить MAX() на порогах. – reidodorito