Sql语句执行需要很长时间

时间:2015-01-30 00:26:30

标签: sql-server tsql

我有一个sql语句已运行超过6个月,最近它开始花费过高的时间来执行。

DMIRecord包含15,950行,InHouse_CSV_Backup包含149,226行。我在各自的表上设置了MERSMinMERSNUMBER的索引,并重建了现有的索引,但它没有帮助。

我有另一个查询做同样的事情,但DMIRecord是一个名为'MERSRecord'的不同源表,包含28,841行,运行正常。此查询在1秒内​​运行并返回2,048行

任何人都可以给我一些解决问题的方法。我上次运行以下查询时需要1小时48分钟才能返回15,435行。

我知道加入并不理想,但这是我们必须要合作的。没有其他任何东西可以将这些连接到外部导入的数据源。

SELECT m.*
FROM    [MERSReconciliation].[DMIRecord] m
        LEFT JOIN [dbo].[InHouse_CSV_Backup] b ON CAST(LTRIM(RTRIM(m.[MERSMin])) AS VARCHAR(31)) = REPLACE(LTRIM(RTRIM(b.[MERSNUMBER)),
                                                              '-', '')
WHERE ( ( m.[Resolved] IS NULL
            OR m.[Resolved] = 0
          )
          AND ( m.[Ignore Always] IS NULL
                OR m.[Ignore Always] = 0
              )
          AND ( m.[Ignore] IS NULL
                OR m.[Ignore] = 0
              )
          AND ( m.[Processed] IS NULL
                OR m.[Processed] = 0
              )
        )
        AND b.[MERSNUMBER] IS NULL

加入DMIRecord的示例数据

100113800001196174
100113800001155030
100113800001204309

加入InHouse_CSV_Backup的示例数据

1001138-0000008482-7
NULL
1001138-0000008479-3

以下是Bad和Good的执行计划

坏:DMIRecords enter image description here

好:MERSRecord enter image description here

我在查询中添加了*以简化发布语句。所有需要的列都在实际声明中定义。

USE [ExtraNet]
GO

/****** Object:  Table [MERSReconciliation].[DMIRecord]    Script Date: 1/29/2015 5:01:35 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [MERSReconciliation].[DMIRecord](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ClientNo] [varchar](300) NULL,
    [DetailRecordCtlNo] [varchar](300) NULL,
    [ReportingEntityNo] [varchar](300) NULL,
    [OrganizationName] [varchar](300) NULL,
    [MERSOrgId] [varchar](300) NULL,
    [LienPriorityCode] [varchar](300) NULL,
    [RealEstateSecurityCode] [varchar](300) NULL,
    [FHACaseNo] [varchar](300) NULL,
    [InvestLoanNo] [varchar](300) NULL,
    [MERSMin] [varchar](300) NULL,
    [LoanDate] [varchar](300) NULL,
    [OrigMtgAmt] [varchar](300) NULL,
    [EntityTypeQual] [varchar](300) NULL,
    [NameTypeCode] [varchar](300) NULL,
    [MtgrSSNo] [varchar](300) NULL,
    [MtgrLastName] [varchar](300) NULL,
    [MtgrFirstName] [varchar](300) NULL,
    [MtgrMiddleName] [varchar](300) NULL,
    [CoEntityTypeQual1] [varchar](300) NULL,
    [CoNameTypeCode1] [varchar](300) NULL,
    [CoMtgrSSNo1] [varchar](300) NULL,
    [CoborrowerLastName1] [varchar](300) NULL,
    [CoborrowerFirstName1] [varchar](300) NULL,
    [CoborrowerMiddleName1] [varchar](300) NULL,
    [CoEntityTypeQual2] [varchar](300) NULL,
    [CoNameTypeCode2] [varchar](300) NULL,
    [CoMtgrSSNo2] [varchar](300) NULL,
    [CoborrowerLastName2] [varchar](300) NULL,
    [CoborrowerFirstName2] [varchar](300) NULL,
    [CoborrowerMiddleName2] [varchar](300) NULL,
    [CoEntityTypeQual3] [varchar](300) NULL,
    [CoNameTypeCode3] [varchar](300) NULL,
    [CoMtgrSSNo3] [varchar](300) NULL,
    [CoborrowerLastName3] [varchar](300) NULL,
    [CoborrowerFirstName3] [varchar](300) NULL,
    [CoborrowerMiddleName3] [varchar](300) NULL,
    [CoEntityTypeQual4] [varchar](300) NULL,
    [CoNameTypeCode4] [varchar](300) NULL,
    [CoMtgrSSNo4] [varchar](300) NULL,
    [CoborrowerLastName4] [varchar](300) NULL,
    [CoborrowerFirstName4] [varchar](300) NULL,
    [CoborrowerMiddleName4] [varchar](300) NULL,
    [CoEntityTypeQual5] [varchar](300) NULL,
    [CoNameTypeCode5] [varchar](300) NULL,
    [CoMtgrSSNo5] [varchar](300) NULL,
    [CoborrowerLastName5] [varchar](300) NULL,
    [CoborrowerFirstName5] [varchar](300) NULL,
    [CoborrowerMiddleName5] [varchar](300) NULL,
    [CoEntityTypeQual6] [varchar](300) NULL,
    [CoNameTypeCode6] [varchar](300) NULL,
    [CoMtgrSSNo6] [varchar](300) NULL,
    [CoborrowerLastName6] [varchar](300) NULL,
    [CoborrowerFirstName6] [varchar](300) NULL,
    [CoborrowerMiddleName6] [varchar](300) NULL,
    [CoEntityTypeQual7] [varchar](300) NULL,
    [CoNameTypeCode7] [varchar](300) NULL,
    [CoMtgrSSNo7] [varchar](300) NULL,
    [CoborrowerLastName7] [varchar](300) NULL,
    [CoborrowerFirstName7] [varchar](300) NULL,
    [CoborrowerMiddleName7] [varchar](300) NULL,
    [CoEntityTypeQual8] [varchar](300) NULL,
    [CoNameTypeCode8] [varchar](300) NULL,
    [CoMtgrSSNo8] [varchar](300) NULL,
    [CoborrowerLastName8] [varchar](300) NULL,
    [CoborrowerFirstName8] [varchar](300) NULL,
    [CoborrowerMiddleName8] [varchar](300) NULL,
    [CoEntityTypeQual9] [varchar](300) NULL,
    [CoNameTypeCode9] [varchar](300) NULL,
    [CoMtgrSSNo9] [varchar](300) NULL,
    [CoborrowerLastName9] [varchar](300) NULL,
    [CoborrowerFirstName9] [varchar](300) NULL,
    [CoborrowerMiddleName9] [varchar](300) NULL,
    [CoEntityTypeQual10] [varchar](300) NULL,
    [CoNameTypeCode10] [varchar](300) NULL,
    [CoMtgrSSNo10] [varchar](300) NULL,
    [CoborrowerLastName10] [varchar](300) NULL,
    [CoborrowerFirstName10] [varchar](300) NULL,
    [CoborrowerMiddleName10] [varchar](300) NULL,
    [NuStreetNo] [varchar](300) NULL,
    [NuStreetName] [varchar](300) NULL,
    [NuStreetDir] [varchar](300) NULL,
    [NuCityName] [varchar](300) NULL,
    [NuStateAbbr] [varchar](300) NULL,
    [NuPropZip] [varchar](300) NULL,
    [NuPropSuffix] [varchar](300) NULL,
    [NuPropUnitNo] [varchar](300) NULL,
    [County] [varchar](300) NULL,
    [MERsMOMflag] [varchar](300) NULL,
    [PoolNo] [varchar](300) NULL,
    [MERsFundingDate] [varchar](300) NULL,
    [MERsOrigOrgId] [varchar](300) NULL,
    [OrigNoteHldNm] [varchar](300) NULL,
    [MinStatCd] [varchar](300) NULL,
    [MERsPropertyPresOrgId] [varchar](300) NULL,
    [InvMERsOrgId] [varchar](300) NULL,
    [SecuritizationName] [varchar](300) NULL,
    [PropertyUnitType] [varchar](300) NULL,
    [DateAssignFrMERs] [varchar](300) NULL,
    [MERsStatusReasonCode] [varchar](300) NULL,
    [OccupancyStatus] [varchar](300) NULL,
    [AgencyNbr] [varchar](300) NULL,
    [SubservicingMERsOrgId] [varchar](300) NULL,
    [Assignee] [varchar](300) NULL,
    [AssigneeAddressInfo] [varchar](300) NULL,
    [AssigneeCity] [varchar](300) NULL,
    [AssigneeState] [varchar](300) NULL,
    [AssigneeZipCode] [varchar](300) NULL,
    [Assignor] [varchar](300) NULL,
    [Resolved] [bit] NULL,
    [Ignore Always] [bit] NULL,
    [Ignore] [bit] NULL,
    [Processed] [bit] NULL,
    [ImportedDate] [datetime] NULL,
    [ImportedBy] [varchar](50) NULL,
    [UpdatedDate] [datetime] NULL,
    [UpdatedBy] [varchar](50) NULL,
    [F2FResolved] [bit] NULL,
    [F2FIgnore Always] [bit] NULL,
    [F2FIgnore] [bit] NULL,
    [F2FProcessed] [bit] NULL,
    [Comment] [varchar](max) NULL,
    [F2FComment] [varchar](max) NULL,
 CONSTRAINT [PK_DMIRecord] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

USE [ExtraNet]
GO

    /****** Object:  Table [dbo].[InHouse_CSV_Backup]    Script Date: 1/29/2015 5:01:11 PM ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    SET ANSI_PADDING ON
    GO

    CREATE TABLE [dbo].[InHouse_CSV_Backup](
        [Loan_ID] [int] IDENTITY(1,1) NOT NULL,
        [LOANNUMBER] [float] NULL,
        [LOANNUMBE1] [float] NULL,
        [MERSNUMBER] [nvarchar](31) NULL,
        [LEADID] [float] NULL,
        [CALCDATELE] [datetime] NULL,
        [PBFIRSTNAM] [nvarchar](26) NULL,
        [PBLASTNAME] [nvarchar](36) NULL,
        [PBSOCIALSE] [nvarchar](51) NULL,
        [PCFIRSTNAM] [nvarchar](26) NULL,
        [PCLASTNAME] [nvarchar](36) NULL,
        [PBVOICE] [nvarchar](13) NULL,
        [PBWORKNUMB] [nvarchar](13) NULL,
        [LOANSTATUS] [nvarchar](21) NULL,
        [StatusDate] [nvarchar](50) NULL,
        [StatusDays] [float] NULL,
        [PBCREDITSC] [float] NULL,
        [PCCREDITSC] [float] NULL,
        [BDETOTAL11] [float] NULL,
        [BDETOTAL21] [float] NULL,
        [BDETOTAL10] [float] NULL,
        [LTV] [float] NULL,
        [COMBINEDLT] [float] NULL,
        [HOUSINGRAT] [float] NULL,
        [DEBTRATIO] [float] NULL,
        [PBAGE] [float] NULL,
        [PCAGE] [float] NULL,
        [BDEYEARSAT] [float] NULL,
        [BDEYEARSA1] [float] NULL,
        [INVESTOR] [nvarchar](51) NULL,
        [PRODUCTCOD] [nvarchar](21) NULL,
        [PROGRAMNAM] [nvarchar](51) NULL,
        [PROGRAMCAT] [nvarchar](16) NULL,
        [LOANPURPOS] [nvarchar](26) NULL,
        [DOCUMENTAT] [nvarchar](21) NULL,
        [SPPURPOSEO] [nvarchar](51) NULL,
        [LIENPOSITI] [nvarchar](16) NULL,
        [FUNDINGTYP] [nvarchar](16) NULL,
        [SPOCCUPANC] [nvarchar](26) NULL,
        [LOANTYPE] [nvarchar](16) NULL,
        [SPPROPERTY] [nvarchar](26) NULL,
        [RATE] [float] NULL,
        [LOANTERM] [float] NULL,
        [LOANAMOUNT] [float] NULL,
        [LBRANCHNUM] [nvarchar](11) NULL,
        [LOEMPLOYEE] [nvarchar](16) NULL,
        [LOFIRSTNAM] [nvarchar](26) NULL,
        [LOLASTNAME] [nvarchar](36) NULL,
        [LPFIRSTNAM] [nvarchar](26) NULL,
        [LPLASTNAME] [nvarchar](36) NULL,
        [LUFIRSTNAM] [nvarchar](26) NULL,
        [LULASTNAME] [nvarchar](36) NULL,
        [LEADSOURCE] [nvarchar](31) NULL,
        [REFERRALSO] [nvarchar](51) NULL,
        [BROKERCOMP] [float] NULL,
        [BRCOMPANYN] [nvarchar](51) NULL,
        [SELLERREAL] [float] NULL,
        [SACOMPANYN] [nvarchar](51) NULL,
        [SellerAgenPhone] [nvarchar](50) NULL,
        [SABRANCHNA] [nvarchar](26) NULL,
        [SAFIRSTNAM] [nvarchar](26) NULL,
        [SALASTNAME] [nvarchar](36) NULL,
        [ADDRESS] [nvarchar](36) NULL,
        [SPCITY] [nvarchar](26) NULL,
        [SPSTATE] [nvarchar](3) NULL,
        [SPZIP] [nvarchar](11) NULL,
        [SPCOUNTY] [nvarchar](21) NULL,
        [PBPAADDRES] [nvarchar](36) NULL,
        [PBPACITY] [nvarchar](26) NULL,
        [PBPASTATE] [nvarchar](3) NULL,
        [PBPAZIP] [nvarchar](11) NULL,
        [CALCDATEPR] [datetime] NULL,
        [CALCDATENO] [datetime] NULL,
        [CALCDATEON] [datetime] NULL,
        [CALCDATEP1] [datetime] NULL,
        [CALCDATEAP] [datetime] NULL,
        [CALCDATEP2] [datetime] NULL,
        [CALCDATESU] [datetime] NULL,
        [CALCDATEA1] [datetime] NULL,
        [CALCDATEA2] [datetime] NULL,
        [CALCDATEA3] [datetime] NULL,
        [CLoanFunded] [datetime] NULL,
        [AppraisalReceived] [datetime] NULL,
        [CALCDATEES] [datetime] NULL,
        [SHIPPED] [datetime] NULL,
        [FIRSTPAYME] [datetime] NULL,
        [LOCKDATE] [datetime] NULL,
        [LOCKEXPIRE] [datetime] NULL,
        [CALCDATEDO] [datetime] NULL,
        [CALCDATED1] [datetime] NULL,
        [CALCDATED2] [datetime] NULL,
        [CALCDATEIN] [datetime] NULL,
        [CALCDATEFU] [datetime] NULL,
        [CLOSEDATE] [datetime] NULL,
        [CANCELDATE] [datetime] NULL,
        [CALCDATERE] [datetime] NULL,
        [CALCDATEI1] [datetime] NULL,
        [MONTHLYLOA] [float] NULL,
        [TOTALMONTH] [float] NULL,
        [ProductID] [float] NULL,
        [CPI] [char](10) NULL,
        [BrokeredOut] [datetime] NULL,
        [Commitment] [varchar](25) NULL,
        [Pool] [varchar](25) NULL,
        [Points801] [float] NULL,
        [Points802] [float] NULL,
        [ConfirmedPrice] [float] NULL,
        [InvPrice] [float] NULL,
        [InvLockDate] [datetime] NULL,
        [Units] [float] NULL,
        [InvID] [float] NULL,
        [Committed_Product] [varchar](50) NULL,
        [FloodZone] [char](10) NULL,
        [ModBack] [datetime] NULL,
        [CommSplitID] [char](10) NULL,
        [CommissionSplit] [varchar](50) NULL,
        [PropertyClass] [varchar](25) NULL,
        [PUDType] [varchar](50) NULL,
        [InvBase] [float] NULL,
        [LockConfBase] [float] NULL,
        [DeedReceivedDate] [datetime] NULL,
        [TitleReceivedDate] [datetime] NULL,
        [InvestorClearedDate] [datetime] NULL,
        [InvestorDeniedDate] [datetime] NULL,
        [InvestorSuspendedDate] [datetime] NULL,
        [FHACaseNum] [varchar](50) NULL,
        [DeniedDate] [datetime] NULL,
        [LockCancelled] [datetime] NULL,
        [UWRecievedDate] [datetime] NULL,
        [UWSuspended] [datetime] NULL,
        [ForwardCancelled] [datetime] NULL,
        [LeadB2B] [datetime] NULL,
        [ServicingBegin] [datetime] NULL,
        [ServicingEnd] [datetime] NULL,
        [MICertNum] [varchar](50) NULL,
        [WareHouseLine] [varchar](50) NULL,
        [FirstCreditScoreDate] [datetime] NULL,
        [DuplicateFlag] [varchar](50) NULL,
        [MinCreditScore] [nchar](10) NULL,
        [NMLS_ID] [nchar](10) NULL,
        [PQ_ApprovedDate] [datetime] NULL,
        [CompletedDate] [datetime] NULL,
        [PQ_DeniedDate] [datetime] NULL,
        [PQ_WithdrawnDate] [datetime] NULL,
        [LeadInactiveDate] [datetime] NULL,
        [LoanOriginatedDate] [datetime] NULL,
        [IncometeAppDate] [datetime] NULL,
        [HOEPAStatus] [nchar](10) NULL,
        [FinanceMethod] [varchar](50) NULL,
        [IOMonths] [nchar](10) NULL,
        [MI_Type] [varchar](50) NULL,
        [MI_Activated] [varchar](50) NULL,
        [MI_ExpireDate] [datetime] NULL,
        [Fee902] [money] NULL,
        [Fee1002] [money] NULL,
        [HOEPA] [nchar](10) NULL,
        [RequiredCreditScore] [nchar](10) NULL,
        [ApprovedWithdrawn] [datetime] NULL,
        [Withdrawn] [datetime] NULL,
        [BranchDenied] [datetime] NULL,
        [PQSubmitted] [datetime] NULL,
        [Prepay] [nchar](10) NULL,
        [CountyCD] [varchar](3) NULL,
        [StateCD] [varchar](2) NULL,
        [IsTestLoan] [bit] NULL,
        [ReqClose_Dt] [date] NULL,
        [LockReneg_Dt] [date] NULL,
        [PTD_Cond_Count] [int] NULL,
        [AdminFee] [varchar](3) NULL,
        [PricingTier] [varchar](12) NULL,
        [Borr_MidName] [nvarchar](36) NULL,
        [CoBorr2_FirstName] [nvarchar](26) NULL,
        [CoBorr2_MidName] [nvarchar](36) NULL,
        [CoBorr2_LastName] [nvarchar](36) NULL,
        [CoBorr2_SSN] [varchar](15) NULL,
        [CoBorr2_Address] [nvarchar](36) NULL,
        [CoBorr2_City] [nvarchar](26) NULL,
        [CoBorr2_State] [varchar](2) NULL,
        [CoBorr2_ZIP] [varchar](10) NULL,
        [CoBorr2_CredScore] [int] NULL,
        [CoBorr3_FirstName] [nvarchar](26) NULL,
        [CoBorr3_MidName] [nvarchar](36) NULL,
        [CoBorr3_LastName] [nvarchar](36) NULL,
        [CoBorr3_SSN] [varchar](15) NULL,
        [CoBorr3_Address] [nvarchar](36) NULL,
        [CoBorr3_City] [nvarchar](26) NULL,
        [CoBorr3_State] [varchar](2) NULL,
        [CoBorr3_ZIP] [varchar](10) NULL,
        [CoBorr3_CredScore] [int] NULL,
        [Created_Dt] [datetime] NULL CONSTRAINT [DF_InHouse_CSV_Backup_Created_Dt]  DEFAULT (getdate()),
        [LastUpdated_Dt] [datetime] NULL,
        [IntentProceed_Dt] [date] NULL,
        [ClearClose_Dt] [date] NULL,
        [SellerRealtor_ID] [int] NULL,
        [BuyerRealtor_ID] [int] NULL,
     CONSTRAINT [PK_InHouse_CSV_Backup] PRIMARY KEY NONCLUSTERED 
    (
        [Loan_ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF
    GO

我运行了调优顾问,并没有提出任何改进建议。

有趣的事情需要注意。我回到之前托管这些的原始SQL 2008服务器,两个语句都在3秒内执行。两个执行计划都是相同的。在SQL 2012 Server上,只有MERSRecord查询的执行计划是相同的。所有三个都匹配上面列出的那个。 SQL 2012服务器上只有DMIRecords不同。可能的错误?

2012年1月30日 更新显示我在dba.stackexchange.com上的问题的解决方案 将OPTION(HASH JOIN)添加到语句的末尾,强制进行散列连接。添加这个导致问题查询在1秒内​​执行并返回正确的结果集。

1 个答案:

答案 0 :(得分:4)

使用CTE清除数据。使用JOIN条件中的函数将阻止使用索引。

;WITH CteTableA AS(
    SELECT      
        TrimmedCol1 = CAST(LTRIM(RTRIM(m.[COL1])) AS VARCHAR(31)),
        Resolved = ISNULL(Resolved, 0),
        [Ignore Always] = ISNULL([Ignore Always], 0),
        Ignore = ISNULL(Ignore, 0),
        Processed = ISNULL(Processed, 0)        
    FROM TableA
)
,CteTableB AS(
    SELECT
        *,
        TrimmedCol3 = REPLACE(LTRIM(RTRIM(b.[COL3])),'-', '')
    FROM TableB
)
SELECT
    a.*
FROM CteTableA a
LEFT JOIN CteTableB b
    ON b.TrimmedCol3 = a.TrimmedCol1
WHERE
    a.Resolved = 0
    AND a.[Ignore Always] = 0
    AND a.Ignore = 0
    AND a.Processed = 0
    AND b.ACCOUNTNUMBER IS NULL

编辑:

尝试清理数据并将其插入临时表中。然后添加必要的索引。

CREATE TABLE #TempTableA(
    TrimmedCol1     VARCHAR(31),
    Resolved        BIT,
    [Ignore Always] BIT,
    Ignore          BIT,
    Processed       BIT
    -- Other columns you might need
)
CREATE TABLE #TempTableB(
    TrimmedCol3 VARCHAR(31),
    MERSNUMBER  NVARCHAR(31) NULL
    -- Other columns you might need
)
INSERT INTO #TempTableA
    SELECT      
        TrimmedCol1 = CAST(LTRIM(RTRIM(m.[COL1])) AS VARCHAR(31)),
        Resolved = ISNULL(Resolved, 0),
        [Ignore Always] = ISNULL([Ignore Always], 0),
        Ignore = ISNULL(Ignore, 0),
        Processed = ISNULL(Processed, 0)        
    FROM TableA

INSERT INTO #TempTableB
    SELECT
        TrimmedCol3 = REPLACE(LTRIM(RTRIM(b.[COL3])),'-', ''),
        MERSNUMBER
    FROM TableB

CREATE NONCLUSTERED INDEX #IX_TempTableA ON #TempTableA (TrimmedCol1)
CREATE NONCLUSTERED INDEX #IX_TempTableB ON #TempTableB (TrimmedCol3)

SELECT
    a.*
FROM #TempTableA a
LEFT JOIN #TempTableB b
    ON b.TrimmedCol3 = a.TrimmedCol1
WHERE
    a.Resolved = 0
    AND a.[Ignore Always] = 0
    AND a.Ignore = 0
    AND a.Processed = 0
    AND b.MERSNUMBER IS NULL