- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在针对包含时间序列中的一堆点的表开发一个查询。该表可能会变得非常大,因此我希望查询通过对固定时间间隔内的点进行平均来有效地对输出进行下采样。编写查询后,我对 SQL Server (2008) 选择执行查询的方式感到惊讶。执行计划揭示了不必要的排序操作,随着时间序列的增长,该操作会变得昂贵。这是问题,简化为一个简单的例子:
CREATE TABLE [dbo].[Example]
(
[x] FLOAT NOT NULL,
[y] FLOAT NOT NULL,
PRIMARY KEY CLUSTERED
(
[x] ASC
)
);
SELECT FLOOR([x]), AVG([y])
FROM [dbo].[Example]
GROUP BY FLOOR([x]);
这里我有 (x,y) 对,它们已经按 x 排序(由于聚集主键),并且我对每个整数 x 的 y 进行平均(通过使用 FLOOR
进行截断) > 功能)。我希望该表已经针对聚合进行了适当排序,因为 FLOOR
是一个单调函数。不幸的是,SQL Server 决定需要对这些数据重新排序,执行计划如下:
SQL Server 不应该能够对按已适当排序的列的单调函数分组的数据执行流式聚合吗?
有没有通用的方法来重写此类查询,以便 SQL Server 看到顺序被保留?
[更新]我找到了一篇关于该主题的文章 Things SQL needs: sargability of monotonic functions而且,正如标题所示,这似乎是 SQL Server 尚未执行的优化(在大多数情况下)。
下面是通过 [dbo].[Example]
进行的更简单的查询,演示了这一点:
SELECT [x], [y]
FROM [dbo].[Example]
ORDER BY FLOOR([x]) --sort performed in execution plan
SELECT [x], [y]
FROM [dbo].[Example]
ORDER BY 2*[x] --NO sort performed in execution plan
SELECT [x], [y]
FROM [dbo].[Example]
ORDER BY 2*[x]+1 --sort performed in execution plan
在任何单个加法或乘法中,查询优化器都知道数据已经具有相同的顺序(当您按此类表达式进行分组时也会看到这一点)。因此,优化器似乎理解单调函数的概念,但并未普遍应用。
我现在正在测试计算列/索引解决方案,但这似乎会显着增加持久数据的大小,因为我需要多个索引来覆盖可能的间隔范围。
最佳答案
一些注意事项:
我认为如果您执行以下操作,您将获得最佳查询性能:
create table Point
(
PointId int identity(1, 1)
constraint PK_Example_Id primary key,
X float not null,
Y float not null,
FloorX as floor(x) persisted
)
create index IX_Point_FloorX_Y on Point(FloorX, Y)
添加一些行:
declare @RowCount int = 10000
while(@RowCount > 0)
begin
insert Point
values (cast(crypt_gen_random(2) as int), cast(crypt_gen_random(2) as int))
set @RowCount -= 1
end
查询:
select floor(X), avg(Y)
from Point
group by floor(X)
或
select FloorX, avg(Y)
from Point
group by FloorX
两者都有相同的计划
计划:无排序
另一个选项 - 您可以创建索引 View 。在这种情况下,您将必须直接查询 View ,除非您有企业版,即使您直接查询表,企业版也会使用索引 View 索引。
[编辑]刚刚意识到我没有明确回答您的问题。您问如果X
是聚集主键,SQL为什么要执行排序。 SQL 不对X
执行排序,而是对floor(x)
执行排序。换句话说,如果 x
已经排序,那么 f(x)
不一定具有相同的顺序,对吧?
关于sql-server - 按单调函数分组的聚合的冗余排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6319020/
您好,我正在处理 BIRT 报告。我有一个查询,我必须对父级的重复数据进行分组,但子级也不能分组! 在我的查询中: item 是父项,item_ledger_entry 是子项。我有来自 item.N
我正在使用 GA API。 这是针对 MCF 目标报告(底部)的标准目标完成指标表(顶部) 看一下这个: 总数加起来 (12,238),但看看按 channel 分组的分割有多么不同!我以为这些会很接
我正在开发一个流量计数器,我想获得 IP 和重复计数,但是如何? 就像是 :select ip, count(ip) from Redirect 返回 : null total ip count 重定
我尝试编写一个正则表达式来匹配条件表达式,例如: a!=2 1+2=2+a 我尝试提取运算符。我当前的正则表达式是“.+([!=<>]+).+” 但问题是匹配器总是尝试匹配组中可能的最短字符串
在 MS Transact SQL 中,假设我有一个这样的表(订单): Order Date Order Total Customer # 09/30/2008 8
我想按 m.ID 分组,并对每个 m.id 求和 (pm.amount_construction* prod.anzahl) 实际上我有以下结果: Meterial_id | amount_const
我想根据多列中的值对值进行分组。这是一个例子: 我想得到输出: {{-30,-50,20},{-20,30,60},{-30,NULL or other value, 20}} 我设法到达: SELE
我正在尝试找出运行此查询的最佳方式。我基本上需要返回在我们的系统中只下了一个订单的客户的“登录”字段列表(登录字段基本上是客户 ID/ key )。 我们系统的一些背景...... 客户在同一日期下的
给定以下mysql结果集: id code name importance '1234', 'ID-CS-B', 'Chocolate Sauce'
大家好,我的数据框中有以下列: LC_REF 1 DT 16 2C 2 DT 16 2C 3 DT 16 2C 1 DT 16 3C 6 DT 16 3C 3
我有这样的 mongoDB 集合 { "_id" : "EkKTRrpH4FY9AuRLj", "stage" : 10, }, { "_id" : "EkKTRrpH4FY9
假设我有一组数据对,其中 index 0 是值,index 1 是类型: input = [ ('11013331', 'KAT'), ('9085267',
java中用stream进行去重,排序,分组 一、distinct 1. 八大基本数据类型 List collect = ListUtil.of(1, 2, 3, 1, 2).stream().fil
基本上,我从 TABLE_A 中的这个开始 France - 100 France - 200 France - 300 Mexico - 50 Mexico - 50 Mexico - 56 Pol
我希望这个正则表达式 ([A-Z]+)$ 将选择此示例中的最后一次出现: AB.012.00.022ABC-1 AB.013.00.022AB-1 AB.014.00.022ABAB-1 但我没有匹配
我创建了一个数据透视表,但数据没有组合在一起。 任何人都可以帮助我获得所需的格式吗? 我为获取数据透视表而编写的查询: DECLARE @cols AS NVARCHAR(MAX), -- f
我想按时间段(月,周,日,小时,...)选择计数和分组。例如,我想选择行数并将它们按 24 小时分组。 我的表创建如下。日期是时间戳。 CREATE TABLE MSG ( MSG_ID dec
在 SQL Server 2005 中,我有一个包含如下数据的表: WTN------------Date 555-111-1212 2009-01-01 555-111-1212 2009-
题 假设我有 k 个标量列,如果它们沿着每列彼此在一定距离内,我想对它们进行分组。 假设简单 k 是 2 并且它们是我唯一的列。 pd.DataFrame(list(zip(sorted(choice
问题 在以下数据框中 df : import random import pandas as pd random.seed(999) sz = 50 qty = {'one': 1, 'two': 2
我是一名优秀的程序员,十分优秀!