2015-10-19 148 views
-3

我必须执行此查询这需要大约52秒我已经意味着使用游标或者无论如何,可以帮助我优化执行时间SQL查询优化

select * from (
select distinct 'Net Sales' Class, SUM (CAST(ROUND(ABS(dbo.Trial_Balance_Variances.PTD_ACTUAL), 0) AS float)) over (partition by CONVERT(int,CONVERT(varchar(10), dbo.Trial_Balance_Variances.PERIOD_DATE, 112))) 
- (select distinct sum(CAST(ROUND(ABS(v.PTD_ACTUAL), 0) AS float)) over (partition by CONVERT(int,CONVERT(varchar(10), v.PERIOD_DATE, 112))) from Trial_Balance_Variances v 
inner join 
dbo.[P&L] p ON v.GL_ACCOUNT_NUMBER = p.Code where p.Category in('Sales Rebates') 
and v.PERIOD_NAME = Trial_Balance_Variances.PERIOD_NAME 
    ) Total,CONVERT(int,CONVERT(varchar(10), dbo.Trial_Balance_Variances.PERIOD_DATE, 112)) AS DateKey 
from Trial_Balance_Variances 
inner join 
dbo.[P&L] ON dbo.Trial_Balance_Variances.GL_ACCOUNT_NUMBER = dbo.[P&L].Code LEFT OUTER JOIN 
dbo.Location AS l ON l.Code = SUBSTRING(CONVERT(varchar(50), dbo.Trial_Balance_Variances.ACCOUNT_COMBINATION), 4, 2) where Category = 'Potash Sales (Gross)' 

union 

SELECT distinct l.Class, SUM (CAST(ROUND(ABS(dbo.Trial_Balance_Variances.PTD_ACTUAL), 0) AS float)) over (partition by CONVERT(int,CONVERT(varchar(10), dbo.Trial_Balance_Variances.PERIOD_DATE, 112))) 
+ (select distinct sum(CAST(ROUND(ABS(v.PTD_ACTUAL), 0) AS float)) over (partition by CONVERT(int,CONVERT(varchar(10), v.PERIOD_DATE, 112))) from Trial_Balance_Variances v 
inner join 
dbo.[P&L] p ON v.GL_ACCOUNT_NUMBER = p.Code where p.Category in('Change In Inventory','Freight','Dispatch') 
and v.PERIOD_NAME = Trial_Balance_Variances.PERIOD_NAME 
    ) Total 
, CONVERT(int,CONVERT(varchar(10), dbo.Trial_Balance_Variances.PERIOD_DATE, 112)) AS DateKey from Trial_Balance_Variances 
inner join 
dbo.[P&L] ON dbo.Trial_Balance_Variances.GL_ACCOUNT_NUMBER = dbo.[P&L].Code LEFT OUTER JOIN 
dbo.Location AS l ON l.Code = SUBSTRING(CONVERT(varchar(50), dbo.Trial_Balance_Variances.ACCOUNT_COMBINATION), 4, 2) 
where Class='Cost of goods sold' and Category not in ('Sales Rebates','Royalties','Potash Sales (Gross)','Interest Expense LTL','Interest Expense LTMed','Interest Expense Others' 
,'Interest Income','(Gain)/Loss from Investment Jor','(Gain)/Loss from Investment N+B','Gain from Investment', 'EXC Gain from Investment' ,'D Gain from Investment ', 'Loss from Investment Jormag','Bank Charges','Other Revenues','Change In Inventory','Freight','Dispatch') 

union 

SELECT distinct l.Class, SUM (CAST(ROUND(ABS(dbo.Trial_Balance_Variances.PTD_ACTUAL), 0) AS float)) over (partition by CONVERT(int,CONVERT(varchar(10), dbo.Trial_Balance_Variances.PERIOD_DATE, 112))) Total 
, CONVERT(int,CONVERT(varchar(10), dbo.Trial_Balance_Variances.PERIOD_DATE, 112)) AS DateKey from Trial_Balance_Variances 
inner join 
dbo.[P&L] ON dbo.Trial_Balance_Variances.GL_ACCOUNT_NUMBER = dbo.[P&L].Code LEFT OUTER JOIN 
dbo.Location AS l ON l.Code = SUBSTRING(CONVERT(varchar(50), dbo.Trial_Balance_Variances.ACCOUNT_COMBINATION), 4, 2) 
where Class='Administration' and Category not in ('Sales Rebates','Royalties','Potash Sales (Gross)','Interest Expense LTL','Interest Expense LTMed','Interest Expense Others' 
,'Interest Income','(Gain)/Loss from Investment Jor','(Gain)/Loss from Investment N+B','Gain from Investment', 'EXC Gain from Investment' ,'D Gain from Investment ', 'Loss from Investment Jormag','Bank Charges','Change In Inventory','Freight','Dispatch','Other Revenues') 
union 

SELECT distinct l.Class, SUM (CAST(ROUND(ABS(dbo.Trial_Balance_Variances.PTD_ACTUAL), 0) AS float)) over (partition by CONVERT(int,CONVERT(varchar(10), dbo.Trial_Balance_Variances.PERIOD_DATE, 112))) Total 
, CONVERT(int,CONVERT(varchar(10), dbo.Trial_Balance_Variances.PERIOD_DATE, 112)) AS DateKey from Trial_Balance_Variances 
inner join 
dbo.[P&L] ON dbo.Trial_Balance_Variances.GL_ACCOUNT_NUMBER = dbo.[P&L].Code LEFT OUTER JOIN 
dbo.Location AS l ON l.Code = SUBSTRING(CONVERT(varchar(50), dbo.Trial_Balance_Variances.ACCOUNT_COMBINATION), 4, 2) 
where Class='Selling And Distribution Expenses' and Category not in ('Sales Rebates','Royalties','Potash Sales (Gross)','Interest Expense LTL','Interest Expense LTMed','Interest Expense Others' 
,'Interest Income','(Gain)/Loss from Investment Jor','(Gain)/Loss from Investment N+B','Gain from Investment', 'EXC Gain from Investment' ,'D Gain from Investment ', 'Loss from Investment Jormag','Bank Charges','Change In Inventory','Freight','Dispatch','Other Revenues') 

union 


SELECT distinct l.Class, SUM (CAST(ROUND(ABS(dbo.Trial_Balance_Variances.PTD_ACTUAL), 0) AS float)) over (partition by CONVERT(int,CONVERT(varchar(10), dbo.Trial_Balance_Variances.PERIOD_DATE, 112))) 
+ (select distinct sum(CAST(ROUND(ABS(v.PTD_ACTUAL), 0) AS float)) over (partition by CONVERT(int,CONVERT(varchar(10), v.PERIOD_DATE, 112))) from Trial_Balance_Variances v 
inner join 
    dbo.[P&L] p ON v.GL_ACCOUNT_NUMBER = p.Code where p.Category in('Interest Expense LTL','Interest Expense LTMed','Interest Expense Others' 
,'Interest Income','(Gain)/Loss from Investment Jor','(Gain)/Loss from Investment N+B','Gain from Investment', 'EXC Gain from Investment' ,'D Gain from Investment ', 'Loss from Investment Jormag','Bank Charges','Other Revenues') 
    and v.PERIOD_NAME = Trial_Balance_Variances.PERIOD_NAME and SUBSTRING(CONVERT(varchar(50), v.ACCOUNT_COMBINATION), 4, 2) not in ('00','05') 
    ) 
, CONVERT(int,CONVERT(varchar(10), dbo.Trial_Balance_Variances.PERIOD_DATE, 112)) AS DateKey from Trial_Balance_Variances 
inner join 
dbo.[P&L] ON dbo.Trial_Balance_Variances.GL_ACCOUNT_NUMBER = dbo.[P&L].Code LEFT OUTER JOIN 
dbo.Location AS l ON l.Code = SUBSTRING(CONVERT(varchar(50), dbo.Trial_Balance_Variances.ACCOUNT_COMBINATION), 4, 2) 
where Class='Others' and 
Category not in ('Sales Rebates','Royalties','Potash Sales (Gross)','Change In Inventory','Freight','Dispatch')) x order by x.DateKey 

谁能帮我解决这个问题请问?

+0

向此添加游标绝对不会提高性能 - 完全相反!避免游标,如果你可以..... –

+0

Distincts ...到处 – JamieD77

+0

那么我能做什么 –

回答

1

SUBSTRING()是一个标量函数,这意味着他们需要在他们被调用的每一行上运行。如果可以的话,可以省略它们或在减少记录集后运行它们。

我不相信你需要转换为int得到这个排序工作,你希望的方式在这个SQL:

CONVERT(int,CONVERT(varchar(10), dbo.Trial_Balance_Variances.PERIOD_DATE, 112)) 

删除convert(int,....)部分,看看会发生什么。

Distinct在效率上相当低效。我建议将它们全部更改为分组。为了解决这个问题,我建议把所有东西放到临时表中,然后做最后的选择,这样你只需要做一次。

如果你想要任何特定的东西,给我们一些a Fiddle测试数据将有所帮助!

+0

omg!这有助于疯狂。执行时间现在只有10秒.. thaks很多! –