我们有一个 SQL Server 2012 企业版数据库,它的索引碎片非常快。
我们使用维护计划每天重新组织这些索引,并每周重建它们。重建在线进行并使用 tempdb(企业版 SQL Server 功能)。
然而,在重建的 2 分钟内,与数据库的其他连接受到影响。我们会遇到几次超时或死锁。有时,重建本身也会因死锁而失败。
重建失败没问题,我们可以再试一次。但是其他连接超时甚至需要很长时间是非常麻烦的。
有没有办法以较低的优先级运行重建,或者如果当前的处理资源不足以进行在线重建,则自动失败?
此数据库没有停机时间窗口,因此我们无法离线重建索引。有什么方法可以在线重建索引而不会对其他请求造成重大干扰?
我有一个事件表,聚集索引是创建日期/时间。
通常情况下,在同一毫秒内永远不会发生两个事件,但会发生异常事件,因此该列不一定是唯一的。
我想添加一个 uniquifier 列,即在给定时间内插入的第一个行为 0,第二个为 1,依此类推:
TIME UNIQUIFIER, TEXT
2018-01-01 01:23:45.678, 0, "aaa"
2018-01-01 02:00:00.000, 0, "bbb"
2018-01-01 02:00:00.000, 1, "ccc"
2018-01-01 02:00:00.000, 2, "ddd"
2018-01-01 03:45:67.890, 0, "eee"
Run Code Online (Sandbox Code Playgroud)
我知道当我创建聚集索引时,MS Sql Server 会自动创建这样一个列。但是该列是隐藏的。
我想要一个可见的 uniquifier,它的行为就像这个隐藏的一样,所以我可以在外键关系中使用它。
也就是说,当...
...我可以Time:2018-01-01 02:00:00 / Uniquifier:0
用作外键,知道该行存在,而无需在第一个表中查找事件。
我可以使用自动递增的标识列来使键唯一,但这意味着我无法在不知道标识列的情况下引用事件。
例如,如果我想在单独的 1-n 表中创建事件和一堆额外的事件信息,我必须首先创建事件,然后查找其标识列,然后才创建相关信息,使用它身份栏。我试图避免往返。
是否有可能在 SQL Server 中使用自动值填充这样一个可见的列,与隐藏的 uniquifier 列相同?
还是在插入行时必须手动计算这样的列?
sql-server sql-server-2014 unique-constraint computed-column
我正在尝试为记录事件的表格优化表格布局。
日志表包含三个相关的列:Timestamp, ItemId, LocationId
每行表示在给定的time
,item
已经在某个 看到了某个location
。
2017-01-01 10:00 Item A has been seen at location 1
2017-01-01 10:01 Item A has been seen at location 1
2017-01-01 11:00 Item B has been seen at location 1
2017-01-01 11:01 Item B has been seen at location 2
2017-01-01 11:02 Item A has been seen at location 2
2017-01-01 11:03 Item B has been seen at location 1
Run Code Online (Sandbox Code Playgroud)
大约有 100 个不同的位置、每天 20.000 个新项目、每天一百万个事件和 14 天的日志。 …
performance database-design sql-server sql-server-2012 denormalization