代码之家  ›  专栏  ›  技术社区  ›  Toni Frankola

为SQL Server表选择最佳索引

  •  7
  • Toni Frankola  · 技术社区  · 14 年前

    我有一个具有以下结构的SQL Server表:

    CREATE TABLE [dbo].[Log](
     [LogID] [bigint] IDENTITY(1,1) NOT NULL,
     [A] [int] NOT NULL,
     [B] [int] NOT NULL,
     [C] [int] NOT NULL,
     [D] [int] NOT NULL,
     [E] [int] NOT NULL,
     [Flag1] [bit] NOT NULL,
     [Flag2] [bit] NOT NULL,
     [Flag3] [bit] NOT NULL,
     [Counter] [int] NOT NULL,
     [Start] [datetime] NOT NULL,
     [End] [datetime] NOT NULL)
    

    该表用于记录活动。柱 A - E Flag1 - Flag3 指示某些日志状态和列 Start End 标记活动的开始和结束。

    此表平均每~30秒更新一次,update进行~50次插入/更新。

    优化此表的数据检索的最佳方法是:

    1. 创建一个“master”索引来保存所有这些列
    2. A,D,E ], [ A, Start, End ]等等,并为它们创建索引
    5 回复  |  直到 14 年前
        1
  •  11
  •   marc_s    14 年前

    我怀疑这里的任何人除了猜测之外都不能做任何事情-您需要记录表的用法,并从该用法中查看正在查询哪些列组合。

    那肯定是

    • 如果您查询 全部的
    • 经常用(A,B),(A,B,C),(A,B,C,D)这样的组合

    在其他情况下,这是浪费-不要用这个。

    1. 识别一些最常用的过滤器组合,例如[A,D,e],[A, 为了他们

    是的,这是保证成功的唯一方法。您需要查看实际发生的查询类型,然后对其进行调整。

        2
  •  2
  •   OMG Ponies    14 年前

    很少为日志表编制索引,因为编制索引会减慢INSERT、UPDATE和DELETE语句的速度。

    • 在筛选之前将记录加载到表中(临时的或实际的,索引的)

    基本上-如果速度/性能是一个大问题,请将记录索引到另一种表格中,这样日志记录就不会受到影响。

        3
  •  2
  •   Remus Rusanu    14 年前

    (A,B,C,D) :

    • WHERE A=@a AND B=@b AND C=@c AND D=@d
    • WHERE A=@a 可以 WHERE A=@a AND B=@b , WHERE A=@a AND C=@c 等。任何有最左边列的组合( A 使用索引。
    • WHERe B=@b 无法使用索引。也不是 WHERE C=@c WHERE D=@d 以及任何其他误会的组合 一个 一个 不在查询限制内,索引不可用。

    这些是非常基本的规则。除此之外,连接条件可以或不可以被视为与WHERE子句相同。对于更大的结果,非覆盖指数可能会 the tipping point . 索引不仅可以满足搜索条件,还可以帮助处理ORDER BY子句。要创建的实际索引在很大程度上取决于查询模式、I/O功能、更新负载以及数据大小管理开销(文件和备份大小的影响)。引擎将提示您哪些索引可用于查询( Missing Indexes feature Index Design Guidelines 那很好,但当然,你必须读完它们。归根结底,选择合适的索引取决于如此多的因素和考虑,这是不可能给出一个千篇一律的答案。

        4
  •  1
  •   Scott Weinstein    14 年前

    一种方法是让SQL Server告诉您最佳使用情况。在表处于“典型”用法时运行跟踪几分钟,然后运行

        5
  •  0
  •   Tim    14 年前

    我将在start(datetime)上放置一个索引,仅此而已,假设很少有对日志的查询是从一开始到现在的,而且大多数都是从一个起点开始的。