【问题标题】:Is it a good idea to index every column if the users can filter by any column?如果用户可以按任何列过滤,索引每一列是否是个好主意?
【发布时间】:2016-11-14 14:08:21
【问题描述】:

在我的应用程序中,用户可以创建具有三种列类型的自定义表格,文本、数字和日期。它们最多可以有 20 列。我使用nvarchar(430) 用于文本、decimal(38,6) 用于数字和datetime 以及标识 ID 列,基于其架构创建了一个 SQL 表。

其中许多表可能由不同的用户创建,并且数据可能会因用户上传新的 CSV 文件而频繁更新。为了在用户数据的上传过程中获得最佳性能,我们将表截断以去除现有数据,然后进行批量 BULK INSERT。

用户可以根据他们建立的过滤器进行选择,该过滤器可以包括任意数量的列。我的问题是,某些行数很多的表在此选择期间性能较差。为了解决这个问题,我考虑过添加索引,但由于我们不知道 WHERE 条件中将包含哪些列,因此我们必须对每一列进行索引。

例如,在本地 SQL Server 上,一个表的行数刚刚超过一百万,其中 6 个列的 WHERE 条件在第一次运行时大约需要 8 秒,然后在后续运行时不到一秒。每列都有索引,它会在第一次运行查询时在一秒钟内运行。当我们在 SQL Azure 数据库上进行测试时,这个性能问题被放大了,在该数据库中,相同的查询在第一次运行时会花费一分钟多的时间,并且在后续运行中没有改善,但对于索引则需要 1 秒。

那么,当用户创建列时,在每列上添加索引是一个合适的解决方案,还是有更好的解决方案?

【问题讨论】:

    标签: sql sql-server indexing azure-sql-database


    【解决方案1】:

    是的,考虑到您的模型,这是个好主意。当然,维护插入索引的开销会更大,但如果查询中没有可预测的标准列集,您就没有太多选择了。

    假设“经常更新”是指通过上传频繁添加数据,而不是修改现有记录。在这种情况下,您可能会考虑允许对任何数据组合进行有效查询的各种非 SQL 数据库(如 Apache Lucene 或变体)之一。对于读取海量“扁平”数据集,它们的速度惊人地快。

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多