Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server跨行压缩_Sql_Sql Server_Sql Server 2005_Compression - Fatal编程技术网

SQL Server跨行压缩

SQL Server跨行压缩,sql,sql-server,sql-server-2005,compression,Sql,Sql Server,Sql Server 2005,Compression,我必须以特定顺序返回约70000行4列整数,并且只能使用非常浅的缓存,因为涉及的数据非常不稳定,必须是最新的。数据的一个特性是,当数据处于有序状态时,它通常是高度重复的 我已经开始研究各种减少行数的方法,以减少网络带宽和客户端处理时间/资源,但还没有在T-SQL中找到任何一种技术,可以将重复行“压缩”为一行和“计数”列。e、 g prop1 prop2 prop3 prop4 -------------------------------- 0 0

我必须以特定顺序返回约70000行4列整数,并且只能使用非常浅的缓存,因为涉及的数据非常不稳定,必须是最新的。数据的一个特性是,当数据处于有序状态时,它通常是高度重复的

我已经开始研究各种减少行数的方法,以减少网络带宽和客户端处理时间/资源,但还没有在T-SQL中找到任何一种技术,可以将重复行“压缩”为一行和“计数”列。e、 g

prop1    prop2    prop3    prop4
--------------------------------
0        0        1        53
0        0        2        55
1        1        1        8
1        1        1        8
1        1        1        8
1        1        1        8
0        0        2        55
0        0        2        55
0        0        1        53
进入:

我估计,如果这是可能的,在许多情况下,70000行的结果集最多会减少到几千行

我是不是找错地方了?SQL Server协议中是否有隐式压缩

是否有一种方法可以执行此SQL Server 2005

有什么理由我不应该这样做吗

谢谢。

您可以使用该功能!这将要求您使用GROUPBY子句,在该子句中,您告诉count如何拆分或分组。Gropu by用于SQL中的任何函数

更新:上面提到的OP是按y和x排序的,而不是结果集的一部分。在这种情况下,您仍然可以使用y和x作为编组方式的一部分


请记住,如果没有排序列,顺序就没有任何意义,因此在这种情况下,我们必须尊重组by中的y和x。

这将起作用,尽管看到以下内容很痛苦:

;WITH Ordering
AS
(
  SELECT Prop1,        
  Prop2,        
  Prop3,        
  Prop4,
  ROW_NUMBER() OVER (ORDER BY Y, X) RN
  FROM Props
)
SELECT 
  CurrentRow.Prop1, 
  CurrentRow.Prop2, 
  CurrentRow.Prop3, 
  CurrentRow.Prop4, 
  CurrentRow.RN - 
    ISNULL((SELECT TOP 1 RN FROM Ordering O3 WHERE RN < CurrentRow.RN AND (CurrentRow.Prop1 <> O3.Prop1 OR CurrentRow.Prop2 <> O3.Prop2 OR CurrentRow.Prop3 <> O3.Prop3 OR CurrentRow.Prop4 <> O3.Prop4) ORDER BY RN DESC), 0) Repetitions
FROM Ordering CurrentRow
LEFT JOIN Ordering O2 ON CurrentRow.RN + 1 = O2.RN
WHERE O2.RN IS NULL OR (CurrentRow.Prop1 <> O2.Prop1 OR CurrentRow.Prop2 <> O2.Prop2 OR CurrentRow.Prop3 <> O2.Prop3 OR CurrentRow.Prop4 <> O2.Prop4) 
ORDER BY CurrentRow.RN
要点如下:

使用row_NUMBER OVER枚举每一行,以获得正确的顺序。 仅当下一行具有不同的字段或下一行不存在时,通过连接来查找每个周期的最大值。 计算重复次数的方法是:取假定为本循环最大的当前行数,然后从中减去上一循环的最大行数(如果存在)。
在现代局域网上,70000行四个整数列并不是真正的带宽问题,除非有许多工作站同时执行此查询;在带宽受限的广域网上,您可以使用DISTINCT消除重复行,这种方法可以节省带宽,但会消耗一些服务器CPU。然而,除非您有一个真正超载的服务器总是在峰值负载或接近峰值负载时运行,否则这种额外的消耗将只是昙花一现。70000行几乎是零

这里有一个关键因素:您使用什么顺序查询这些数据?SQL Server并不总是保证按聚集索引顺序返回行,因此在本例中很难确定重复的含义。它是按两列排序的,这两列不是结果集的一部分,让我们称它们为“y”和“x”。干杯。这可能有用,但他的问题的一个关键要素涉及重复的数据行,并且不清楚插入此表的模式是什么。这不符合要求,它将分组彼此不相邻的行,正如我在问题中指出的,这非常重要。是否有某种方式可以将窗口功能与此结合使用?我对他们知之甚少。谢谢。@Kieran:在SQL Server中,排序并不重要,除非您有按其排序的列。你没有在问题中指出你在做什么。但是,您在评论中这样做了,因此我将其更改为您希望的方式。如果y,x顺序在重复行中保持一致,这将起作用。@dandres:什么?如果没有用于排序的列基础,SQL Server不会以一致的顺序返回行。如果没有一个一致的排序集,您就不能期望有任何关于相邻行的内容是有意义的。这将返回多行。你需要一个非常昂贵的distinct来过滤它们。这看起来和我想的差不多。我担心我对窗口函数的了解有点模糊,但我无法执行它,一开始在计数中丢失了*但是SQL 2005至少看起来不太喜欢上面的PARTITION BY和ORDER BY子句。我错过什么了吗?干杯。我正在改进这个查询,因为它确实返回重复的查询,不幸的是countover语句不支持排序。我会写一个更好的解决方案。带宽当然可能不是问题,但向用户报告70000行可能会导致他们失去生存的意愿!
select
    prop1,
    prop2,
    prop3,
    prop4,
    count(*) as count
from
    tbl
group by
    prop1,
    prop2,
    prop3,
    prop4,
    y,
    x
order by y, x
;WITH Ordering
AS
(
  SELECT Prop1,        
  Prop2,        
  Prop3,        
  Prop4,
  ROW_NUMBER() OVER (ORDER BY Y, X) RN
  FROM Props
)
SELECT 
  CurrentRow.Prop1, 
  CurrentRow.Prop2, 
  CurrentRow.Prop3, 
  CurrentRow.Prop4, 
  CurrentRow.RN - 
    ISNULL((SELECT TOP 1 RN FROM Ordering O3 WHERE RN < CurrentRow.RN AND (CurrentRow.Prop1 <> O3.Prop1 OR CurrentRow.Prop2 <> O3.Prop2 OR CurrentRow.Prop3 <> O3.Prop3 OR CurrentRow.Prop4 <> O3.Prop4) ORDER BY RN DESC), 0) Repetitions
FROM Ordering CurrentRow
LEFT JOIN Ordering O2 ON CurrentRow.RN + 1 = O2.RN
WHERE O2.RN IS NULL OR (CurrentRow.Prop1 <> O2.Prop1 OR CurrentRow.Prop2 <> O2.Prop2 OR CurrentRow.Prop3 <> O2.Prop3 OR CurrentRow.Prop4 <> O2.Prop4) 
ORDER BY CurrentRow.RN