索引建议 - 多列或标识

时间:2014-11-20 10:56:44

标签: database-design

我有下表,并且想知道最佳索引方法。表格不会加入任何其他表格,但如果以后需要提供外键,则表格已包括在内。表将是单个报告的汇总表,目前我能想到的唯一聚集索引是复合的,并且包含很多列,因为这是获得唯一值的唯一方法,是否值得使用身份密钥并使用它作为我的索引?我还在各种奇异列上创建了一些非聚集索引,这些列将在我的报告中用作参数。

任何建议都会非常受欢迎,因为我的索引知识并不太棒,你能不能提供解释。

table 
     [AccountingPeriod] [char](6) NOT NULL,
    [reportPeriod] [char](6) NOT NULL,
    [NewRenewal] [varchar](10) NOT NULL,
    [MovementTypeGroup] [varchar](80) NOT NULL,
    [Year] [varchar](4) NULL,
    [Quarter] [varchar](1) NOT NULL,
    [Month] [varchar](2) NULL,
    [BranchId] [smallint] NOT NULL,
    [BranchKey] [int] NOT NULL,
    [BranchDescription] [varchar](50) NOT NULL,
    [ProductId] [int] NOT NULL,
    [ProductKey] [int] NOT NULL,
    [ProductDescription] [varchar](50) NOT NULL,
    [UgId] [smallint] NOT NULL,
    [UgKey] [int] NOT NULL,
    [UnderwritingGroup] [varchar](30) NOT NULL,
    [ActualGBP] [numeric](38, 6) NULL,
    [ActualEUR] [numeric](38, 6) NULL,
    [ActualUSD] [numeric](38, 6) NULL,
    [PlanGBP] [money] NOT NULL,
    [PlanEUR] [float] NOT NULL,
    [PlanUSD] [float] NOT NULL,
    [PriorGBP] [int] NOT NULL,
    [PriorEUR] [int] NOT NULL,
    [PriorUSD] [int] NOT NULL

索引

FlashreportPeriod,NewRenewal,BranchDescription,ProductDescription,UnderwritingGroup,DWAccountingPeriod,MovementTypeGroup

1 个答案:

答案 0 :(得分:0)

最佳指数策略是将指数设计延迟到需要时为止。对于外键,你已经明确地将它们排除在外。索引会花费您在插入和更新时的时间,并节省您在查询时的时间。你打算做什么样的查询?每个查询的相对频率和相对紧急程度是多少?这将指导您使用正确的索引来支持简单查询。

说了这么多,你有理由为这个表声明一个主键。没有主键的表容易受到重复的影响,并且重复在逻辑层面上是一个真正的混乱(参见第一范式)。如果您确实声明了主键,那么任何体面的DBMS都会为您构建一个索引,该索引将与主键相同的列编目。

至少需要该索引来检测插入时的重复项。它也可能有助于查询。听起来你的PK将包括AccountingPeriod。这将使索引对涉及AccountingPeriod的查询最有用。