小编Hug*_*une的帖子

在线重建索引而不会对其他请求造成风险

我们有一个 SQL Server 2012 企业版数据库,它的索引碎片非常快。

我们使用维护计划每天重新组织这些索引,并每周重建它们。重建在线进行并使用 tempdb(企业版 SQL Server 功能)。

然而,在重建的 2 分钟内,与数据库的其他连接受到影响。我们会遇到几次超时或死锁。有时,重建本身也会因死锁而失败。

重建失败没问题,我们可以再试一次。但是其他连接超时甚至需要很长时间是非常麻烦的。

有没有办法以较低的优先级运行重建,或者如果当前的处理资源不足以进行在线重建,则自动失败?

此数据库没有停机时间窗口,因此我们无法离线重建索引。有什么方法可以在线重建索引而不会对其他请求造成重大干扰?

sql-server sql-server-2012 index-maintenance

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

为非唯一聚集索引创建一个可见的唯一符列

我有一个事件表,聚集索引是创建日期/时间。

通常情况下,在同一毫秒内永远不会发生两个事件,但会发生异常事件,因此该列不一定是唯一的。

我想添加一个 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

3
推荐指数
2
解决办法
353
查看次数

如何在此日志记录表上优化此查询?

我正在尝试为记录事件的表格优化表格布局。

日志表包含三个相关的列:Timestamp, ItemId, LocationId
每行表示在给定的timeitem已经在某个 看到了某个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

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