使用sql server 2008加速我的查询。替代交叉申请

时间:2013-12-16 06:20:25

标签: sql-server sql-server-2008

我有一个执行速度非常慢的函数。我正在使用一个数据库,我需要迁移数据,我无法控制! 理想情况下,我想直接使用一个视图,因为这个函数是由一个视图调用的,但我似乎只能通过调用一个函数来实现它。

=== 一个视图应该按顺序返回虚拟表中的任何内容。如果一个订单没有付款类型“利息”,那么余额应该是利息,如果“税”应该是税收

在现实生活中,我将拥有200000行以上,通过使用交叉应用它似乎放慢了很多。

是否有更好的方法来获取数据而不是使用CrossApply?

这里的Noddy示例(数据和数据类型对于示例的简单性而言是虚构的)

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 T2.OrderNo=@OrderNo
               AND  PaymentType='Tax')as tx         
    CROSS APPLY(select 
               Interest=sum(cast(T2.Balance as money))
               FROM DummyTable T2 
               WHERE T2.OrderNo=@OrderNo
               AND  PaymentType='Interest')as tx1           
    CROSS APPLY(select 
               Deposit=sum(cast(T2.Balance as money))
               FROM DummyTable T2 
               WHERE T2.OrderNo=@OrderNo
               AND  PaymentType='Deposit')as tx2

    WHERE T1.OrderNo=@OrderNo


    Any Suggestion of using something more efficient than cross apply?

    Many thanks

1 个答案:

答案 0 :(得分: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

顺便说一下,您应该确保表中OrderNo的数据类型与变量@OrderNo相同。看起来你正在处理整数,所以你应该改变表格。如果您无法做到这一点,那么如果您想在@OrderNo上使用索引,则需要将varchar(255)更改为OrderNo