日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

sequential_uuid(UUID生成)

sequential_uuid插件可以生成兩個(gè)具有順序模式的UUID生成器,可以幫助您減少完全隨機(jī)的UUID生成器所帶來(lái)的隨機(jī)I/O問(wèn)題。

前提條件

支持的PolarDB PostgreSQL版的版本如下:

  • PostgreSQL 14(內(nèi)核小版本14.5.1.0及以上)

  • PostgreSQL 11(內(nèi)核小版本1.1.28及以上)

說(shuō)明

您可通過(guò)如下語(yǔ)句查看PolarDB PostgreSQL版的內(nèi)核小版本號(hào):

  • PostgreSQL 14

    SELECT version();
  • PostgreSQL 11

    SHOW polar_version;

背景信息

常規(guī)的隨機(jī)UUID生成器將在給定的范圍內(nèi)均勻取值,這意味著向索引插入數(shù)據(jù)時(shí),其局部性較差,所有索引葉所在的頁(yè)都有同樣的概率被命中,從而導(dǎo)致整個(gè)索引會(huì)被強(qiáng)制放入內(nèi)存中。當(dāng)使用小索引不會(huì)存在這個(gè)問(wèn)題,但一旦索引大小超過(guò)共享緩沖區(qū)(或者RAM)大小,緩存命中率就會(huì)迅速下降。

基于序列、時(shí)間戳的UUID與隨機(jī)UUID相比,前者具有順序模式,可以使新數(shù)據(jù)幾乎總是在索引的最右側(cè)插入(新的序列值大于所有先前的值,時(shí)間戳相同),從而有利于提升緩存命中率。

說(shuō)明
  • 具有順序模式的UUID生成器增加了UUID的可預(yù)測(cè)性,且增大了發(fā)生跨機(jī)沖突的概率。

  • 更多順序UUID優(yōu)勢(shì)請(qǐng)參見Sequential UUID Generators

sequential_uuid的主要目標(biāo)是生成更具順序性的UUID生成器,且不會(huì)過(guò)多地降低隨機(jī)性(隨機(jī)性降低可能會(huì)增加碰撞的概率以及UUID的可預(yù)測(cè)性)。

生成器設(shè)計(jì)

使UUID更具順序性最簡(jiǎn)單的方法是使用一些順序值作為前綴。例如,可以采用序列或時(shí)間戳并添加隨機(jī)數(shù)據(jù),直到UUID的隨機(jī)性達(dá)到16 B。這種方法得到的UUID幾乎是完全連續(xù)的,但這種方法存在以下兩個(gè)問(wèn)題:

  • 隨機(jī)性減少:如果使用了產(chǎn)生bigint值的序列,產(chǎn)生UUID的隨機(jī)性將從16 B降低到8 B,時(shí)間戳也以類似的方式降低了隨機(jī)性,具體取決于時(shí)間戳的精度。隨機(jī)性的下降增加了碰撞概率和可預(yù)測(cè)性(比如,可以確定哪些UUID是彼此靠近生成的,甚至還可以推測(cè)出具體的時(shí)間戳)。

  • 膨脹:如果數(shù)值持續(xù)增長(zhǎng),可能會(huì)導(dǎo)致刪除歷史數(shù)據(jù)后索引膨脹,例如,日志表中對(duì)時(shí)間戳的索引。

為了解決這兩個(gè)問(wèn)題,sequential_uuid生成的UUID生成器被設(shè)計(jì)為定期回環(huán),回環(huán)將發(fā)生在生成一定數(shù)量的UUID之后,或者在一段時(shí)間之后。在這兩種情況下,UUID都是以塊為單位生成的,形式為(塊 ID; 隨機(jī)數(shù)據(jù))。塊ID的大小取決于塊的數(shù)量,并且是固定的(取決于生成器參數(shù))。例如,對(duì)于默認(rèn)值64 KB的塊數(shù)量,需要使用2個(gè)字節(jié)來(lái)存儲(chǔ)塊ID。塊ID定期增加,最終會(huì)發(fā)生回環(huán)。

  • 基于序列的UUID生成器可以使用帶有256個(gè)UUID的塊,計(jì)算兩字節(jié)塊ID:

    (nextval('s') / 256) % 65536
    說(shuō)明
    • 生成器每生成16 M(256*65536)個(gè)UUID會(huì)回環(huán)一次。

    • 塊大小由生成的UUID的數(shù)量決定。

  • 基于時(shí)間戳的UUID生成器默認(rèn)的塊數(shù)量是64 KB(與基于序列的生成器相同),計(jì)算塊ID:

    (timestamp / 60) % 65536
    說(shuō)明
    • 生成器約45天回環(huán)一次。

    • 塊大小被定義為間隔長(zhǎng)度,默認(rèn)值為60秒。

UUID生成函數(shù)

sequential_uuid提供了兩個(gè)生成具有順序模式的UUID生成器的函數(shù)。一個(gè)使用序列,一個(gè)使用時(shí)間戳。

  • 函數(shù)uuid_sequence_nextval接收如下參數(shù):

    • 一個(gè)regclass類型的對(duì)象(序列)。

    • 一個(gè)整數(shù)類型的塊大小(默認(rèn)值65536)。

    • 一個(gè)整數(shù)類型的塊數(shù)量(默認(rèn)值65536)。

    使用序列生成具有順序模式的UUID生成器:

    CREATE EXTENSION sequential_uuids;
    CREATE SEQUENCE s;
    SELECT uuid_sequence_nextval('s'::regclass, 256, 65536);

    結(jié)果如下:

              uuid_sequence_nextval
    --------------------------------------
     00005547-8a67-452d-bdf7-b390f1edc49b
    (1 row)
  • 函數(shù)uuid_time_nextval接收如下參數(shù):

    • 一個(gè)整數(shù)類型的時(shí)間間隔(默認(rèn)值60)。

    • 一個(gè)整數(shù)類型的塊數(shù)量(默認(rèn)值65536)。

    使用時(shí)間戳生成具有順序模式的UUID生成器:

    CREATE EXTENSION sequential_uuids;
    SELECT uuid_time_nextval(1, 256);

    結(jié)果如下:

              uuid_time_nextval
    --------------------------------------
     08dac705-8776-4ce3-a45c-123fd65e11e8
    (1 row)
說(shuō)明

上述參數(shù)的默認(rèn)值適用于絕大部分場(chǎng)景。