2013-12-16 39 views
1

我有一個功能,執行非常slow.I正在工作的數據庫,我需要遷移數據,我沒有控制權! 理想情況下,我想直接使用視圖,因爲這個函數被視圖調用,但我似乎只能通過調用一個函數來實現。加速我的查詢使用sql server 2008.交叉替代

=== 視圖應該返回無論是在dummytable通過orderNo.If的orderNo有「趣」比平衡paymenttype應該是興趣,如果「稅」應納稅

在現實生活中我將有20萬行和更多,通過使用交叉應用它似乎減慢了很多。

有沒有更好的方式來獲取數據而不是使用CrossApply?

諾迪這裏樣品(數據和數據類型都爲例子semplicity只是虛構的)

CREATE DATABASE DummyDB 
GO 

use DummyDB 
IF object_id(N'DummyTable', 'U') IS NOT NULL 
DROP TABLE DummyTable 
GO 
CREATE TABLE DummyTable 
(
Id int, 
OrderNo varchar(255), 
PaymentType varchar(255), 
Credit varchar(255), 
Debit varchar(255), 
Balance varchar(255) 
) 
GO 
INSERT INTO [dbo].[DummyTable]([Id], [OrderNo], [PaymentType], [Credit], [Debit], [Balance]) 
SELECT 1, N'200', N'Interest', N'10', N'5', N'5' UNION ALL 
SELECT 2, N'201', N'Deposit', N'400', N'30', N'370' UNION ALL 
SELECT 3, N'202', N'Tax', N'20', N'10', N'10' UNION ALL 
SELECT 4, N'202', N'Tax', N'50', N'10', N'10' 



--my sample attempt not performing 

    use DummyDB 
    select * from DummyTable 

    Declare @OrderNo int 
    set @OrderNo=202 

    SELECT 
    Tax=tx.Tax, 
    Interest=tx1.Interest, 
    Deposit=tx2.Deposit 
    FROM DummyTable T1 
    CROSS APPLY(SELECT 
       Tax=sum(cast(T2.Balance as money)) 
       FROM DummyTable T2 
       WHERE [email protected] 
       AND PaymentType='Tax')as tx   
    CROSS APPLY(select 
       Interest=sum(cast(T2.Balance as money)) 
       FROM DummyTable T2 
       WHERE [email protected] 
       AND PaymentType='Interest')as tx1   
    CROSS APPLY(select 
       Deposit=sum(cast(T2.Balance as money)) 
       FROM DummyTable T2 
       WHERE [email protected] 
       AND PaymentType='Deposit')as tx2 

    WHERE [email protected] 


    Any Suggestion of using something more efficient than cross apply? 

    Many thanks 

回答

1

這將做幾乎一樣的簡單的查詢。它將爲您提供一行結果,您的查詢將重複匹配@OrderNo的所有行的值。

select sum(case when T1.PaymentType = 'Tax' then cast(T1.Balance as money) else 0 end) as Tax, 
     sum(case when T1.PaymentType = 'Interest' then cast(T1.Balance as money) else 0 end) as Interest, 
     sum(case when T1.PaymentType = 'Deposit' then cast(T1.Balance as money) else 0 end) as Deposit 
from DummyTable as T1 
where T1.OrderNo = @OrderNo 

BTW,你應該確保在表中OrderNo數據類型是一樣的變量@OrderNo。看起來你正在處理整數,所以你應該改變表格。如果您無法做到這一點,那麼如果您想使用OrderNo上的索引,則需要將@OrderNo更改爲varchar(255)