代码之家  ›  专栏  ›  技术社区  ›  StriplingWarrior

在SQL Server表上使用最有效的索引和约束是什么?

  •  0
  • StriplingWarrior  · 技术社区  · 16 年前

    ActivityForm 和 Field 它们通过 ActivityFormField ActivityFormFieldValidator 表将与具有多对一关系的 活动表单字段 桌子,所以我们给 活动表单字段 表中的标识列(“ActivityFormFieldId”)。这 活动表单字段 该表还包含给定字段在给定活动窗体上显示的顺序等信息。

    预期用途如下:

    • 活动表单字段 给定的表 ActivityFormId 领域 和 活动表单字段验证器 桌子。
    • 新 活动表单字段 条目将每隔一段时间创建一次,但不会像上面提到的查询那样频繁。

    我最初的反应是使用以下键和索引配置ActivityFormField表:

    • 标识列上的主键,上面有聚集索引。
    • FieldId 和 活动表单ID

    除了给我感觉最“正确”或“正常”之外,这还满足了以下基本要求:

    • 活动表单字段 和 领域
    • 活动表单字段验证器 要附加的条目,以及
    • 活动表单ID

    活动表单字段 条目不应导致实际数据的任何重新排序。

    然而,考虑到我们计划使用该表的方式,我想知道是否有另一种键、索引和集群的组合可能更有效?

    更新

    经过一些额外的研究和思考,我倾向于让我的表声明看起来像这样:

    CREATE TABLE [ActivityFormField](
        [ActivityFormFieldId] [int] IDENTITY(1,1) NOT NULL,
        [ActivityFormId] [int] NOT NULL,
        [FieldId] [int] NOT NULL,
        [SortOrder] [tinyint] NOT NULL,
        CONSTRAINT [PK_ActivityFormField] PRIMARY KEY NONCLUSTERED 
        (
            [ActivityFormFieldId] ASC
        ),
        CONSTRAINT [UK_ActivityFormField_ActivityForm_Field] UNIQUE NONCLUSTERED
        (
            [ActivityFormId] ASC,
            [FieldId] ASC
        )
    )
    
    ALTER TABLE [ActivityFormField] WITH CHECK ADD CONSTRAINT [FK_ActivityFormField_ActivityForm] FOREIGN KEY([ActivityFormId])
    REFERENCES [ActivityForm] ([ActivityFormId])
    
    ALTER TABLE [ActivityFormField] WITH CHECK ADD CONSTRAINT [FK_ActivityFormField_Field] FOREIGN KEY([FieldId])
    REFERENCES [Field] ([FieldId])
    
    CREATE UNIQUE CLUSTERED INDEX IX_ActivityFormField_ActivityForm_SortOrder ON [ActivityFormField] 
    (
        [ActivityFormId] ASC,
        [SortOrder] ASC
    )
    
    CREATE NONCLUSTERED INDEX IX_ActivityFormField_ActivityForm ON [ActivityFormField] 
        (
            [ActivityFormId]
        )
    
    CREATE NONCLUSTERED INDEX IX_ActivityFormField_Field ON [ActivityFormField] 
        (
            [FieldId]
        )
    

    这种方法在标识字段上使用非聚集索引,在最常用的查询检索数据的条件和顺序上使用聚集索引,并使用约束来确保只有一个 活动表单字段 条目存在以下任意组合 和 领域 。内部显然以相同的方式处理唯一约束和索引,因此我选择了一个约束来表明它的主要目的是保持事物的唯一性。根据HLGEM提出的逻辑,其他指数“以防万一”。

    2 回复  |  直到 14 年前
        1
  •  0
  •   HLGEM    16 年前

    作为另一个表的单独fk的每个字段都应该单独位于索引中。与PK不同,这些索引不是自动创建的,几乎总是需要的。

    如果您有PK以外的唯一组合(如果在大多数表中使用代理PK,您应该这样做),请务必为字段的组合设置唯一索引,否则将造成数据完整性问题。根据查询表时使用的where子句,可能需要其他索引。索引需求可能会随着表大小的增长而变化,因此不必觉得第一次就必须正确使用所有索引。

        2
  •  0
  •   Callie J    16 年前

    不幸的是,没有一个简单的答案。我会从你自己的建议开始,但然后我会在表中加载适量的数据,并通过分析器将其踢出,查看生成的执行计划。基准测试确实是解决这个问题的唯一方法。

    若你们得到索引搜索,那个么一切都很好:真的不需要更多的工作了。如果你有索引扫描,那么看看是否可以调整索引以将其转换为寻道。如果在执行计划中看到任何书签查找,请考虑在索引中添加其他列,以便索引本身覆盖查询。