我有两台机器都返回相同的数据,我很好奇使用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)行。只是为了帮助模糊。
答案 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必须产生相同的结果。可以说它可能有更好的性能。