我在一个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实例)。