4
|
Andrew Rimmer · 技术社区 · 16 年前 |
![]() |
1
4
以下是一些应该有效的方法:
选择
你需要一份关于城镇和日期的索引。 这种技术对于早期版本的MySQL尤其有用,因为它无法处理更明显的
选择城镇,临时
|
![]() |
2
1
|
![]() |
3
1
很高兴看到这么多方法来剥这只猫的皮。下面是一个使用CTE的例子(您也可以嵌套查询以获得更多的ANSI ism,但我发现CTE很好地避免了很多缩进,而且前面声明的东西使它在下面上下都非常可读):
我喜欢显式回溯技术的一点是,它可以让您轻松地访问为组选择的最上面一行中的所有信息,并且在更改组时非常灵活,而且不需要重复自己的操作。
优化器倾向于在SQL Server上非常快速地执行这些操作—就像大多数解决方案一样,如果您有一个关于城镇、日期、临时的索引,那么它将覆盖并运行得非常快。即使只是在镇上约会
|
![]() |
4
0
|
![]() |
5
0
|
![]() |
6
0
你可能有一张列有不同城镇的桌子吗?假设每个城镇有大约1000个测量值,窗口函数解决方案(如row_number()、rank()等)的性能可能不如普通聚合或此应用版本:
如果没有城镇列表,您可以试试这个,尽管我不知道它与普通的聚合+查找相比会有什么不同:
这些查询的性能完全取决于索引。你需要一个在[城镇]的最低限度和[城镇,日期]而不是最好的。如果其他表使用MeasurementID,但您很少使用MeasurementID访问MeasurementID表,则删除聚集索引,将MeasurementID设为非聚集PK,并在Town、Date上添加(非均匀)聚集索引。如果没有使用MeasurementID的其他表,那么完全删除该列——在这种情况下,它是一个无用的合成/人工键,无缘无故地使表膨胀。 索引中的这些建议更改将有助于使用聚合或应用此处答案中的所有查询。不确定它们对窗口函数的影响,这取决于优化器如何制定执行计划(如果它足够聪明,能够意识到它只需要访问最大日期,而不接触所有其他行,那么同一个索引将极大地提高它的性能,尽管我怀疑优化器能否做到这一点)。 另外,为了提高性能,我建议一定要有一个镇上的桌子,而不是把整个镇的地方。如果镇名变了怎么办?将每个名称的平均字节数从15个左右切换到一个int TownID的平均字节数只有4个,这将有助于提高速度。(尽管测试是为了证明这一点)。 |
![]() |
Sweepy Dodo · JSON lite的格式化 6 月前 |
![]() |
giantjenga · 优化整数向量到二进制向量的转换 7 月前 |
![]() |
Zegarek · Postgresql递归查询未提供预期结果 8 月前 |
![]() |
Joe · 为什么这两个查询之间的性能存在如此大的差异? 11 月前 |
![]() |
tic-toc-choc · 在`dplyr中高效使用列表进行过滤` 11 月前 |
![]() |
Mohan · 是否有一种更快的方法来编写代码,从1:N中提取许多随机样本? 12 月前 |
![]() |
user2980746 · 在C#字典中键入xyz对的最有效方法是什么? 12 月前 |