优化SQL Server 2012查询

穆萨

我有一个查询,运行了12个小时。

该查询确实对5个表进行了左联接,并报告了一系列每月指标。这是查询:

SELECT DATEPART(YYYY,Referral_dt) AS RefYear, DATEPART(MM,Referral_dt) AS RefMonth, 
        CASE 
            WHEN CAST(Referral_dt as date) BETWEEN '1/1/2013' AND '4/14/2013' THEN 'Q1' 
            WHEN CAST(Referral_dt as date) BETWEEN '4/15/2013' AND '7/14/2013' THEN 'Q2'
            WHEN CAST(Referral_dt as date) BETWEEN '7/15/2013' AND '9/30/2013' THEN 'Q3' 
            WHEN CAST(Referral_dt as date) BETWEEN '10/1/2013' AND '12/31/2013' THEN 'Q4'
            WHEN CAST(Referral_dt as date) BETWEEN '1/1/2014' AND '4/14/2014' THEN 'Q1' 
            WHEN CAST(Referral_dt as date) BETWEEN '4/15/2014' AND '7/14/2014' THEN 'Q2'
            WHEN CAST(Referral_dt as date) BETWEEN '7/15/2014' AND '9/30/2014' THEN 'Q3' 
            WHEN CAST(Referral_dt as date) BETWEEN '10/1/2014' AND '12/31/2014' THEN 'Q4'
        ELSE 'X' END as RefQtr, 
        crm.salesstatuscode, crm.Referral_State, crm.lead_source, mp.mcc_desc, mp.mcc_industry, sr.manager_name, sr.payrollname, 
        sr.region as Sales_Region,sr.market as Sales_Market, sr.saleschannel as SalesChannel, Bk.SuperRegion_Name as Bank_SuperRegion, 
        Bk.Region_Name as Bank_Region ,Bk.Division_Name as Bank_Division,
        sum(case when crm.referral_state = 'Won' then 1 else 0 end) as referrals_won, sum(sv.projected_profit) as prj_profit,
        sum(case when mp.proposal_Date is null then 0 else 1 end) as proposals_created, sum(ac.signed_annual_volume) as total_signed_volume,  
        sum(case when ac.Acct_Act_Date is null then 0 else 1 end) as activated_accounts, COUNT(*)  as referral_count
        into moagg1
