第七章 解释SQL查询计划

第七章 解释SQL查询计划

本章介绍由ShowPlan生成的InterSystems SQL查询访问计划中使用的语言和术语。

存储在映射中的表

SQL表存储为一组映射。
每个表都有一个包含表中所有数据的主映射;
表还可以有其他的映射,如索引映射和位图。
每个映射可以被描绘成一个多维全局,其中一些字段的数据在一个或多个下标中,其余字段存储在节点值中。
下标控制要访问的数据。

  • 对于主映射,RowIDIDKEY字段通常用作映射下标。
  • 对于索引映射,通常将其他字段用作前导下标,将RowID/IDKEY字段用作附加的较低级别的下标。
  • 对于位图,可以将位图层视为附加的RowID下标级别。但是,位图只能用于为正整数的RowID

发展计划

编译SQL查询会生成一组指令来访问和返回查询指定的数据。
这些指令表示为. int例程中的ObjectScript代码。

指令及其执行顺序受到SQL编译器中有关查询中涉及的表的结构和内容的数据的影响。
编译器尝试使用表大小和可用索引等信息,以使指令集尽可能高效。

查询访问计划(ShowPlan)是对结果指令集的可读翻译。
查询的作者可以使用这个查询访问计划来查看将如何访问数据。
虽然SQL编译器试图最有效地利用查询指定的数据,但有时查询的作者对存储的数据的某些方面的了解要比编译器清楚得多。
在这种情况下,作者可以利用查询计划修改原始查询,为查询编译器提供更多的信息或更多的指导。

阅读计划

“ShowPlan”的结果是一系列关于访问和显示查询中指定的数据的处理的语句。
下面提供了关于如何解释ShowPlan语句的信息。

访问映射

一个查询计划可以访问多个表。
当访问一个表时,计划可以访问单个映射(索引或主映射)、两个映射(索引映射后面跟着主映射),或者,对于多索引计划,可以访问多个映射。

在通过映射访问数据时,计划指示使用的下标。
它还指示实际的下标值是什么:一个给定值、一组给定值、一个值范围,或该下标在表中显示的所有值。
选择哪一个取决于查询中指定的条件。
显然,访问单个或几个下标值要比访问该下标级别上的所有值快得多。

条件和表达式

当查询运行时,将测试查询指定的各种条件。
除了前面提到的某些限制下标的条件外,ShowPlan输出没有显式地指示条件的测试。
尽早测试条件总是最好的。
测试各种条件的最佳地点可以从计划细节中推断出来。

类似地,ShowPlan不详细描述表达式和子表达式的计算。
除了简单之外,主要原因是在大多数数据库环境中,表和索引访问构成了处理的更重要方面;
检索表数据的成本占总体查询成本的主要地位,因为磁盘访问速度仍然比CPU处理慢几个数量级。

循环

当访问一个表中的数据时,经常需要迭代地检查多个行。
这样的访问是通过一个循环来指示的。
每一次传递要执行的指令称为循环体。
它们可以通过缩进直观地显示出来。
涉及多个表的数据库访问通常需要循环中的循环。
在这种情况下,每个循环级别都通过与前一个级别相比的进一步缩进表示。

临时文件

定义

查询计划还可能指示需要构建和使用中间临时文件(TEMP-FILE)。这是本地数组中的“临时”区域。它用于保存临时结果以用于各种目的,如排序。就像映射一样,临时文件有一个或多个下标,可能还有节点数据。

使用

一些临时文件包含处理单个表的数据。在这种情况下,可以将构建临时文件视为对该表中的数据进行预处理。在读取这样的临时文件之后,可以访问源表的主映射,也可以不访问源表的主映射。在其他情况下,临时文件可能包含处理多个表的结果。在其他情况下,临时文件用于存储分组的聚合值、检查DISTINCT等。

模块

临时文件的构建,以及其他处理,可以委托给一个称为模块的独立工作单元。
每个模块都被命名。
当列出单独的模块时,该计划将指明调用每个模块的位置。
当模块执行结束时,处理将在模块调用之后的下一条语句中继续进行。

发送给处理的查询

对于通过ODBC或JDBC网关连接链接的外部表,该计划显示发送到远程SQL gateway connection的查询文本,以从远程表检索所请求的数据。

对于并行查询处理和分片,该计划显示发送到并行处理或在分片上处理的各种查询。
还将显示用于每个查询的计划。

子查询、连接和联合

给定查询中的一些子查询(和视图)也可以单独处理。
它们的计划在单独的子查询部分中指定。
在计划中没有指明子查询部分被调用的精确位置。
这是因为它们经常作为条件或表达式处理的一部分被调用。

对于指定OUTER JOIN的查询,如果没有找到匹配的行,该计划可能指示可能生成的null行,以满足外部连接语义的要求。

对于UNION,该计划可能指示将来自不同UNION子查询的结果行组合到一个单独的模块中,在该模块中可以对这些结果行进行进一步处理。

计划分析

在分析给定查询的计划时,应用程序开发人员有时可能会觉得不同的计划会更有效率。
应用程序开发人员有多种方法来影响计划。

首先,计划将受到在包含实际应用程序数据的环境中正确运行调优表的影响。
在类源定义中手动定义一些Tune Table通常计算的值——例如表EXTENTSIZE、字段SELECTIVITY和映射BlockCount——也可以用于实现所需的计划。

此外,分析计划可能表明对类定义的某些更改可能导致更有效的计划,例如:

添加一个索引

在某些情况下(尽管不总是),使用一个临时文件进行预处理可能意味着向原始表添加一个与临时文件具有相同或类似结构的索引将消除构建临时文件的需要。
从查询计划中删除这个处理步骤显然可以使查询运行得更快,但这必须与更新表时维护索引所需的工作量进行平衡。

添加字段到索引数据

当计划显示正在使用的索引,然后是对主映射的访问时,这意味着将查询中使用的主映射字段添加到索引节点数据可能会为该查询生成更快的计划。
同样,这必须与额外的更新时间以及添加到处理使用该索引的其他查询的额外时间进行平衡,因为索引会更大,因此需要更多的读取时间。

添加连接索引

当计划显示以特定顺序连接两个表时(例如,首先检索t1,然后使用连接条件t1.a=t2.b连接到t2),可能相反的表顺序会产生一个更快的计划。例如,如果t2有额外的条件,可以显著限制符合条件的行数。
在这种情况下,在t1上添加一个t1索引。
a将允许这样一个连接顺序。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容