#
第一章 SQL性能优化简介 InterSystems SQL支持几个特性来优化InterSystems IRIS®数据平台的SQL性能。 # 表定义优化 SQL性能从根本上取决于良好的数据架构。 将数据划分为多个表并在这些表之间建立关系对于高效的SQL是必不可少的。 描述了以下优化表定义的操作。 这些操作要求定义表,但不要求用数据填充表: - 数据存储策略:可以选择使用`%Storage.Persistent`、`%Storage.SQL`或自定义存储来存储数据。 - 全局变量命名策略:可以使用`USEEXTENTSET`参数为数据和索引查找操作指定更短、更高效的散列全局名称。 - 索引:可以为一个表字段或一组字段定义索引。可以定义几种不同类型的索引:标准索引、位图索引、位图索引和位图范围索引。SQL优化使用定义的索引而不是数据值本身来访问查询、更新或删除操作的特定记录。 # 表数据优化 根据对表中典型数据的分析,可以执行以下操作来优化表访问: - Tune Table:检查典型的表数据并生成`ExtentSize`(行数)、选择性(具有特定值的行的百分比)和`BlockCount`元数据。查询优化器使用此信息来确定最有效的查询执行计划。 - 选择性和异常值选择性:确定某个字段具有特定值的行的百分比,以及某个值是否为异常值,该值明显比该字段的其他值更常见。 # 查询优化 **在几乎所有情况下,用嵌入式SQL编写的查询的执行速度都比用动态SQL编写的查询快。还要注意,由于存在缓存查询,对于嵌入式SQL和动态SQL,重新执行查询的速度都比初始执行快得多。** 可以执行以下操作来优化特定查询的执行。这些查询优化使用现有的表定义和表数据优化: - 运行时统计:用于衡量系统上查询执行的性能。 - 显示计划显示查询的执行计划。 - 缓存查询和文字替换:维护最近动态查询的缓存,允许重新执行查询,而不会重复准备查询的开销。 - SQL语句和冻结计划允许保留查询执行计划,从而允许在不降低现有查询性能的情况下更改表。 - 索引配置和使用:用于指定如何使用现有索引。 - 索引优化提示:`%ALLINDEX`、`%IGNOREINDEX` - 联接优化提示:`%FIRSTTABLE`、`%FULL`、`%INORDER`、`%STARTTABLE` - 子查询优化提示:`%NOFLATTEN`、`%NOMERGE`、`%NOREDUCE`、`%NOSVSO` - 并行查询执行:`%Parallel` - 联合优化: `UNION %PARALLEL`, `UNION/OR` 还可以通过使用数据分片来提高对大型数据库表的查询性能。 # 配置优化 默认情况下,内存和启动设置默认为自动配置,每个进程的最大内存默认为262144 kb。要优化在生产系统上运行的SQL,应该将默认值更改为手动配置,并增加每进程的最大内存设置。 # 分片 分片是跨多个系统对数据及其关联缓存进行分区。分片集群跨多个InterSystems IRIS实例(称为碎片数据服务器)水平(即按行)对大型数据库表进行分区,同时允许应用程序通过单个实例(称为碎片主数据服务器)透明地访问这些表。 必须将表定义为分片。分片表只能在分片环境中使用;非分片表可以在分片或非分片环境中使用。并不是所有的表都适合进行分片。分片环境中的最佳性能通常是通过组合使用分片表(通常非常大的表)和非分片表来实现的 # 快速命令 InterSystems SQL支持快速选择、快速插入和快速截断表。“快速”意味着这些SQL命令的标准调用是使用高效的内部代码执行的。这些快速操作“就是工作”;没有使用特殊语法,也没有提供优化选项。 通过ODBC或JDBC的`SELECT`查询支持快速选择。JDBC上的插入操作支持快速插入。对于不涉及参照完整性的截断表操作,支持快速截断表。 并不是所有的表都支持快速操作,也不是所有的命令语法都可以使用快速执行来执行。InterSystems SQL在可能的情况下执行快速执行;如果无法执行快速执行,InterSystems SQL将执行指定命令的标准执行。