我使用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;但是从Server获取记录的执行时间非常长(例如,对于get 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 发布于 2015-06-02 19:30:30
有几件事要考虑:
SELECT TOP 100 PERCENT是不必要的。如果要选择所有记录,只需执行SELECT。查询优化器应该足够聪明,可以忽略这一点,但您永远不知道SELECT,就像CTE中的ROW_NUMBER()一样。如果我的假设是正确的,我敢打赌_tmp.row <= tbl_tmp.row绝对会扼杀你的表现。像这样的东西会给你你想要的东西:
从tbl_tmp中选择SUM(金额<0比1其他0结束时)债务人,SUM(金额>0然后1其他0端)债权人https://stackoverflow.com/questions/30603617
复制相似问题