FROM kaiserver.dbKAI.dbo.Referrals_CRM CRM 
     LEFT JOIN (SELECT p.merchant_id, CAST(p.proposal_create_dt as date) as Proposal_Date, m.mcc_desc, m.mcc_industry 
                from kaiserver.[dbKAI].[dbo].[proposals] p 
                left join (SELECT mcc, mcc_desc, mcc_industry from kaiserver.[dbKAI].[dbo].[merchantcategorycode]) m
                 on p.mcc = m.mcc where datepart(yyyy,proposal_create_dt) in ('2013', '2014')) mp
      ON crm.merchant_id = mp.merchant_id
     LEFT JOIN (SELECT account_no, CAST(Account_Activate_dt as date) as Acct_Act_Date, signed_annual_volume, average_tkt
                from kaiserver.[dbKAI].[dbo].[Account]
                where current_ind=1 and datepart(yyyy,account_submit_dt) in ('2013', '2014')) ac
     ON crm.account_no = ac.account_no
     LEFT JOIN (SELECT e1.repid, e1.repcode, e1.payrollname, e1.salesmanager, e2.payrollname as manager_name,
            e1.region,e1.market, e1.saleschannel
             FROM   [fdserver].fdms.[dbo].[tbl_reps] e1 LEFT JOIN [fdserver].fdms.[dbo].[tbl_reps] e2 
                    ON e1.salesmanager = e2.repid
             WHERE e1.market not like ('%TEST%') and e1.payrollname is not null and e1.region is not null and e1.market is not null) SR 
     ON CRM.Sales_Rep_Cd = SR.Repcode
     LEFT JOIN (SELECT [AU_name], [AU_Code] ,[SuperRegion_Name], [Region_Name] ,[Division_Name],
                    [SubDivision_Name] ,[District_Name] ,[SubDistrict_Name]
             FROM kaiserver.[dbKAI].[dbo].[BankAU_Hierarchy]
             WHERE [Reporting_Interval_Id] = '201410') BK 
    ON CRM.referral_au = BK.AU_code
    LEFT JOIN (select merchantnumber, projected_profit from kaiserver.[dbKAI].[dbo].[SoldVolumeDetail]) sv
    ON crm.account_no = sv.merchantnumber
    WHERE DATEPART(YYYY, Referral_dt) in ('2013', '2014')
          AND (crm.salesstatuscode <> 'DUPL' or crm.salesstatuscode is null) 
          AND crm.lead_source not in ('Test Lead', 'Bank Lead Placeholder')
    group by DATEPART(YYYY,Referral_dt), DATEPART(MM,Referral_dt), crm.Referral_State, crm.salesstatuscode, crm.lead_source, mp.mcc_desc, 
    mp.mcc_industry, sr.manager_name, sr.payrollname, sr.region,sr.market, sr.saleschannel, Bk.SuperRegion_Name, Bk.Region_Name ,Bk.Division_Name,
    CASE 
        WHEN CAST(Referral_dt as date) BETWEEN '1/1/2013' AND '4/14/2013' THEN 'Q1' 
        WHEN CAST(Referral_dt as date) BETWEEN '4/15/2013' AND '7/14/2013' THEN 'Q2'
        WHEN CAST(Referral_dt as date) BETWEEN '7/15/2013' AND '9/30/2013' THEN 'Q3' 
        WHEN CAST(Referral_dt as date) BETWEEN '10/1/2013' AND '12/31/2013' THEN 'Q4'
        WHEN CAST(Referral_dt as date) BETWEEN '1/1/2014' AND '4/14/2014' THEN 'Q1' 
        WHEN CAST(Referral_dt as date) BETWEEN '4/15/2014' AND '7/14/2014' THEN 'Q2'
        WHEN CAST(Referral_dt as date) BETWEEN '7/15/2014' AND '9/30/2014' THEN 'Q3' 
        WHEN CAST(Referral_dt as date) BETWEEN '10/1/2014' AND '12/31/2014' THEN 'Q4'
    ELSE 'X' END

当我如上所述运行完整查询时,它将运行12个小时。但是当我运行查询1个月时,它在8分钟内运行。因此,我想每个月运行一次查询并将其追加到一个文件中。这将使此查询在2-3小时内运行。

我可以使用union和复制代码24次,但这似乎并不是最好的方法。有没有更多的编程方式可以做到这一点?

更新:我希望能够每天运行此查询以更新最近一个月的数字。

哥们

从您发布的执行计划的外观来看,我认为您缺少联接谓词,并且正在生成大量中间行:

查询计划

这是相同的查询,需要进行一些清理(用CTE代替相关的子查询,并用DATEPART(QUARTER)替换CASE语句),这可能使判断断言在哪里更容易:

WITH
m as (SELECT mcc, mcc_desc, mcc_industry from kaiserver.[dbKAI].[dbo].[merchantcategorycode]),
mp as (SELECT p.merchant_id, CAST(p.proposal_create_dt as date) as Proposal_Date, m.mcc_desc, m.mcc_industry 
    from kaiserver.[dbKAI].[dbo].[proposals] p 
    left join m on p.mcc = m.mcc where datepart(yyyy,proposal_create_dt) in ('2013', '2014')),
ac as (SELECT account_no, CAST(Account_Activate_dt as date) as Acct_Act_Date, signed_annual_volume, average_tkt
    from kaiserver.[dbKAI].[dbo].[Account]
    where current_ind=1 and datepart(yyyy,account_submit_dt) in ('2013', '2014')),
sr as (SELECT e1.repid, e1.repcode, e1.payrollname, e1.salesmanager, e2.payrollname as manager_name, e1.region,e1.market, e1.saleschannel
    FROM [fdserver].fdms.[dbo].[tbl_reps] e1
    LEFT JOIN [fdserver].fdms.[dbo].[tbl_reps] e2 ON e1.salesmanager = e2.repid
    WHERE e1.market not like ('%TEST%') and e1.payrollname is not null and e1.region is not null and e1.market is not null),
bk as (SELECT [AU_name], [AU_Code], [SuperRegion_Name], [Region_Name] ,[Division_Name], [SubDivision_Name], [District_Name], [SubDistrict_Name]
    FROM kaiserver.[dbKAI].[dbo].[BankAU_Hierarchy]
    WHERE [Reporting_Interval_Id] = '201410'),
