Skip to content

Commit 6445b52

Browse files
committed
Update storage.sgml
校对63.2、63.3、63.4和63.5
1 parent d72ab9b commit 6445b52

File tree

1 file changed

+71
-82
lines changed

1 file changed

+71
-82
lines changed

postgresql/doc/src/sgml/storage.sgml

Lines changed: 71 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ Oversized-Attribute Storage Technique).
465465
</para>
466466
-->
467467
<para>
468-
本节提供一个<acronym>TOAST</>的概述。(超大字段存储技术)
468+
本节对<acronym>TOAST</>进行介绍。(超大字段存储技术)
469469
</para>
470470

471471
<!--
@@ -481,10 +481,10 @@ known as <acronym>TOAST</> (or <quote>the best thing since sliced bread</>).
481481
-->
482482
<para>
483483
因为<productname>PostgreSQL</productname>的页面大小是固定的(通常是8Kb),
484-
并且不允许行跨越多个页面,因此不可能直接存储非常大的字段值。
485-
为了突破这个限制,大的字段值被压缩和/或打碎成多个物理行
486-
这些事情对用户都是透明的,只是在后端代码上有一些小的影响
487-
这个技术称为<acronym>TOAST</>。(<quote>切片面包之后最好的东西</>))
484+
并且不允许元组跨越多个页面,因此不可能直接存储非常大的字段值。
485+
为了突破这个限制,大的字段值被压缩和/或分割为多个物理行
486+
这些事情对用户都是透明的,只对多数后端代码有少许影响
487+
该技术被称之为<acronym>TOAST</>(或者<quote>切片面包之后最好的东西</>))
488488
</para>
489489

490490
<!--
@@ -503,12 +503,12 @@ value, but in some cases more efficient approaches are possible.)
503503
-->
504504
<para>
505505
只有一部分数据类型支持<acronym>TOAST</> &mdash;(没必要在那些不可能生成大的字段值
506-
的数据类型强制这种额外开销)。要支持<acronym>TOAST</>,数据类型必须有变长
507-
(<firstterm>varlena</>)表现形式,这个时候,任何存储的数值的头
508-
32 位都是存储着以字节记的数值的总长度(包括长度本身)。
509-
<acronym>TOAST</>并不约束剩下的表现形式。所有支持<acronym>TOAST</>的数据类型之
510-
C级别的函数都必须仔细处理<acronym>TOAST</>的输入值。
511-
也就是通常是在对一个输入值做任何事情之前调用<function>PG_DETOAST_DATUM</>;
506+
的数据类型强制添加这种额外开销)。要支持<acronym>TOAST</>,数据类型必须有变长
507+
(<firstterm>varlena</>)表现形式,这个时候,存储的任何数据的头
508+
32 位都存储着以字节计的数据的总长度(包括长度本身)。
509+
<acronym>TOAST</>并不影响数据类型其余部分的表现形式。所有支持<acronym>TOAST</>数据类型的
510+
C级别函数都必须仔细处理<acronym>TOAST</>的输入值。
511+
也就是通常在对一个输入值做任何事情之前调用<function>PG_DETOAST_DATUM</>;
512512
但是在某些情况下也存在更高效的方法。
513513
</para>
514514

@@ -538,19 +538,19 @@ the content of the TOAST pointer tells that, instead.
538538
</para>
539539
-->
540540
<para>
541-
<acronym>TOAST</>占用变长的长度字的两位(在大型机器上高位序,在小型机器上低位序),
541+
<acronym>TOAST</>占用变长的长度字的两位(在大端(big-endian)机器上是高位序,在小端(little-endian)机器上是低位序),
542542
因此限制<acronym>TOAST</>数据类型任何值的逻辑大小为1 GB(2<superscript>30</> - 1字节)。
543543
当两位都是零时,该值是一个普通的非<acronym>TOAST</>数据类型的值,
544-
长度字的剩下位给总数据大小以字节计(包括长度字)。当设置最高或最低位
545-
该值仅有一个字节头替代通常的4字节头,而剩余的位给总数据大小以字节计(包括长度字)。
544+
长度字的剩余位给出以字节计的总数据大小(包括长度字)。当最高位或最低位被设置时
545+
该值仅有一个一字节长度的头而非通常的4字节的头,剩余的位给出以字节计的总数据大小(包括长度字)。
546546
作为一个特殊的情况下,如果剩余位都是零(其将不可能包含自身的长度),
547547
该值为一个指向存储在TOAST表的行外数据。
548-
一个TOAST指针的大小是给定的在第二个字节的数据。)
549-
单字节头的值没有对齐任何特定的边界。最后当清除最高或最低位时
550-
但是设置了临近的位,压缩了数据内容,在使用前必须解压缩
551-
在这种情况下长度字剩余位给压缩数据的总大小,而不是原数据的
548+
TOAST指针的大小在数据的第二个字节给出。)
549+
单字节头的值没有对齐任何特定的边界。最后,当最高或最低位被清除
550+
其临近位被设置时,数据内容已经被压缩,在使用前必须先行解压
551+
在这种情况下,长度字剩余位给出的是压缩数据的总大小,而非原始数据的大小
552552
请注意压缩也可能是行外数据,
553-
但是变长的头不会告诉这是否发生&mdash;反而TOAST指针的内容告诉这些
553+
但是变长的头不会告诉我们这是否发生&mdash;而是由TOAST指针的内容告诉我们的
554554
</para>
555555

