我有一个多选测试答案表:
Table Answers (
ID INT IDENTITY (1,1) PRIMARY KEY,
UserId INT,
StudyId INT, -- each study is a set of questions
PracticeId INT, -- each practice run (user may respond to a test multiple times)
QuestionId INT,
Valid BIT
)
表格很大(数百万行),我将在其上运行各种统计数据。例如:
对于一项研究中的用户,显示了5个表现最差的问题(在所有练习中大多数时间都回答错误)
从答案中选择前5个问题,100 *总和(有效)/计数(*)率 userid = xxx和studyid = xxx group by questionid order by rate
在所有用户的研究中显示5个最难的问题(最差的回复率):
从答案中选择前5个问题,100 *总和(有效)/计数(*)率 其中studyid = xxx group by questionid order by rate
等
我无法预见我将收集的所有可能类型的统计数据。我还是想提前设置一些通用索引。但是,看起来我需要为各种字段组合创建索引,当我不知道统计查询的全部范围时,我不确定如何最好地处理它。
任何想法如何以“正确的方式”接近它?
答案 0 :(得分:2)
首先在每个外键上放置一个非聚簇索引列。这应该是您创建的所有外键的标准做法,除非您有特殊原因不这样做。使用索引交叉点http://sqlblog.com/blogs/kalen_delaney/archive/2013/02/14/index-intersection.aspx,大多数查询至少能够过滤掉行。
在位列上创建索引可能不会有用,因为我假设它对这两个值都没有足够的选择性。
所有这些列都使用默认值允许空值。我假设您实际上计划让它们不可空?如果没有,并且您正计划将其中一些保留为可空,则可以查看稀疏列和筛选索引https://msdn.microsoft.com/en-us/library/cc280604.aspx。
您可能的复合和覆盖索引是您必须等待并查看最常见的重要查询要调整的索引。
答案 1 :(得分:1)
你有5列显然是外键。为了FK性能,为每列构建一个索引。这对查询性能调优来说是一个很好的开端。现在没有必要坚持下去 - 你提到的查询中没有火箭科学,表结构绝对是普通的。
答案 2 :(得分:0)
我建议您填充表格并尝试一些查询,而不是尝试创建您可能需要的索引。然后,当您知道将经常运行哪些查询时,您可以通过SQL Server Tuning Adviser运行查询,该查询将为您建议索引和统计信息。
预先猜测可能只会创建您不需要并且不会使用的索引。