Database design 索引建议-多列或标识

Database design 索引建议-多列或标识,database-design,Database Design,我有下表,想知道最好的索引方法使用。表将不会连接到任何其他表,尽管已包含外键,以防以后需要该要求。表将是单个报表的汇总表,目前我可以考虑使用的唯一聚集索引是复合索引,包含相当多的列,因为这是获得唯一值的唯一方法,是否值得使用标识键并将其用作我的索引?我还在各种单列上创建了一些非聚集索引,这些单列将用作我报告中的参数 任何建议都是非常欢迎的,因为我的索引知识不是很好,你能提供一个解释 table [AccountingPeriod] [char](6) NOT NULL, [r

我有下表,想知道最好的索引方法使用。表将不会连接到任何其他表,尽管已包含外键,以防以后需要该要求。表将是单个报表的汇总表,目前我可以考虑使用的唯一聚集索引是复合索引,包含相当多的列,因为这是获得唯一值的唯一方法,是否值得使用标识键并将其用作我的索引?我还在各种单列上创建了一些非聚集索引,这些单列将用作我报告中的参数

任何建议都是非常欢迎的,因为我的索引知识不是很好,你能提供一个解释

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、UnwritingGroup、DWAccountingPeriod、MovementTypeGroup最佳索引策略是将索引设计延迟到需要的时候。对于外键,您目前已明确排除它们。索引在插入和更新时花费您的时间,在查询时节省您的时间。你要做什么样的查询?每个查询的相对频率和相对紧迫度是多少?这将引导您找到支持简单查询的正确索引

话虽如此,您还是有理由为表声明一个主键。没有主键的表易受重复项的攻击,而重复项在逻辑级别上是一团乱麻请参见第一个标准形式。如果您确实声明了一个主键,任何一个像样的DBMS都会为您构建一个索引,对与主键相同的列进行编目


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

您能提供更多上下文吗?你有什么要求?您是否要进行大量的插入或更新,以及这些插入或更新的性能有多重要?那么删除呢?通常情况下,您将如何使用此表?该表将在每晚被截断并重新填充,填充后将针对先前的值对其运行update语句,但仅在白天用于选择/报告目的