SQL Server:使用两个具有相同列的表与使用1个表

时间:2016-05-18 19:44:55

标签: sql sql-server

我有两台机器都返回相同的数据,我很好奇使用2表和1表与#34机器"的优点/缺点。创建视图时的列。

例如1表

;WITH Pre AS (
  SELECT X, EquipmentID, JoinID
  FROM OneTable
  WHERE EquipmentID=1
),
Post AS (
  SELECT X, EquipmentID, JoinID
  FROM OneTable
  WHERE EquipmentID=2
)

SELECT Pre.X AS 'PreX', Post.X 'PostX', Post.X-Pre.X AS 'DeltaX'
FROM Pre INNER JOIN Post ON Pre.JoinID = Post.JoinID

vs有2个表(pre和post)已经分开,只使用最后一个select语句。是否存在针对此类数据的既定做法?

显然,我的CTE对于1张桌子来说也有比我不了解更好的方法。谢谢。

编辑*在这个例子中,我做了1个delta;但我真正想要的是每个数据列的增量。实际数据被归一化为4个表,主数据表将数据放入其中大约每秒3次,并可能大约获得1M(ish)行。只是为了帮助模糊。

2 个答案:

答案 0 :(得分:1)

问题有点过于宽泛,因此答案是可怕的“它取决于”。

将设备数据保存在一个表中的主要优点是,它简化了表结构,使维护数据库变得更加容易。

但是,如果您的基础设备的数据记录速率非常高并且您必须存储大量数据,那么您可能最好将表格与性能观点完全分开。

通过在两个表上创建分区视图,您仍然可以充分利用这两个方面。分区视图将为您提供单个视图,但具有两个表所带来的性能优势。我只推荐使用高容量数据的方法,否则保持表结构简单(换句话说,坚持使用一个表)。 以下简单的谈话文章给出了分区视图如何工作的一个很好的例子:

https://www.simple-talk.com/sql/sql-tools/sql-server-partitioning-without-enterprise-edition/

答案 1 :(得分:0)

不确定我是否完全忽略了这个问题,但是将两个查询连接到同一个表的替代方法是GROUP BY透视方法。

SELECT 
    max(case EquipmentID when 1 then X end) AS 'PreX',
    max(case EquipmentID when 2 then X end) AS 'PostX',
    max(case EquipmentID when 2 then X end) - max(case EquipmentID when 1 then X end) AS DeltaX
  FROM OneTable
  WHERE EquipmentID in (1,2)
  GROUP BY JoinID
  HAVING max(EquipmentID) <> min(EquipmentID) 

提供(JoinID,EquipmentID)包含OneTable的PK必须产生相同的结果。可以说它可能有更好的性能。