相关疑难解决方法(0)

除了“create_at”时间戳列之外,使用“most_recent”布尔列来跟踪记录的最新版本是不是不好的做法?

该表看起来像这样,它是 SCD 类型 2:

+-----------+------------------+------------------------+
| id (text) | version (serial) | created_at (timestamp) |
+-----------+------------------+------------------------+
Run Code Online (Sandbox Code Playgroud)

对于 99% 的查询,我们将搜索整个表并按附加列和连接表进行过滤。对于这些查询,我们只对每个唯一 ID 的记录的最新版本感兴趣。我们还将按created_at和其他列进行排序。

为了方便查找最新记录,我正在考虑添加一most_recent (boolean)列,如此处答案中所述:

/sf/ask/2414683561/#34495621

然而我意识到我们已经有了created_at告诉我们这些信息的列 - 我们可以在搜索查询中使用 DISTINCT 子句并按创建日期排序,如 @Svet 的答案所述:

/sf/ask/1212893041/

但是,我们随后必须按我们实际想要用来显示数据的列对结果重新排序。

从长远来看,添加额外的“当前”字段似乎更简单,并且性能会更高,但这也是不好的做法吗?

best-practices sorting data-versioning

11
推荐指数
3
解决办法
2955
查看次数

如何强制确保与时间维度关联的唯一性?

我有一个数据库表AB,它跟踪AB随着时间的推移的关联:

create table AB columns (
   ARef ...,  -- FK of A
   BRef ...,  -- FK of B
   Since as Timestamp,
   Until as Timestamp,
   SomeAttrib1 ...,
   SomeAttrib2 ...
);
Run Code Online (Sandbox Code Playgroud)

我想声明一个唯一的键,以便相同的 A 和 B在相同的时间间隔内只能关联一次

我可以使用什么策略来表达这种约束?显然,仅进行 PK 是ARef,BRef,Since,Until不够的 - 这只会防止完全相同间隔的重复。我需要考虑一行的间隔如何与表中其他行的间隔重叠或不重叠。

要考虑的参数:

  • 我使用的是 SQL Server 2012,但我也很想知道其他 RDBMS 中有哪些可用的工具。
  • 虽然我意识到保留这个“历史”或“时间维度”可以被认为是对数据库的“分析”使用,但我不想要一个使用“维度”或“立方体”的解决方案......这是一个普通的需要为不同时间发生的关联分配不同属性的应用程序的事务数据库。
  • 我并没有特别关注时间戳……如果它们有帮助,我很乐意考虑“间隔”数据类型。

database-design datatypes unique-constraint

6
推荐指数
1
解决办法
2846
查看次数

TSQL 慢查询,未按预期使用索引

我有一个宽表,相对较大,有 14,264,775 行,在 Azure SQL 数据库上运行。

以下查询需要一些 TLC。

IF EXISTS (
    SELECT  1/0 
    FROM dbo.table1 src
      INNER JOIN dbo.table1 tgt 
        ON tgt.Col1 = src.Col1
    WHERE tgt.ValidFrom <= src.ValidTo
    AND tgt.ValidTo >= src.ValidFrom
    AND tgt.RecordId <> src.RecordId  
)
 BEGIN
    RAISERROR('Overlap detected in dbo.table1', 11, 1); 
 END ;
Run Code Online (Sandbox Code Playgroud)

我有这个索引。

CREATE NONCLUSTERED INDEX [IX__table1] ON dbo.table1
        ( Col1 ) 
INCLUDE (ValidFrom, ValidTo, RecordId)
GO
Run Code Online (Sandbox Code Playgroud)

这是查询的 io 统计信息。逻辑阅读能力非常出色。

在此输入图像描述

这是计划 XML。我尝试了 PasteThePlan,但它无法解析计划 XML。(也许它不喜欢Axure sql数据库计划xml)。

如您所见,[src] 上有一个索引扫描;读取 14,264,775 行(与表中的所有行数相同)。并在 [tgt] 上进行索引查找;读取 194,405,307 行。

我需要改变什么来提高查询的性能? …

sql-server index-tuning azure-sql-database query-performance

1
推荐指数
1
解决办法
251
查看次数