回答

收藏

SQL按年,月,周,日,小时分组SQL与程序性能

技术问答 技术问答 412 人阅读 | 0 人回复 | 2023-09-14

我需要编写一个查询,该查询将按年到小时的时间段对大量记录进行分组。
$ p, p) k, M; Y) n1 o7 v  \我最初的方法是按照程序在C#中确定时间段,遍历每个时间段并运行SQL以获取该时间段的数据,并随即建立数据集。! p1 ]- p, e# J
SELECT Sum(someValues)# ^0 N: W+ l" z+ N' e
FROM table1
  X0 X  C. F1 B% _8 qWHERE deliveryDate BETWEEN @fromDate AND @ toDate
, Y) k, l- `/ t) ~+ P8 S随后,我发现可以使用Year(),Month()Day()和datepart(星期,日期)和datepart(hh,日期)对记录进行分组。
$ m) h' ^6 N5 \% l- R8 `9 {) LSELECT Sum(someValues)
' D7 x4 `) U; _$ u2 n! m7 w& r& C0 F5 RFROM table19 W& g* H4 S6 l& I% J. Q
GROUP BY Year(deliveryDate), Month(deliveryDate), Day(deliveryDate)* G1 T1 M3 Y% @/ ~
我担心的是,由于不能有效地使用datetime字段上的索引,在group
( w- ^) e3 w1 d) Yby中使用datepart会导致性能比在指定的时间段内多次运行查询更糟糕;关于这是否属实有何想法?
) V$ W' E# g; s谢谢。
1 i$ n" Q4 X. o. K                ) `' D' @4 q: P7 H  P
解决方案:
5 b' n9 b" `( |4 c; L8 l               
. D# }. @. F$ I* X- V$ |6 Q# B: B, _+ v9 G& _3 X6 T0 h

4 _4 ]) E% V& Y2 K+ ]! H' G                与任何与绩效相关的 措施一样
; F( ?9 Y1 J+ Z为第二种方法检查查询计划将提前告诉您任何明显的问题(当您不需要时进行全表扫描),但是没有替代方法。在SQL性能测试中,应该使用适当大小的测试数据来进行测量。4 s7 d+ S' n2 ]
由于这是一个复杂的情况,因此您不仅要简单地比较两种不同的方法来执行单个查询,还要将单个查询方法与一个迭代方法进行比较,因此环境的各个方面可能在实际性能中起主要作用。
% o" B6 Y2 o; l# }具体来说$ X- J9 w5 n4 z
[ol]与一个大查询方法相比,您的应用程序与数据库之间的“距离”,因为每次调用的等待时间都将浪费时间% G" b+ Q9 Q( u, ~: R. N0 e
是否使用准备好的语句(在每个查询上对数据库引擎进行额外的解析工作)
( Q# s8 _9 |# C# _范围查询本身的构造是否昂贵(受2的影响很大)7 h4 U1 Z9 Z2 T9 h0 @$ N
[/ol]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则