sql - 如果用户可以按任何列进行过滤,那么索引每一列是否是个好主意?

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

在我的应用程序中,用户可以创建具有三种列类型(文本、数字和日期)的自定义表。它们最多可以有 20 列。我使用 nvarchar(430) 基于他们的模式创建了一个 SQL 表对于文本,decimal(38,6)用于数字和 datetime ,以及一个 Identity Id 列。
许多这些表可能由不同的用户创建,并且数据可能会因用户上传新的 CSV 文件而频繁更新。为了在用户数据上传过程中获得最佳性能,我们将表格截断以去除现有数据,然后进行批量 BULK INSERT。
用户可以根据他们建立的过滤器进行选择,过滤器可以包括任意数量的列。我的问题是,在此选择过程中,某些包含大量行的表的性能会很差。为了解决这个问题,我考虑添加索引,但由于我们不知道 WHERE 条件中将包含哪些列,因此我们必须对每一列进行索引。
例如,在本地 SQL 服务器上,一个只有超过一百万行且其中 6 个列的 WHERE 条件的表在第一次运行时将花费大约 8 秒,然后在随后的运行中不到一秒。在每一列上都有索引,第一次运行查询时,它将在不到一秒的时间内运行。当我们在 SQL Azure 数据库上进行测试时,这个性能问题被放大了,其中第一次运行相同的查询将花费一分钟,并且在后续运行中没有改善,但使用索引需要 1 秒。
那么,当用户创建列时,在每列上添加索引是一个合适的解决方案,还是有更好的解决方案?

最佳答案

是的,鉴于您的模型,这是一个好主意。当然,维护插入索引的开销会更多,但是如果查询中没有可预测的标准列集,您就没有很多选择。
假设“频繁更新”,您的意思是通过上传频繁添加数据,而不是修改现有记录。在这种情况下,您可能会考虑各种非 SQL 数据库(如 Apache Lucene 或变体)中的一种,它们允许对任何数据组合进行高效查询。对于读取大量“扁平”数据集,它们的速度快得惊人。

关于sql - 如果用户可以按任何列进行过滤,那么索引每一列是否是个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38327077/

相关文章:

sql - 使用全局临时表可以吗?

c# - 将 .net 项目部署到开发服务器

javascript - 如何防止SQL用单引号字符存储转义字符

arrays - bash 递增地添加到数组

indexing - 在 Marklogic 中创建没有父级的地理空间对索引

mysql - 尝试为 zencart 运行 SQL 查询时出现意外 token 问题

sql - 展开 SQL Reporting Service 中的所有节点?

sql - 使用 SQL 过滤 CosmoDB 内集合的 JSON 集合中的日期时间值

sql - 将 1 行表展平为键值对表

python - Numpy 返回索引数组