回答

收藏

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

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

我需要编写一个查询,该查询将按年到小时的时间段对大量记录进行分组。
# E7 l  J. w# S$ n) B1 ~我最初的方法是按照程序在C#中确定时间段,遍历每个时间段并运行SQL以获取该时间段的数据,并随即建立数据集。: D, T7 m5 D( g  L& A6 P3 j
SELECT Sum(someValues)
6 `6 {3 C5 R5 J' G$ ?FROM table16 o( C1 H0 [2 Y/ h3 [3 Z
WHERE deliveryDate BETWEEN @fromDate AND @ toDate- f# |0 i: M: K. o. _( ]8 _5 q
随后,我发现可以使用Year(),Month()Day()和datepart(星期,日期)和datepart(hh,日期)对记录进行分组。, l3 m# d9 @1 H3 V& k
SELECT Sum(someValues)
# ^5 r8 |3 n+ k+ H/ n+ f. bFROM table1
- W4 r, m* R3 ^! {. |' uGROUP BY Year(deliveryDate), Month(deliveryDate), Day(deliveryDate)8 _/ n' z+ r+ k5 P3 p5 W7 r4 t
我担心的是,由于不能有效地使用datetime字段上的索引,在group
; F3 P' y' ?8 ]8 v6 @by中使用datepart会导致性能比在指定的时间段内多次运行查询更糟糕;关于这是否属实有何想法?
( D8 @8 @- w# c2 U3 x& E谢谢。
, e4 ]% f- [8 |2 j" x2 [3 d                * M" R% K  F  z8 ?* z
解决方案:
  y+ e5 J, m6 H/ ^: S                + s& \2 W% F+ t; ]. K1 B

" J5 [2 j# T8 N  ~2 Y4 V5 f% i' R  E" l- B; z0 g% ~3 L
                与任何与绩效相关的 措施一样
- K* E) [& ]; F( _为第二种方法检查查询计划将提前告诉您任何明显的问题(当您不需要时进行全表扫描),但是没有替代方法。在SQL性能测试中,应该使用适当大小的测试数据来进行测量。
" W2 q9 P+ b- j3 P  A* Q由于这是一个复杂的情况,因此您不仅要简单地比较两种不同的方法来执行单个查询,还要将单个查询方法与一个迭代方法进行比较,因此环境的各个方面可能在实际性能中起主要作用。
" u5 ^2 D4 z7 R2 F' J) ?$ N5 q4 z具体来说
0 z+ Z% D$ K4 c- E  k$ [% c5 S[ol]与一个大查询方法相比,您的应用程序与数据库之间的“距离”,因为每次调用的等待时间都将浪费时间
/ W# q9 x7 X; V  }  ^, J' J是否使用准备好的语句(在每个查询上对数据库引擎进行额外的解析工作); E- I& a! G2 c. u: k
范围查询本身的构造是否昂贵(受2的影响很大)* H7 h- ]0 N( S1 t5 I# L
[/ol]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则