SQL Server 2008中累积求和的执行时间长



我在一个c#项目中使用SQL Server 2008。

在我的项目中,我想在SQL语句下获得一些记录:

WITH tbl_tmp
AS (
    SELECT TOP 100 PERCENT 
        ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS row
        ,d.doc_amount AS amount
    FROM docs AS d
    LEFT OUTER JOIN docs_items AS di ON di.doc_id = d.doc_id
    WHERE di.branch_id = 1
        AND di.doc_date >= 20150101
        AND di.doc_date <= 20151201
        AND SUBSTRING(CAST(d.acc_id AS VARCHAR), 1, 4) = 1130
    ORDER BY di.doc_date ASC
        ,di.doc_number ASC
        ,d.docrow ASC
    )
SELECT row,
       amount,
       (
        SELECT CASE 
                WHEN (SUM(amount)) < 0
                    THEN ABS(SUM(amount))
                ELSE 0
                END
        FROM tbl_tmp AS _tmp
        WHERE _tmp.row <= tbl_tmp.row
        ) AS sum_debtor
    ,(
        SELECT CASE 
                WHEN (SUM(amount)) > 0
                    THEN ABS(SUM(amount))
                ELSE 0
                END
        FROM tbl_tmp AS _tmp
        WHERE _tmp.row <= tbl_tmp.row
        ) AS sum_creditor
FROM tbl_tmp;

但是从SQL Server获取记录的执行时间非常长(例如获取2207条记录的28秒),而我的PC是Core-i7 &8Gb内存)

如何在更快的时间内得到结果?

PS:即使我从SQL语句中删除« sum_债权国列»,我的2207条记录的执行时间将为14秒,这对我来说太长了。


编辑:

我的输出结果是这样的:

row    |amount      |sum_debtor     |sum_debtor
-------------------------------------------------
1      |1000        |1000           |0
2      |500         |1500           |0
3      |-2500       |0              |1000
4      |6000        |5000           |0
5      |-3000       |2000           |0 
.
.
.
.
2206   |8000        |13000          |0
2207   |-20000      |0              |7000 

需要考虑的几点:

  • SELECT TOP 100 PERCENT不需要。如果要选择所有记录,只需执行SELECT。查询优化器应该足够聪明,可以忽略这一点,但您永远不会知道
  • 我在这里做了一些假设,因为您没有列出任何示例数据,但看起来CTE只是拉出一个行号和一个数量。然后看起来你想拉两个计数,债务人和债权人,其中每个负数是债务人计数,每个正数是债权人计数。如果是这种情况,就没有必要嵌套两个SELECT, CTE中的ROW_NUMBER()也是如此。如果我的假设是正确的,我打赌_tmp.row <= tbl_tmp.row绝对会扼杀你的表现。像这样的代码应该会给你你正在寻找的东西:

    SELECT 
        SUM(CASE WHEN amount < 0 THEN 1 ELSE 0 END) debtor
        , SUM(CASE WHEN amount > 0 THEN 1 ELSE 0 END) creditor
    FROM tbl_tmp
    
  • 你的问题被标记为SQL Server。如果是这种情况,计算机的速度与查询执行时间无关。从服务器返回结果所需的时间完全取决于SQL server的性能(硬件、可用资源、竞争的TSQL查询、适用的索引及其碎片等)。您的计算机将查询发送到服务器,然后在服务器发送响应之前什么也不做。拥有世界上最快的台式计算机并不会使您的查询执行得更快(除非您在本地机器上运行Express实例)。

相关内容

  • 没有找到相关文章

最新更新