首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server 2008中累积和的长执行时间

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

Stack Overflow用户
提问于 2015-06-02 18:17:29
回答 1查看 167关注 0票数 0

我使用Server 2008从事一个C#项目。

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

代码语言:javascript
复制
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;

但是从Server获取记录的执行时间非常长(例如,对于get 2207记录,执行时间为28秒,而我的PC是Core-i7 & 8Gb Ram)

如何在更快的时间内取得成果?

PS:即使我从SQL语句中删除了sum_creditor列,对于对我来说太长的2207条记录,我的执行时间将是14秒。

编辑:

我的输出结果如下:

代码语言:javascript
复制
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 
EN

回答 1

Stack Overflow用户

发布于 2015-06-02 19:30:30

有几件事要考虑:

  • SELECT TOP 100 PERCENT是不必要的。如果要选择所有记录,只需执行SELECT。查询优化器应该足够聪明,可以忽略这一点,但您永远不知道
  • 我在这里做了一些假设,因为你没有列出任何样本数据,但是看起来CTE只是在提取一个行号和一个数量。然后,看起来您想要提取两个计数,债务人和债权人,其中每一个负数是一个债务人计数,每个正面是一个债权人。如果是这样的话,没有必要使用两个嵌套的SELECT,就像CTE中的ROW_NUMBER()一样。如果我的假设是正确的,我敢打赌_tmp.row <= tbl_tmp.row绝对会扼杀你的表现。像这样的东西会给你你想要的东西: 从tbl_tmp中选择SUM(金额<0比1其他0结束时)债务人,SUM(金额>0然后1其他0端)债权人
  • 您的问题被标记为Server。如果是这样,则计算机的速度与查询执行时间无关。从服务器返回结果所需的时间完全取决于server的性能(硬件、可用资源、竞争的TSQL查询、适用的索引及其碎片等等)。您的计算机将查询发送到服务器,然后在服务器发送响应之前不执行任何操作。拥有世界上最快的桌面计算机不会使查询执行得更快(除非在本地计算机上运行Express实例)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30603617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档