1

我创建了一个索引来帮助一个非常长的 28 分钟 qry 运行得更快,它似乎并没有太大帮助。

这是我创建的索引

USE [NLTR201212_test]
GO
CREATE NONCLUSTERED INDEX [Billys Index, sysname,]
ON [dbo].[tblInsurance] ([TERM_REASON])
INCLUDE ([POLICY_NO],[IssueYear],[ISSUE_DATE],[LM_PLAN_CODE],[AMOUNT_INFORCE],[StatReserve],[StatReserveX],[DefPremReserve],[ExcessCashValue],[ExcessCashValueX],[STAT2_PUA_RES],[STAT2_OYT_RES],[StatOYTRes2X],[COMPANY_CODE],[PHASE_CODE],[SUB_PHASE_CODE],[ProdType])
GO

这是我创建的第一个索引,所以如果我以某种方式做错了,我不会感到惊讶。TblInsurance确实有一个由五列(COMPANY_CODE, LINE_OFBUSINESS, POLICY_NO, PHASE_CODESUB_PHASE_CODE)组成的主键。

不知道还能做些什么来帮助这种情况。

这是qry,

SELECT 
    qry_tempCashValue2.IssueYear, 
    qry_tempCashValue2.LM_PLAN_CODE, 
    Count(qry_tempCashValue2.POLICY_NO) AS CountOfPOLICY_NO, 
    qry_tempCashValue2.[Interest Rate Code]
FROM
(
    SELECT 
        qry_tempCashValue.POLICY_NO, 
        qry_tempCashValue.IssueYear, 
        qry_tempCashValue.ISSUE_DATE, 
        qry_tempCashValue.LM_PLAN_CODE, 
        qry_tempCashValue.AMOUNT_INFORCE, 
        qry_tempCashValue.StatReserve, 
        qry_tempCashValue.StatReserveX, 
        qry_tempCashValue.DefPremReserve, 
        qry_tempCashValue.ExcessCashValue, 
        qry_tempCashValue.ExcessCashValueX, 
        qry_tempCashValue.STAT2_PUA_RES, 
        qry_tempCashValue.STAT2_OYT_RES, 
        qry_tempCashValue.StatOYTRes2X, 
        qry_tempCashValue.[Calc Parameters Code], 
        Max(qry_tempCashValue.[Low Issue Date]) AS [MaxOfLow Issue Date], 
        qry_tempCashValue.[Interest Rate Code]
    FROM
    (
        SELECT 
            tblInsurance.POLICY_NO, 
            tblInsurance.IssueYear, 
            tblInsurance.ISSUE_DATE, 
            tblInsurance.LM_PLAN_CODE, 
            tblInsurance.AMOUNT_INFORCE, 
            tblInsurance.StatReserve, 
            tblInsurance.StatReserveX, 
            tblInsurance.DefPremReserve, 
            tblInsurance.ExcessCashValue, 
            tblInsurance.ExcessCashValueX, 
            tblInsurance.STAT2_PUA_RES, 
            tblInsurance.STAT2_OYT_RES, 
            tblInsurance.StatOYTRes2X, 
            qryPolyCalcParameters.[Calc Parameters Code], 
            qryPolyCalcParameters.[Low Issue Date], 
            qryPolyCalcParameters.[Interest Rate Code]
        FROM tblInsurance 
        INNER JOIN qryPolyLifeMasterPlans 
            ON tblInsurance.LM_PLAN_CODE = 
                qryPolyLifeMasterPlans.[LifeMaster Plan Code] 
        INNER JOIN qryPolyNonforfeitureValues 
            ON qryPolyLifeMasterPlans.[Nonforfeiture Value Code] = 
                qryPolyNonforfeitureValues.[Nonforfeiture Value Code] 
        INNER JOIN qryPolyCalcParameters 
            ON qryPolyNonforfeitureValues.[(Cash Value) Calc Parameters Code] = 
                qryPolyCalcParameters.[Calc Parameters Code]
        WHERE 
            qryPolyCalcParameters.[Low Issue Date]<[ISSUE_DATE] 
            AND tblInsurance.COMPANY_CODE='NL' 
            AND tblInsurance.LINE_OF_BUSINESS='IT' 
            AND tblInsurance.SchedNP='PAR'
            AND tblInsurance.TERM_REASON='A' 
            AND tblInsurance.ProdType='PERM' 
            AND tblInsurance.PHASE_CODE=0 
            AND tblInsurance.SUB_PHASE_CODE=1 
        ) qry_tempCashValue
    GROUP BY 
        qry_tempCashValue.POLICY_NO, 
        qry_tempCashValue.IssueYear, 
        qry_tempCashValue.ISSUE_DATE, 
        qry_tempCashValue.LM_PLAN_CODE, 
        qry_tempCashValue.AMOUNT_INFORCE, 
        qry_tempCashValue.StatReserve, 
        qry_tempCashValue.StatReserveX, 
        qry_tempCashValue.DefPremReserve, 
        qry_tempCashValue.ExcessCashValue, 
        qry_tempCashValue.ExcessCashValueX, 
        qry_tempCashValue.STAT2_PUA_RES, 
        qry_tempCashValue.STAT2_OYT_RES, 
        qry_tempCashValue.StatOYTRes2X, 
        qry_tempCashValue.[Calc Parameters Code], 
        qry_tempCashValue.[Interest Rate Code]
    ) qry_tempCashValue2
