【问题标题】:How to create a table with large amount of data that supports fast queries in a warehouse?如何在仓库中创建支持快速查询的海量数据表?
【发布时间】:2013-08-04 04:44:02
【问题描述】:

我有大约 5M 的大量数据存储在一个非常扁平的表中,该表有 12 列。此表包含聚合数据,与其他表没有任何关系。我想对此数据运行动态查询以进行报告。该表包含DistrictCityYearCategorySubCategorySaleAmount 等字段

  1. 我想查看报告,例如 2010 年到 2013 年的销售额。

  2. 各产品各年的销量并进行比较。

  3. 特定销售人员在一年内的销售额。

  4. 按类别、子类别等分类的销售额

我使用的是 SQL Server 2008,但我不是 DBA,因此我不知道应该创建什么类型的索引?为了使我的查询正常工作,我应该索引哪些列。

如果数据量很小,我就不会为所有这些问题而烦恼,而是继续进行,但在这种情况下,知道要索引哪些列以及要创建哪种类型的索引至关重要。

请告诉我确保快速执行查询的最佳方法。

如果我在所有列上创建聚集索引,它会起作用吗?还是会伤害我。

请记住,此表不会经常更新,可能每月更新一次。

【问题讨论】:

    标签: sql-server sql-server-2008 reporting-services dynamic-sql


    【解决方案1】:

    鉴于您非常明确和具体的要求,我建议您为每个字段创建一个非聚集索引,并将其留给优化器作为第一步。 (即您创建 12 个索引)每个索引中只放置一个字段。不要索引(或至少谨慎使用)任何长文本类型字段。也不要索引只有 2 个值和 50/50 拆分的字段,例如 M/F。我假设您对每个字段都有谓词,但不要费心索引任何从未用于选择目的的字段。

    如果在此之后仍然有问题,请在 sql server 中找到查询分析器,并使用它来指导如何处理查询。

    多段索引有时会更好,但如果您的查询主要限于表的一小部分,那么单字段索引就可以了。

    对于使用“order by”的查询,您可能会遇到剩余的性能问题,但在此阶段让我们将其留作提醒。

    我的推理是基于

    1. 您只有 12 列,所以我们不会超载任何内容
    2. 只有 5M 行。这对 sql/server 来说很容易处理
    3. 数据的增长很小,因此索引更新应该不是太大的问题。
    4. 优化器会喜欢这些结合索引的查询。
    5. 我们没有典型的查询示例来指定多段索引,而且这个问题似乎暗示了高度可变的查询。

    【讨论】:

    • 感谢您的及时回复。你能否解释一下在这个场景中使用聚集索引是否有用,或者它会让事情变得更糟。我在想我可以创建一个聚集索引,左边是最常见的字段,如年份、类别等,右边是不太相关的字段,但我没有经验告诉我它是否会比 12 个单独的索引更好?你有没有比较过这两种情况?
    • 在 sql/server 中,聚集索引更多地用于控制表 msdn.microsoft.com/en-us/library/ms190457.aspx 中行的物理位置,在数据库中,您通常希望 I/O 获取尽可能多的相关行,因此集群他们在一起。在您的情况下,我会选择您希望相同日期的行彼此靠近,因此可能会在年/月/日之类的事情上进行聚类,但是,当您在没有聚类的情况下加载新记录时,无论如何您自然应该得到这个。面积很大......
    • 你可能想到的另一件事是多段索引,其中一个索引包含多个字段,这些可以更好地执行查询,更适合谓词,I/O 密度,预排序结果,准垂直分区等,但是,我们需要查看常见的查询示例,因为您通常必须查询前导字段。查询 B=6 的 A,B 上的索引通常不会使用该索引(某些引擎在某些情况下会使用该索引,而有些则不会)。这就是为什么我建议将单字段索引作为起点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2011-11-17
    • 2018-09-18
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多