Как создать таблицу поиска по дате, чтобы ускорить сохраненные процедуры?

#tsql #date #lookup

#tsql #Дата #поиск

Вопрос:

Я хочу сократить время, необходимое для одной из моих сохраненных процедур, которая в настоящее время использует следующую логику для вычисления поля даты, как в части выбора, так и в части группы:

 left(datename(month, a.QXP_REPORT_DATE), 3)   ' '''   right(datename(year, a.QXP_REPORT_DATE), 2)
  

Простая таблица поиска займет меньше времени? Если да, то как мне заполнить следующие поля для всех дат за последние 2 года?

 CREATE TABLE #CALENDAR(
    FULLDATE DATETIME,
    MONTHNAME NVARCHAR(3),
    sYEAR SMALLINT
)

INSERT INTO #CALENDAR
    SELECT '4/19/2011', left(datename(month, '4/19/2011'), 3), right(datename(year, '4/19/2011'), 2)
  

Я начинаю думать, что, возможно, вызов функции был бы лучше, чем таблица поиска. Вот все мои хранимые процедуры SQL:

 DECLARE 
@FirstMonthDate DATETIME,
@LastMonthDate DATETIME,
@TheLevel INT,
@ProductGroup VARCHAR(255),
@TheCategory VARCHAR(255),
@ListNumber VARCHAR(50)

--AS
--  SET NOCOUNT ON;

--ComplaintTrendingDrillDown3p '3/1/10', '3/31/11 23:59:59', 3 , 'RealTime IVD', 'Procedure Not Followed', ''
SET @FirstMonthDate = '3/1/11'
SET @LastMonthDate = '3/31/11 23:59:59'
SET @TheLevel = 3
SET @ProductGroup = 'RealTime IVD'
SET @TheCategory = 'Procedure Not followed'
--SET @ListNumber = '2G31-90'

DECLARE @SelectedLevels table (LevelId int not null primary key) 
declare @OneYearAgo datetime

set @OneYearAgo = dateadd(year, -1, @FirstMonthDate)

IF @TheLevel = 3 
BEGIN
INSERT INTO @SelectedLevels (LevelId) VALUES (1)
INSERT INTO @SelectedLevels (LevelId) VALUES (2)
END
ELSE if @TheLevel = 5 
BEGIN
INSERT INTO @SelectedLevels (LevelId) VALUES (0)
INSERT INTO @SelectedLevels (LevelId) VALUES (1)
INSERT INTO @SelectedLevels (LevelId) VALUES (2)
END
ELSE
BEGIN 
INSERT INTO @SelectedLevels (LevelId) VALUES (@TheLevel) 
END

SELECT count(distinct a.QXP_EXCEPTION_NO) AS QXP_EXCEPTION_NO, PRODUCT_CODE_STD,   a.qxp_short_desc,
 left(datename(month, a.QXP_REPORT_DATE), 3)   ' '''   
 right(datename(year, a.QXP_REPORT_DATE), 2) AS MonthYear   ,
 CASE WHEN a.QXP_SHORT_DESC = @TheCategory OR ISNULL(@TheCategory, '') = '' THEN 1 ELSE 0 END AS SELECTED_CATEGORY

FROM ALL_COMPLAINTS a   
INNER JOIN @SelectedLevels F ON A.[LEVEL] = F.LevelId
LEFT OUTER JOIN MANUAL.PRODUCTS b ON a.EPA_PRD_CODE = b.LIST_NUMBER   
LEFT OUTER JOIN SMARTSOLVE.V_CXP_CUSTOMER_PXP  c ON a.QXP_ID = c.QXP_ID     
    WHERE a.QXP_REPORT_DATE >= @OneYearAgo AND 
    a.QXP_REPORT_DATE <= @LastMonthDate AND a.QXP_SHORT_DESC <> 'Design Control'  
    AND (c.QXP_EXCEPTION_TYPE <> 'Non-Diagnostic' OR c.QXP_EXCEPTION_TYPE IS NULL)
AND PRODUCT_GROUP= @ProductGroup   
AND (PRODUCT_CODE_STD = @ListNumber OR ISNULL(@ListNumber, '') = '')
and left(datename(month, a.QXP_REPORT_DATE), 3) = 'may'
  GROUP BY PRODUCT_CODE_STD, left(datename(month, a.QXP_REPORT_DATE), 3)   ' '''   right(datename(year, a.QXP_REPORT_DATE), 2) , a.qxp_short_desc
  order by left(datename(month, a.QXP_REPORT_DATE), 3)   ' '''   
 right(datename(year, a.QXP_REPORT_DATE), 2), product_code_std, qxp_short_desc
  

Рекомендации по плану выполнения:

 CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [SMARTSOLVE].[V_CXP_CUSTOMER_PXP] ([QXP_REPORT_DATE],[QXP_UDF_STRING_8],[QXP_XRS_DESCRIPTION])
INCLUDE ([QXP_ID],[QXP_EXCEPTION_NO],[QXP_BASE_EXCEPTION],[QXP_OCCURENCE_DATE],[QXP_COORD_ID],[QXP_ROOT_CAUSE],[QXP_DESCRIPTION],[QXP_QEI_ID],[QXP_EXCEPTION_TYPE],[QXP_UDF_STRING_2],[QXP_UDF_STRING_5],[CXP_ID],[CXP_AWARE_DATE],[QXP_XSV_CODE],[QXP_COORD_NAME],[QXP_ORU_NAME],[QXP_RESOLUTION_DESC],[QXP_CLOSED_DATE],[CXP_CLIENT_CODE],[CXP_CLIENT_NAME])
  

Комментарии:

1. Я бы внимательно посмотрел на общий план запроса, прежде чем беспокоиться о чем-то подобном для повышения производительности.

2. Почему вы не думаете, что это было бы выгодно?

3. Я интуитивно чувствую, что это очень небольшая часть стоимости запроса. Если вы можете опубликовать дополнительные детали, такие как запрос и план выполнения, мы можем копать дальше.

4. Спасибо, Джо, я только что опубликовал все сохраненные процедуры SQL. Я также опубликовал рекомендации по плану выполнения. 100% стоимости всего из одного запроса.

5. Неважно, я создал рекомендуемый индекс nc, и теперь он выполняется намного быстрее!