【发布时间】:2015-06-02 18:17:29
【问题描述】:
我使用 SQL Server 2008 处理 C# 项目。
在我的项目中,我想通过 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 Ram)
如何在更快的时间内获得结果?
PS:即使我从 SQL 语句中删除了 «sum_creditor 列»,对于 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
【问题讨论】:
-
您真的要在 12 月 1 日或 12 月 31 日结束搜索吗? di.doc_date
-
我像 yyyymmdd 这样存储日期,有什么不同?问题是别的。
-
我的意思是,您的标准在 12 月 1 日结束。通常开始日期是 1 月 1 日,结束日期是 12 月 31 日 :)
标签: sql-server cumulative-sum sqlperformance