556556
<!--
@@ -564,7 +564,7 @@ described in more detail below.
564564
-->
565565
<para>
566566
如果一个表中有任何一个字段是可以<acronym>TOAST</>的,
567-
那么该表将有一个关联的<acronym>TOAST</>表,其OID存储在表的<structname>pg_class</>.<structfield>reltoastrelid</>记录里
567+
那么该表将有一个关联的<acronym>TOAST</>表,其OID存储在表的<structname>pg_class</>.<structfield>reltoastrelid</>字段中
568568
行外<acronym>TOAST</>过的数值保存在<acronym>TOAST</>表里,下面有更详细的描述。
569569
</para>
570570

@@ -603,16 +603,16 @@ regardless of the actual size of the represented value.
603603
</para>
604604
-->
605605
<para>
606-
将外数据分割成(如果压缩过,在压缩之后)最多<symbol>TOAST_MAX_CHUNK_SIZE</>
607-
(缺省选择这个值,2000字节,使4块行将适合一内存页,约2000个字节)字节
608-
每个块都作为独立的行 在<acronym>TOAST</>表里为所属表存储
606+
将行外数据分割成(如果压缩过,在压缩之后)最多<symbol>TOAST_MAX_CHUNK_SIZE</>
607+
(缺省选择这个值,2000字节,使4块行将适合一内存页,约2000个字节)字节的块
608+
每个块都作为独立的行在所属表的<acronym>TOAST</>表中存储
609609
每个<acronym>TOAST</>表都有<structfield>chunk_id</>字段(一个表示特定<acronym>TOAST</>值的OID)、
610-
<structfield>chunk_seq</>(一个序列号,存储该块在数值中的位置)、<structfield>chunk_data</>(该块实际的数据)。
611-
在<structfield>chunk_id</>和<structfield>chunk_seq</>上有一个唯一索引,提供对数值的快速检索
610+
<structfield>chunk_seq</>(一个序列号,存储该块在数据中的位置)、<structfield>chunk_data</>(该块实际的数据)。
611+
在<structfield>chunk_id</>和<structfield>chunk_seq</>上有一个唯一索引,提供对数据的快速检索
612612
因此,一个表示行外<acronym>TOAST</>值的指针数据需要存储要查阅的<acronym>TOAST</>的OID
613-
和特定数值的OID(它的<structfield>chunk_id</>)。为了方便,指针数据还存储逻辑数据的尺寸
613+
和特定数据的OID(它的<structfield>chunk_id</>)。为方便考虑,指针数据还存储逻辑数据的尺寸
614614
(原始的未压缩的数据长度)以及实际存储的尺寸 (如果使用了压缩,则两者不同)。
615-
加上头部的长度字,一个<acronym>TOAST</>指针数据的总尺寸是18字节
615+
加上头部的长度字,一个<acronym>TOAST</>指针数据的总大小是18字节
616616
不管它代表的数值的实际长度是多大。
617617
</para>
618618

