【发布时间】:2013-03-02 05:32:27
【问题描述】:
我正在尝试提高我的多租户 SaaS 系统上的大型表的性能,以使报告速度更快。 当我在聚集索引上添加一列时,在系统上进行插入操作的时间从 ~30ms 增加到 1500~2500ms! 在这种情况下,应用于此表的最佳聚集索引选项和非聚集索引是什么:
- 数据库:SQL Azure
- 我只对该表执行 INSERT 和 SELECT,数据从不更新 (UPDATE)
- 并发 INSERTS 的高负载(不同的 Worker 和线程使用队列中的数据)
- 100.000 行/天(增长)
- 实际上有 600 万行(增长中)
- 每个租户只读取其 ID 的数据
- 1 个租户将拥有 100-3000 个 DeviceId
表结构:
- TenantID (bigint)(我可以使用 smallint,但如果我将来需要使用 Azure 联合,我会更改为 bigint)
- 设备 ID (int)
- ReadID (bigint) (身份)
- UIDRead (GUID)
- ReadDate(日期时间)
- SensorState1 (tinyint)
- SensorState2 (tinyint)
- SensorState3 (tinyint)
...
- SensorState10 (tinyint)
常见的 WHERE 用于读取数据:
-WHERE DeviceId = @X 和 @XDate 和 @YDate 之间的 ReadDate
-WHERE DeviceId IN (X,Y,Z) AND ReadDate 在@XDate 和@YDate 之间
-WHERE TenantId = @Y and ReadDate BETWEEN @XDate and @YDate
-WHERE TenantId = @X AND DeviceID IN (X,Y,Z) AND ReadDate 在@XDate 和@YDate 之间
-WHERE TenantId = @X AND DeviceID =@Y AND ReadDate 在@XDate 和@YDate 之间
【问题讨论】:
-
您将哪一列定义为聚集索引的键? ReadID 看起来应该是集群键,因为它是唯一的、相当窄的并且不断增加。如果它是该列(单独)并且您在插入数据时仍然遇到这些长时间的延迟,那么这里肯定会发生其他事情。
标签: sql-server indexing azure-sql-database