小编tre*_*nja的帖子

聚集索引帮助,我哪里出错了?

我被要求查看一张非常繁忙的表格并找出任何需要改进的地方。
我只能更改索引表的能力非常有限。

表信息

  • 240 列
  • 约 500 万行
  • 由大约 30 个应用程序阅读和更新,范围从网站到投票应用程序。
  • 每行代表一个合约及其基于三个标志(大小为 5、8 和 8 的 varchars)的状态。
  • 一行的生命周期通过这三个标志从开始到结束,最终完成。
  • 在整个生命周期中,一行通常会更新或更改 10 到 30 次。
  • 主键是 id 列、guid 列和 company 列的组合。
  • 表有 40 多个索引,其中大部分是重复的和未使用的。这是基于sys.dm_db_index_usage_statsDMV,在过去 7 周内每周运行两次。

此表上的当前聚集索引有五列:

  1. 公司列(50 个不同的值)
  2. 区域列(21 个不同的值)
  3. FlagA 列(8 个不同的值)
  4. FlagB 列(24 个不同的值)
  5. FlagC 列(5 个不同的值)

我的理解是聚簇索引应该坚持以下属性。 来源

  1. 独特的
  2. 静止的
  3. 狭窄的
  4. 不断增加。

当前的聚集索引不是这些。

  1. 没有唯一的 ID。
  2. 这三个标志不断更新。
  3. 任何给定时刻都可以有 5000 行所有 5 列都具有相同的值。

所以我的假设是用Id列上的聚集索引来纠正这个问题- 一个不是身份但通过计数器表维护的整数(读取值,加 1,更新计数器表)。

我在 上创建了一个聚集索引Id,不使用主键,因为我相信添加 guid 和 company 列不会给我任何好处。

然后我创建了一个非聚集索引,其中包含 …

sql-server clustered-index sql-server-2008-r2 index-tuning

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

根据不同的日期汇总数据

我正在尝试准确计算工具出租的总天数。

这是一个数据示例:

CREATE Table #tmpToolRentalDays
(   
    ToolId          BIGINT, 
    StartDate       DATETIME, 
    EndDate         DATETIME,
    RentalDays      FLOAT
)

INSERT INTO #tmpToolRentalDays(ToolId, StartDate, EndDate, RentalDays) 
values
(39,    '2016-02-01 00:00:00.000',  '2016-02-01 00:00:00.000',   1),
(39,    '2016-02-01 00:00:00.000',  '2016-02-02 00:00:00.000',  2),
(39,    '2016-02-04 00:00:00.000',  '2016-02-05 00:00:00.000',  2),
(39,    '2016-02-05 00:00:00.000',  '2016-02-06 00:00:00.000',  2),
(39,    '2016-02-06 00:00:00.000',  '2016-02-07 00:00:00.000',  2),
(36,    '2016-02-07 00:00:00.000',  '2016-02-28 00:00:00.000',  22),
(39,    '2016-02-08 00:00:00.000',  '2016-02-09 00:00:00.000',  2),
(39,    '2016-02-09 00:00:00.000',  '2016-02-10 00:00:00.000',  2),
(11,    '2016-02-14 00:00:00.000',  '2016-02-28 00:00:00.000',  15),
(39,    '2016-02-18 00:00:00.000',  '2016-02-21 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2

5
推荐指数
3
解决办法
1147
查看次数