@@ -631,24 +631,21 @@ none of the out-of-line values change.
631631
</para>
632632
-->
633633
<para>
634-
<acronym>TOAST</>代码只有在准备向某表中存储超过<symbol>TOAST_TUPLE_THRESHOLD</>
635-
字节(通常是2KB)的行的时候才会触发
634+
<acronym>TOAST</>代码只有在表中一行存储的数据超过<symbol>TOAST_TUPLE_THRESHOLD</>
635+
字节(通常是2KB)时才会触发
636636
<acronym>TOAST</>代码将压缩和/或行外存储字段值,
637-
直到数值比<symbol>TOAST_TUPLE_TARGET</>字节(通常是2KB)
638-
或者无法得到更好的结果的时候才停止
637+
直到数据少于<symbol>TOAST_TUPLE_TARGET</>字节(通常是2KB),
638+
或者无法得到更好的结果时才停止
639639
在一个UPDATE操作过程中,未改变的字段值通常原样保存;
640-
所以,如果UPDATE一个带有行外数据的行时,如果行外数据值没有变化
640+
所以,如果UPDATE一个带有行外数据的行时,如果行外数据没有变化
641641
那么将不会有<acronym>TOAST</>开销存在。
642642
</para>
643-
644-
645643
<para>
646644
<!--
647645
The <acronym>TOAST</> code recognizes four different strategies for storing
648646
<acronym>TOAST</>-able columns:
649647
-->
650648
<acronym>TOAST</>代码识别四种不同的存储<acronym>TOAST</>字段的策略:
651-
652649
<itemizedlist>
653650
<listitem>
654651
<para>
@@ -659,8 +656,8 @@ The <acronym>TOAST</> code recognizes four different strategies for storing
659656
This is the only possible strategy for
660657
columns of non-<acronym>TOAST</>-able data types.
661658
-->
662-
<literal>PLAIN</literal>避免压缩或者行外的存储;此外,它禁止使用单字节的头变长类型
663-
这只是对那些不能<acronym>TOAST</>的数据类型才有可能
659+
<literal>PLAIN</literal>避免压缩或者行外存储;此外,它禁止为变长类型使用单字节的头
660+
这只对那些不能<acronym>TOAST</>的数据类型的列才有可能
664661
</para>
665662
</listitem>
666663
<listitem>
@@ -674,8 +671,8 @@ The <acronym>TOAST</> code recognizes four different strategies for storing
674671
-->
675672
<para>
676673
<literal>EXTENDED</literal>允许压缩和行外存储。
677-
这是大多数<acronym>TOAST</>的数据类型的缺省。首先将企图进行压缩
678-
如果行仍然太大,那么则进行行外存储
674+
这是大多数<acronym>TOAST</>数据类型的缺省策略。首先会尝试对数据进行压缩
675+
如果行仍然太大,则进行行外存储
679676
</para>
680677
</listitem>
681678
<listitem>
@@ -691,9 +688,8 @@ The <acronym>TOAST</> code recognizes four different strategies for storing
691688
-->
692689
<para>
693690
<literal>EXTERNAL</literal>允许行外存储,但是不许压缩。
694-
使用<literal>EXTERNAL</literal>,将令那些在<type>text</type>和<type>bytea</type>字段上的子字符串操作更快
695-
(代价是增加了存储空间),因为这些操作是经过优化的:如果行外数据没有压缩,
696-
那么它们只会去抓取需要的部分。
691+
使用<literal>EXTERNAL</literal>,将使那些数据类型为<type>text</type>和<type>bytea</type>的字段上的子字符串操作更快
692+
(代价是增加了存储空间),因为这些操作是经过优化的:如果行外数据没有压缩,那么它们只会获取需要的部分。
697693
</para>
698694
</listitem>
699695
<listitem>
@@ -708,7 +704,7 @@ The <acronym>TOAST</> code recognizes four different strategies for storing
708704
<para>
709705
<literal>MAIN</literal>允许压缩,但不允许行外存储。
710706
实际上,在这样的字段上仍然会进行行外存储,
711-
但只是作为没有办法把数据行变得更小的情况下使之足以容纳一个页面的最后的手段
707+
但只是作为没有办法把数据行变得更小以使之足以放置在一个页面中的最后选择
712708
</para>
713709
</listitem>
714710
</itemizedlist>
@@ -717,8 +713,8 @@ Each <acronym>TOAST</>-able data type specifies a default strategy for columns
717713
of that data type, but the strategy for a given table column can be altered
718714
with <command>ALTER TABLE SET STORAGE</>.
719715
-->
720-
每个<acronym>TOAST</>的数据类型都为该数据类型的字段指定一个缺省策略
721-
但是特定表的字段的存储策略可以用<command>ALTER TABLE SET STORAGE</>修改
716+
每个<acronym>TOAST</>的数据类型都为该数据类型所在的字段指定一个缺省策略
717+
但是特定表的字段的存储策略可以用<command>ALTER TABLE SET STORAGE</>命令进行修改
722718
</para>
723719

