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将执行指定命令的标准执行。