GROUP BY 
    qry_tempCashValue2.IssueYear, 
    qry_tempCashValue2.LM_PLAN_CODE, 
    qry_tempCashValue2.[Interest Rate Code];

GO
4

3 回答 3

2

我认为您应该清理查询,而不是专注于添加索引。我不知道你为什么要嵌套这个,而不是一次进行分组和全选。

    SELECT 
        tblInsurance.POLICY_NO, 
        tblInsurance.IssueYear, 
        tblInsurance.ISSUE_DATE, 
        tblInsurance.LM_PLAN_CODE, 
        tblInsurance.AMOUNT_INFORCE, 
        tblInsurance.StatReserve, 
        tblInsurance.StatReserveX, 
        tblInsurance.DefPremReserve, 
        tblInsurance.ExcessCashValue, 
        tblInsurance.ExcessCashValueX, 
        tblInsurance.STAT2_PUA_RES, 
        tblInsurance.STAT2_OYT_RES, 
        tblInsurance.StatOYTRes2X, 
        qryPolyCalcParameters.[Calc Parameters Code], 
        max(qryPolyCalcParameters.[Low Issue Date]) AS [MaxOfLow Issue Date], 
        qryPolyCalcParameters.[Interest Rate Code]
    FROM tblInsurance 
    INNER JOIN qryPolyLifeMasterPlans 
        ON tblInsurance.LM_PLAN_CODE = 
            qryPolyLifeMasterPlans.[LifeMaster Plan Code] 
    INNER JOIN qryPolyNonforfeitureValues 
        ON qryPolyLifeMasterPlans.[Nonforfeiture Value Code] = 
            qryPolyNonforfeitureValues.[Nonforfeiture Value Code] 
    INNER JOIN qryPolyCalcParameters 
        ON qryPolyNonforfeitureValues.[(Cash Value) Calc Parameters Code] = 
            qryPolyCalcParameters.[Calc Parameters Code]
    WHERE 
        qryPolyCalcParameters.[Low Issue Date]<[ISSUE_DATE] 
        AND tblInsurance.COMPANY_CODE='NL' 
        AND tblInsurance.LINE_OF_BUSINESS='IT' 
        AND tblInsurance.SchedNP='PAR'
        AND tblInsurance.TERM_REASON='A' 
        AND tblInsurance.ProdType='PERM' 
        AND tblInsurance.PHASE_CODE=0 
        AND tblInsurance.SUB_PHASE_CODE=1 
GROUP BY 
    tblInsurance.POLICY_NO, 
    tblInsurance.IssueYear, 
    tblInsurance.ISSUE_DATE, 
    tblInsurance.LM_PLAN_CODE, 
    tblInsurance.AMOUNT_INFORCE, 
    tblInsurance.StatReserve, 
    tblInsurance.StatReserveX, 
    tblInsurance.DefPremReserve, 
    tblInsurance.ExcessCashValue, 
    tblInsurance.ExcessCashValueX, 
    tblInsurance.STAT2_PUA_RES, 
    tblInsurance.STAT2_OYT_RES, 
    tblInsurance.StatOYTRes2X, 
    qryPolyCalcParameters.[Calc Parameters Code], 
    qryPolyCalcParameters.[Interest Rate Code]

那应该有帮助。然后我们可以看到摆脱其他嵌套。是你的子选择正在扼杀你的表现。

于 2013-05-22T16:12:26.183 回答
0

我认为您可以将查询变成这样:

SELECT 
    qry_tempCashValue.IssueYear, 
    qry_tempCashValue.LM_PLAN_CODE, 
    Count(distinct qry_tempCashValue.POLICY_NO) AS CountOfPOLICY_NO, 
    qry_tempCashValue.[Interest Rate Code]