724720
<!--
@@ -740,16 +736,15 @@ comparison table, in which all the HTML pages were cut down to 7 kB to fit.
740736
</para>
741737
-->
742738
<para>
743-
这个方法比那些更直接的方法,比如允许行值直接跨越多个页面
739+
这个方法比那些更直接的方法,比如允许行中的数据直接跨越多个页面
744740
有更多优点。假设查询通常是用相对比较短的键值进行匹配的,
745741
那么大多数执行器的工作都将使用主行记录完成。<acronym>TOAST</>属性的大值,
746742
只是在把结果集发送给客户端的时候才抽出来(如果选择了它的话)。因此,
747743
主表要小得多,并且它的大部分行都存储在共享缓冲区里,因此就可以不需要任何行外存储。
748-
排序集也缩小了,并且排序将更多地在内存里完成。一个小测试表明,
744+
排序集也缩小了,并且排序将更多地完全在内存中完成。一个小测试表明,
749745
一个用于保存HTML页面以及它们的URL的表,包括<acronym>TOAST</>表在内,
750746
存储将近一半大小的裸数据,而主表只包含全部数据的10%(URL和一些小的HTML页面)。
751-
与在一个非<acronym>TOAST</>的对比表里面存储(把全部HTML页面裁剪成7KB以匹配页面大小),
752-
没有任何运行时的区别。
747+
与一个没有使用<acronym>TOAST</>的表(把全部HTML页面裁剪成7KB以匹配页面大小)进行对比,没有任何运行时的区别。
753748
</para>
754749

755750
</sect1>
@@ -777,12 +772,12 @@ if the filenode of a relation is 12345, the FSM is stored in a file called
777772
-->
778773
<para>
779774
每个堆和索引关系,除了哈希索引,
780-
有个自由空间映射(FSM) 来保持跟踪关系中可用的空间
781-
将同时在独立的关系叉文件存储主关系数据
782-
以关系的filenode 编号命名,加上一个<literal>_fsm</>后缀
775+
都有一个空闲空间映射(FSM) 来跟踪关系中的可用空间
776+
FSM文件与关系的主数据文件放置在一起,有一个单独的分支与之对应
777+
以关系的filenode 值,加一个<literal>_fsm</>后缀来命名
783778
例如,如果一个关系的filenode是12345,
784-
存储FSM在一个叫<filename>12345_fsm</>的文件里
785-
在与主关系文件相同目录里
779+
其FSM将存储在一个名为<filename>12345_fsm</>的文件中
780+
与主关系文件在相同的目录中
786781
</para>
787782

788783
<!--
@@ -794,10 +789,10 @@ levels aggregate information from the lower levels.
794789
</para>
795790
-->
796791
<para>
797-
自由空间映射组织为一个<acronym>FSM</>页树。
798-
<acronym>FSM</>页底层存储每个堆(或索引)页上可用的自由空间
799-
使用一个字节来代表每一个如页
800-
高级别的从低级别聚合信息
792+
空闲空间映射被组织为一个<acronym>FSM</>页树。
793+
底层的<acronym>FSM</>页存储每个堆(或索引)页上可用的空闲空间
794+
使用一个字节来表示
795+
高层的页从底层的页中聚合信息
801796
</para>
802797

803798
<!--
@@ -810,10 +805,10 @@ at the root.
810805
</para>
811806
-->
812807
<para>
813-
每个<acronym>FSM</>页是一个二叉树,存储在一个数组
814-
每个节点一个字节。每个叶节点代表一个堆页,或低级别的<acronym>FSM</>页。
815-
在每个非叶节点,存储其子节点值的高级别的值
816-
因此在根节点存储叶节点的最大值
808+
每个<acronym>FSM</>页是一个二叉树,存储在一个数组中
809+
数组中每个节点对应一个字节。每个叶节点代表一个堆页,或低级别的<acronym>FSM</>页。
810+
在每个非叶节点中,存储其所有孩子中最大的值
811+
因此叶节点中最大的值存储在根节点中
817812
</para>
818813