sv as (select merchantnumber, projected_profit from kaiserver.[dbKAI].[dbo].[SoldVolumeDetail])

SELECT DATEPART(YYYY,Referral_dt) AS RefYear, DATEPART(MM,Referral_dt) AS RefMonth, DATEPART(QUARTER, Referral_dt) as RefQtr,
    crm.salesstatuscode, crm.Referral_State, crm.lead_source, mp.mcc_desc, mp.mcc_industry, sr.manager_name, sr.payrollname,
    sr.region as Sales_Region,sr.market as Sales_Market, sr.saleschannel as SalesChannel, Bk.SuperRegion_Name as Bank_SuperRegion,
    Bk.Region_Name as Bank_Region ,Bk.Division_Name as Bank_Division,
    sum(case when crm.referral_state = 'Won' then 1 else 0 end) as referrals_won, sum(sv.projected_profit) as prj_profit,
    sum(case when mp.proposal_Date is null then 0 else 1 end) as proposals_created, sum(ac.signed_annual_volume) as total_signed_volume,  
    sum(case when ac.Acct_Act_Date is null then 0 else 1 end) as activated_accounts, COUNT(*) as referral_count INTO moagg1
FROM kaiserver.dbKAI.dbo.Referrals_CRM CRM
LEFT JOIN mp ON crm.merchant_id = mp.merchant_id
LEFT JOIN ac ON crm.account_no = ac.account_no
LEFT JOIN sr ON crm.sales_rep_cd = sr.repcode
LEFT JOIN bk ON crm.referral_au = ck.au_code
LEFT JOIN sv ON crm.account_no = sv.merchantnumber

WHERE DATEPART(YYYY, Referral_dt) in ('2013', '2014')
    AND (crm.salesstatuscode <> 'DUPL' or crm.salesstatuscode is null) 
    AND crm.lead_source not in ('Test Lead', 'Bank Lead Placeholder')

group by DATEPART(YYYY,Referral_dt), DATEPART(MM,Referral_dt), crm.Referral_State, crm.salesstatuscode, crm.lead_source, mp.mcc_desc, 
    mp.mcc_industry, sr.manager_name, sr.payrollname, sr.region,sr.market, sr.saleschannel, Bk.SuperRegion_Name, Bk.Region_Name ,Bk.Division_Name,
    DATEPART(QUARTER, Referral_dt)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

优化SQL Server 2012查询

来自分类Dev

SQL Server 2012查询

来自分类Dev

SQL Server 2012查询混乱

来自分类Dev

SQL Server 2012 LIMITING查询

来自分类Dev

SQL Server 2012查询混乱

来自分类Dev

SQL Server 2012查询/作业

来自分类Dev

优化SQL Server聚合查询

来自分类Dev

SQL Server中的查询优化

来自分类Dev

SQL Server 排名查询优化

来自分类Dev

优化我的 SQL Server 查询

来自分类Dev

SQL Server 2012的文本框优化

来自分类Dev

相关嵌套查询的查询优化(SQL Server)

来自分类Dev

在我使用 SQL Server 2012 的情况下进行查询优化的可能性

来自分类Dev

SQL查询调整-MS SQL Server -2012

来自分类Dev

搜索查询动态与静态-SQL Server 2012

来自分类Dev

在SQL Server 2012列中查询JSON

来自分类Dev

SQL Server 2012中的复杂子查询

来自分类Dev

在SQL Server 2012查询中使用日期

来自分类Dev

查询“ ALL IN”之类的。SQL Server 2012

来自分类Dev

SQL Server 2012查询XML列

来自分类Dev

优化程序的SQL Server查询格式

来自分类Dev

如何优化SQL Server查询的where子句

来自分类Dev

SQL Server 外应用查询优化

来自分类Dev

如何通过索引优化SQL Server 2012中的视图性能

来自分类Dev

如何使SQL语句(查询)在SQL Server 2012中预编译

来自分类Dev

SQL查询在结果上添加行-SQL Server 2012

来自分类Dev

联接表中子查询中的SQL Server 2012最大日期

来自分类Dev

SQL Server 2012分页和子查询

来自分类Dev

为什么此查询的SQL Server 2012比MongoDB快