SQL 服务器内存 table 具有大量数据的用例
SQL Server In-Memory table use case with huge data
我有 SQL 服务器 table 有 160 多万条记录,这些记录有来自 UI 的连续 CRUD 操作、批处理作业等,基本上来自多个来源
目前我已经在列上对 table 进行了分区,以便在 table 上获得更好的性能。
我遇到了 In-Memory tables,它可以在 tables 频繁更新的情况下使用,而且如果从多个来源发生更新,它不会加锁,而是它将维护行版本控制,因此并发更新最好使用这种方法。
那么在这种情况下我有什么选择?
分区 table 或 在内存中创建 table
正如我所读,SQL 当 table 被分区时,服务器不支持 In-Memory table。
在这种情况下,内存中 table 或分区 table 哪个更好。
视情况而定。
In-memory table 理论上看起来不错,但您确实需要花时间学习 details 才能正确实施。你可能会发现一些细节令人不安。例如:
- in-memory table 中没有 parallel inserts,这使得与传统 table 中存储在 SSD
中的并行插入相比,行的创建速度更慢
- not all index operations dis-based 索引支持 in-memory table 索引
- 并非所有数据类型都是 supported
- 两个都不支持features and T-SQL constructs
- 你可能需要more RAM然后你认为
如果您准备好为使用 Hekaton 付出代价,您可以从阅读它开始 white-paper。
分区本身带有 benefits 但不能保证它会修复您的系统。只有特定的查询和 case-scenarios 可以从中受益。例如,如果您 99% 的工作负载都在接触一个分区中的数据,您可能根本看不到任何优化。另一方面,如果您的报告是基于历史数据并且您的 inserts/updates/deletes 触及另一个分区会更好。
这两个技术都不错,但需要细细考察,慎用。通常,人们认为使用一些新技术可以解决他们的问题,而实际上只要应用一些基本概念就可以解决问题。
例如,您说您正在对 160 多万条记录执行 CRUD。问问自己:
- 是我的 table 规范化的 - 当数据以规范化的方式存储时你得到两件事 - 首先,你将只对部分数据执行 CRUD,引擎可能只读取需要的数据特定查询(无需支持索引)
- 我的 T-SQL 语句写得好吗 - row by agonizing row、在循环中调用存储过程或不批量处理数据是慢查询的常见来源
- which are the blocking and deadlocked queries - for example, there is a possibility one long running query to block all your inserts - identify these types of issues first and try to resolve them with data pre-calculation (indexed view) 或创建覆盖索引(也可以使用包含列进行过滤)
- 读取器和写入器是否被阻止 - 您可以尝试不同的隔离级别来解决此类问题 - RCSI 是 Azure 默认隔离级别。您可能需要向您的 TempDB 使用的 RAMDISK 添加更多 RAM,但由于您正在查看 Hekaton,与它(或分区)相比,这将更容易测试(和回滚)
我有 SQL 服务器 table 有 160 多万条记录,这些记录有来自 UI 的连续 CRUD 操作、批处理作业等,基本上来自多个来源
目前我已经在列上对 table 进行了分区,以便在 table 上获得更好的性能。
我遇到了 In-Memory tables,它可以在 tables 频繁更新的情况下使用,而且如果从多个来源发生更新,它不会加锁,而是它将维护行版本控制,因此并发更新最好使用这种方法。
那么在这种情况下我有什么选择?
分区 table 或 在内存中创建 table
正如我所读,SQL 当 table 被分区时,服务器不支持 In-Memory table。
在这种情况下,内存中 table 或分区 table 哪个更好。
视情况而定。
In-memory table 理论上看起来不错,但您确实需要花时间学习 details 才能正确实施。你可能会发现一些细节令人不安。例如:
- in-memory table 中没有 parallel inserts,这使得与传统 table 中存储在 SSD 中的并行插入相比,行的创建速度更慢
- not all index operations dis-based 索引支持 in-memory table 索引
- 并非所有数据类型都是 supported
- 两个都不支持features and T-SQL constructs
- 你可能需要more RAM然后你认为
如果您准备好为使用 Hekaton 付出代价,您可以从阅读它开始 white-paper。
分区本身带有 benefits 但不能保证它会修复您的系统。只有特定的查询和 case-scenarios 可以从中受益。例如,如果您 99% 的工作负载都在接触一个分区中的数据,您可能根本看不到任何优化。另一方面,如果您的报告是基于历史数据并且您的 inserts/updates/deletes 触及另一个分区会更好。
这两个技术都不错,但需要细细考察,慎用。通常,人们认为使用一些新技术可以解决他们的问题,而实际上只要应用一些基本概念就可以解决问题。
例如,您说您正在对 160 多万条记录执行 CRUD。问问自己:
- 是我的 table 规范化的 - 当数据以规范化的方式存储时你得到两件事 - 首先,你将只对部分数据执行 CRUD,引擎可能只读取需要的数据特定查询(无需支持索引)
- 我的 T-SQL 语句写得好吗 - row by agonizing row、在循环中调用存储过程或不批量处理数据是慢查询的常见来源
- which are the blocking and deadlocked queries - for example, there is a possibility one long running query to block all your inserts - identify these types of issues first and try to resolve them with data pre-calculation (indexed view) 或创建覆盖索引(也可以使用包含列进行过滤)
- 读取器和写入器是否被阻止 - 您可以尝试不同的隔离级别来解决此类问题 - RCSI 是 Azure 默认隔离级别。您可能需要向您的 TempDB 使用的 RAMDISK 添加更多 RAM,但由于您正在查看 Hekaton,与它(或分区)相比,这将更容易测试(和回滚)