819814
<!--
@@ -825,8 +820,8 @@ can be used to examine the information stored in free space maps.
825820
</para>
826821
-->
827822
<para>
828-
参阅<filename>src/backend/storage/freespace/README</>关于更详细的<acronym>FSM</>是怎样的结构
829-
怎样更新和搜索它。<xref linkend="pgfreespacemap">模块可以用来审查存储在自由空间映射的信息
823+
参阅<filename>src/backend/storage/freespace/README</>了解<acronym>FSM</>结构的详细信息
824+
以及更新和搜索策略。<xref linkend="pgfreespacemap">模块可以用来检测存储在空闲空间映射中的信息
830825
</para>
831826

832827
</sect1>
@@ -855,11 +850,8 @@ Note that indexes do not have VMs.
855850
</para>
856851
-->
857852
<para>
858-
每个堆关系有个可见映射(VM)来保持跟踪那些包含行的页,
859-
对于所有活动的事务可见。同时在独立的关系叉文件存储主关系数据,
860-
以关系的filenode号,加上一个<literal>_vm</>后缀命名。例如,
861-
如果一个关系的filenode是12345,存储VM在一个叫<filename>12345_vm</>文件里,
862-
与主关系文件在同一目录。请注意索引没有VM。
853+
每个堆关系有一个可见映射(VM),用于跟踪哪些页包含对所有活动事务均可见的元组。可见映射文件与关系的主数据文件放置在一起,有一个独立的分支文件与之对应,以关系的filenode值加上一个<literal>_vm</>后缀命名。例如,
854+
如果一个关系的filenode是12345,VM存储在一个叫<filename>12345_vm</>的文件中,与主关系文件在同一目录。请注意索引没有VM。
863855
</para>
864856

865857
<!--
@@ -872,10 +864,10 @@ queries using only the index tuple.
872864
</para>
873865
-->
874866
<para>
875-
可见映射在简单的在每个堆页存储1位
876-
一个设置位意味着在页上所有的行对于所有事务可见的
877-
这意味着不包含任何行的页,需要清理;使用<firstterm>index-only scans</>
878-
回答仅仅使用索引元的查询也可以使用这些信息
867+
可见映射简单地为每个堆页存储1个比特位
868+
如果该位被设置,则意味着该页上所有的元组对于所有事务都是可见的
869+
这意味着该页不包含任何需要清理的行。使用<firstterm>index-only扫描</>
870+
时,可以在只使用索引元组的情况下使用这些信息对查询做出回复
879871
</para>
880872

881873
<!--
@@ -887,9 +879,8 @@ cleared by any data-modifying operations on a page.
887879
</para>
888880
-->
889881
<para>
890-
这个意义上的映射是保守的,我们要确定每当设置位,
891-
我们知道条件是真,但是如果没有设置位,它可能是真,也可能不是真。
892-
通过清理设置可见映射位,但是通过页上的任何数据修改操作进行清理。
882+
这个意义上的映射是保守的,我们确信无论何时只要位被设置,则条件为真,但如果该位没有被设置,则条件有可能是真,也可能不是真。
883+
可见映射位只能通过清理(vacuum)来设置,但页面上的任何数据修改均可以将该位清空。
893884
</para>
894885

895886
</sect1>
@@ -915,9 +906,9 @@ erased (they will be recreated automatically as needed).
915906
</para>
916907
-->
917908
<para>
918-
每个未记录的表,以及未记录表的每一个索引,有一个初始化
919-
分支。初始化分支是一个空表或相应类型的索引。当一个未记录的表由于崩溃必须重置为空
920-
初始化分支被拷贝给主分支,并且擦除任何其他的分支(根据需要他们会自动重建)。
909+
每个不记录日志的表,以及不记录日志的表上的每一个索引,都有一个初始化
910+
分支。初始化分支是一个空表或相应类型的索引。当一个不记录日志的表由于崩溃必须重置为空时
911+
初始化分支被拷贝为主分支,并且擦除任何其他的分支(它们会根据需要自动重建)。
921912
</para>
922913

923914
</sect1>
@@ -926,9 +917,7 @@ erased (they will be recreated automatically as needed).
926917
<!--
927918
<title>Database Page Layout</title>
928919
-->
929-
<title>数据库分页文件</title>
930-
931-
920+
<title>数据库页布局</title>
932921
<para>
933922
<!--
934923
This section provides an overview of the page format used within

0 commit comments

Comments
 (0)