FROM
(
        SELECT 
            tblInsurance.POLICY_NO, 
            tblInsurance.IssueYear, 
            tblInsurance.ISSUE_DATE, 
            tblInsurance.LM_PLAN_CODE, 
            tblInsurance.AMOUNT_INFORCE, 
            tblInsurance.StatReserve, 
            tblInsurance.StatReserveX, 
            tblInsurance.DefPremReserve, 
            tblInsurance.ExcessCashValue, 
            tblInsurance.ExcessCashValueX, 
            tblInsurance.STAT2_PUA_RES, 
            tblInsurance.STAT2_OYT_RES, 
            tblInsurance.StatOYTRes2X, 
            qryPolyCalcParameters.[Calc Parameters Code], 
            qryPolyCalcParameters.[Low Issue Date], 
            qryPolyCalcParameters.[Interest Rate Code]
        FROM tblInsurance 
        INNER JOIN qryPolyLifeMasterPlans 
            ON tblInsurance.LM_PLAN_CODE = 
                qryPolyLifeMasterPlans.[LifeMaster Plan Code] 
        INNER JOIN qryPolyNonforfeitureValues 
            ON qryPolyLifeMasterPlans.[Nonforfeiture Value Code] = 
                qryPolyNonforfeitureValues.[Nonforfeiture Value Code] 
        INNER JOIN qryPolyCalcParameters 
            ON qryPolyNonforfeitureValues.[(Cash Value) Calc Parameters Code] = 
                qryPolyCalcParameters.[Calc Parameters Code]
        WHERE 
            qryPolyCalcParameters.[Low Issue Date]<[ISSUE_DATE] 
            AND tblInsurance.COMPANY_CODE='NL' 
            AND tblInsurance.LINE_OF_BUSINESS='IT' 
            AND tblInsurance.SchedNP='PAR'
            AND tblInsurance.TERM_REASON='A' 
            AND tblInsurance.ProdType='PERM' 
            AND tblInsurance.PHASE_CODE=0 
            AND tblInsurance.SUB_PHASE_CODE=1 
        ) qry_tempCashValue
GROUP BY 
    qry_tempCashValue.IssueYear, 
    qry_tempCashValue.LM_PLAN_CODE, 
    qry_tempCashValue.[Interest Rate Code];

这消除了内部聚合并使用count(distinct). 根据您的数据,这可能不会返回相同的结果。

至于索引,一个好的起点是在连接中使用的每个表的键上都有一个索引。另一个在where子句中的所有列上tblInsrance都使用=.

于 2013-05-22T16:57:20.083 回答
0

这是整个查询的简化。

SELECT 
    qry_tempCashValue2.IssueYear, 
    qry_tempCashValue2.LM_PLAN_CODE, 
    Count(qry_tempCashValue2.POLICY_NO) AS CountOfPOLICY_NO, 
    qry_tempCashValue2.[Interest Rate Code]
FROM
(
    SELECT distinct
        tblInsurance.POLICY_NO, 
        tblInsurance.IssueYear, 
        tblInsurance.ISSUE_DATE, 
        tblInsurance.LM_PLAN_CODE, 
        tblInsurance.AMOUNT_INFORCE, 
        tblInsurance.StatReserve, 
        tblInsurance.StatReserveX, 
        tblInsurance.DefPremReserve, 
        tblInsurance.ExcessCashValue, 
        tblInsurance.ExcessCashValueX, 
        tblInsurance.STAT2_PUA_RES, 
        tblInsurance.STAT2_OYT_RES, 
        tblInsurance.StatOYTRes2X, 
        qryPolyCalcParameters.[Calc Parameters Code], 
        qryPolyCalcParameters.[Interest Rate Code]
        FROM tblInsurance 
        INNER JOIN qryPolyLifeMasterPlans 
            ON tblInsurance.LM_PLAN_CODE = 
                qryPolyLifeMasterPlans.[LifeMaster Plan Code] 
        INNER JOIN qryPolyNonforfeitureValues 
            ON qryPolyLifeMasterPlans.[Nonforfeiture Value Code] = 
                qryPolyNonforfeitureValues.[Nonforfeiture Value Code] 
        INNER JOIN qryPolyCalcParameters 
            ON qryPolyNonforfeitureValues.[(Cash Value) Calc Parameters Code] = 
                qryPolyCalcParameters.[Calc Parameters Code]
        WHERE 
            qryPolyCalcParameters.[Low Issue Date]<[ISSUE_DATE] 
            AND tblInsurance.COMPANY_CODE='NL' 
            AND tblInsurance.LINE_OF_BUSINESS='IT' 
            AND tblInsurance.SchedNP='PAR'
            AND tblInsurance.TERM_REASON='A' 
            AND tblInsurance.ProdType='PERM' 
            AND tblInsurance.PHASE_CODE=0 
            AND tblInsurance.SUB_PHASE_CODE=1 
    ) qry_tempCashValue2
GROUP BY 
    qry_tempCashValue2.IssueYear, 
    qry_tempCashValue2.LM_PLAN_CODE, 
    qry_tempCashValue2.[Interest Rate Code];

GO
于 2013-05-22T19:24:19.717 回答