在我的应用程序中,用户可以创建具有三种列类型的自定义表。文本,数字和日期最多可包含20列。我使用nvarchar(430)为文本创建一个SQL表,使用decimal(38,6)表示数字和日期时间。以及Identity Id列。
许多这些表有可能由不同的用户创建,并且上传新CSV文件的用户可能经常更新数据。为了在上传用户数据期间获得最佳性能,我们截断表以除去现有数据,然后批量生成BULK INSERT。
用户可以根据他们构建的过滤器进行选择,该过滤器可以包含任意数量的列。我的问题是,在这个选择期间,一些包含大量行的表将具有较差的性能。为了解决这个问题,我考虑添加索引,但由于我们不知道WHERE条件中将包含哪些列,因此我们必须为每列编制索引。
例如,在本地SQL服务器上,只有超过一百万行的一个表和其中六列的WHERE条件将在第一次运行时花费大约8秒,然后在一秒钟内运行后续运行。对于每列的索引,它将在第一次运行查询时以不到一秒的速度运行。当我们在SQL Azure数据库上进行测试时,这个性能问题会被放大,其中相同的查询在第一次运行时将花费一分钟,并且在后续运行时不会改善,但索引需要1秒钟。
当用户创建列或者有更好的解决方案时,它是否适合在每个列上添加索引。
答案 0 :(得分:0)
是的,鉴于你的模特,这是一个好主意。当然,在插入时维护索引会有更多开销,但如果查询中确实没有可预测的通用列集,那么您没有太多选择。
如果'经常更新'意味着数据经常通过上传而不是现有记录被修改添加,您可以考虑使用各种非SQL数据库(如Apache Lucene或变体)中的一种,它们可以有效地查询任何数据组合。对于阅读巨大的“扁平”数据集,它们的速度非常快。