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

實(shí)時(shí)物化視圖

本文介紹了PolarDB PostgreSQL版(兼容Oracle)的實(shí)時(shí)物化視圖功能。

背景信息

物化視圖區(qū)別于普通視圖,可以直接存儲(chǔ)查詢的結(jié)果,在復(fù)雜查詢的場(chǎng)景下,使用物化視圖保存查詢的結(jié)果可以大幅度加速查詢的效率。但物化視圖的數(shù)據(jù)不會(huì)隨著依賴表數(shù)據(jù)的變化而變化,導(dǎo)致使用物化視圖查詢的結(jié)果可能不是最新的。

對(duì)于這種情況,PolarDB推出了實(shí)時(shí)物化視圖的功能,實(shí)時(shí)物化視圖對(duì)于物化視圖具有以下優(yōu)勢(shì):

  • 實(shí)時(shí)物化視圖支持語(yǔ)句級(jí)別更新,當(dāng)依賴表進(jìn)行DML(插入/刪除/更新)操作,在DML語(yǔ)句結(jié)束時(shí),實(shí)時(shí)物化視圖會(huì)自動(dòng)更新物化視圖內(nèi)的數(shù)據(jù),讓實(shí)時(shí)物化視圖的數(shù)據(jù)始終和依賴表的數(shù)據(jù)保持一致。

  • 實(shí)時(shí)物化視圖最大限度的利用基表的增量數(shù)據(jù),刷新時(shí)無(wú)需全量執(zhí)行視圖查詢,相較于頻繁的執(zhí)行物化視圖刷新,實(shí)時(shí)物化視圖的性能更好。

  • 使用實(shí)時(shí)物化視圖可以在大幅度提升查詢性能的同時(shí),確保查詢結(jié)果和依賴表數(shù)據(jù)的一致性。

術(shù)語(yǔ)

  • 基表(Base Tables):指物化視圖定義中使用到的普通表。

  • 增量(Delta):指基表的數(shù)據(jù)發(fā)生變化時(shí),與物化視圖中的數(shù)據(jù)相比,增加和刪除的數(shù)據(jù)集合。

  • 刷新(Refresh):指物化視圖的維護(hù)操作,使得物化視圖的數(shù)據(jù)和根據(jù)視圖定義查詢當(dāng)前基表獲得的數(shù)據(jù)一致。

  • 應(yīng)用增量(Apply Delta):指對(duì)實(shí)時(shí)物化視圖插入/刪除計(jì)算出來(lái)的物化視圖增量數(shù)據(jù),以保持實(shí)時(shí)物化視圖與基表的數(shù)據(jù)一致性。

使用限制

實(shí)時(shí)物化視圖的視圖定義具有以下限制:

  • 基表必須是普通表,不能是分區(qū)表、繼承表或列存表。

  • 僅支持使用INNER JOIN,不支持其他類(lèi)型的JOIN

  • 僅支持使用IMMUTABLE的函數(shù)。

  • 僅支持包含簡(jiǎn)單的查詢、投影、DISTINCT、部分聚合函數(shù)的視圖定義;不支持帶有子查詢、[NOT] EXISTS[NOT] INLIMITHAVINGDISTINCT ONWITH(CTE)ORDER BY、窗口函數(shù)、GROUPING SETSCUBEROLLUPUNIONINTERSECTEXCEPT等復(fù)雜查詢的視圖定義。

  • 使用GROUP BY語(yǔ)句時(shí),GROUP BY指定的分組必須出現(xiàn)在投影中。

  • 僅支持特定的聚合函數(shù),即系統(tǒng)內(nèi)置的MINMAXSUMAVGCOUNT函數(shù)。

性能影響

  • 實(shí)時(shí)物化視圖大幅度提升查詢性能的同時(shí),對(duì)基表寫(xiě)入性能會(huì)有較大的影響,建議在讀多寫(xiě)少的場(chǎng)景下使用。

  • 實(shí)時(shí)更新物化視圖對(duì)基表寫(xiě)入性能的影響程度受實(shí)時(shí)物化視圖定義、基表寫(xiě)入負(fù)載、基表結(jié)構(gòu)和基表索引等因素的影響,建議您在生產(chǎn)環(huán)境創(chuàng)建實(shí)時(shí)物化視圖前,在測(cè)試環(huán)境測(cè)試帶有實(shí)時(shí)物化視圖的基表的寫(xiě)入性能,確認(rèn)寫(xiě)入性能滿足要求的情況下再在生產(chǎn)環(huán)境使用實(shí)時(shí)物化視圖。

  • 以下方式有助于降低維護(hù)實(shí)時(shí)物化視圖的代價(jià):

    • 同一個(gè)基表上的實(shí)時(shí)物化視圖不要太多。

    • 對(duì)基表批量寫(xiě)入。例如,使用COPY/INSERT INTO SELECT的方式批量導(dǎo)入數(shù)據(jù)。

    • 基表都有主鍵,并且實(shí)時(shí)物化視圖定義中的投影列中包含所有基表的主鍵。

原理介紹

  • 創(chuàng)建實(shí)時(shí)物化視圖

    • 對(duì)物化視圖查詢改寫(xiě),額外計(jì)算出維護(hù)實(shí)時(shí)物化視圖所需要的隱藏列。

    • 對(duì)基表創(chuàng)建Trigger,以便實(shí)現(xiàn)實(shí)時(shí)物化視圖的增量刷新。

    • 在滿足一定條件的時(shí)候,對(duì)實(shí)時(shí)物化視圖創(chuàng)建唯一索引,加速實(shí)時(shí)物化視圖的增量刷新。

  • 增量刷新實(shí)時(shí)物化視圖

    • 基表的數(shù)據(jù)變化觸發(fā)相應(yīng)的Trigger。

    • 通過(guò)Trigger獲取到基表的增量數(shù)據(jù)。

    • 根據(jù)實(shí)時(shí)物化視圖的定義和當(dāng)前基表的增量數(shù)據(jù)計(jì)算實(shí)時(shí)物化視圖的增量。

    • 將計(jì)算出的增量應(yīng)用到實(shí)時(shí)物化視圖上,完成實(shí)時(shí)物化視圖的增量刷新。

  • 刪除實(shí)時(shí)物化視圖

    • 刪除實(shí)時(shí)物化視圖對(duì)應(yīng)基表上的增量刷新Trigger。

    • 刪除實(shí)時(shí)物化視圖本身。

使用指南

  • 前提條件

    內(nèi)核小版本(V1.1.27)(發(fā)布時(shí)間:2022年9月)之后創(chuàng)建的集群,可直接使用實(shí)時(shí)物化視圖功能。對(duì)于存量集群,需要升級(jí)到內(nèi)核小版本(V1.1.27)后,在數(shù)據(jù)庫(kù)中創(chuàng)建polar_ivm插件。

    CREATE EXTENSION polar_ivm WITH SCHEMA pg_catalog;
    說(shuō)明

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

    show polar_version;
  • 創(chuàng)建實(shí)時(shí)物化視圖

    CREATE MATERIALIZED VIEW table_name[ (column_name [, ...] ) ]
    [ BUILD DEFERRED|IMMEDIATE ]
    REFRESH FAST
    ON COMMIT
    AS query

    參數(shù)說(shuō)明:

    參數(shù)

    說(shuō)明

    table_name

    需要?jiǎng)?chuàng)建的實(shí)時(shí)物化視圖的名稱(可以被模式限定)。

    column_name

    新物化視圖中的一個(gè)列名。如果沒(méi)有提供列名,則會(huì)從查詢的輸出列名中獲取。

    BUILD DEFERRED

    只創(chuàng)建出實(shí)時(shí)物化視圖的結(jié)構(gòu),但物化視圖上沒(méi)有數(shù)據(jù),也不會(huì)在該視圖上保持實(shí)時(shí)刷新。

    查詢?cè)搶?shí)時(shí)物化視圖不會(huì)報(bào)錯(cuò)但查不到任何數(shù)據(jù),直到對(duì)該實(shí)時(shí)物化視圖執(zhí)行REFRESH MATERIALIZED VIEW命令。

    BUILD IMMEDIATE

    默認(rèn)選項(xiàng),立刻創(chuàng)建完整的實(shí)時(shí)物化視圖。

    query

    實(shí)時(shí)物化視圖的視圖定義,一個(gè)SELECT、TABLE或者VALUES命令。該查詢將在一個(gè)安全受限的操作中運(yùn)行。

  • 增量刷新實(shí)時(shí)物化視圖

    REFRESH MATERIALIZED VIEW table_name
    說(shuō)明

    其中。

    • table_name:表示需要刷新的實(shí)時(shí)物化視圖的名稱(可以被模式限定)

    • 通過(guò)BUILD IMMEDIATE方式創(chuàng)建的實(shí)時(shí)物化視圖通常不需要手動(dòng)執(zhí)行刷新來(lái)確保視圖和基表的一致性。

    • 通過(guò)BUILD DEFERRED方式創(chuàng)建的實(shí)時(shí)物化視圖執(zhí)行刷新后,會(huì)通過(guò)視圖定義生成實(shí)時(shí)物化視圖的數(shù)據(jù),并對(duì)后續(xù)基表的更改開(kāi)啟實(shí)時(shí)刷新。

  • 刪除實(shí)時(shí)物化視圖

    DROP MATERIALIZED VIEW [ IF EXISTS ] table_name [, ...] [ CASCADE | RESTRICT ]

    參數(shù)說(shuō)明:

    參數(shù)

    說(shuō)明

    IF EXISTS

    如果該實(shí)時(shí)物化視圖不存在則不拋出一個(gè)錯(cuò)誤,而是發(fā)出一個(gè)提示。

    table_name

    需要移除的實(shí)時(shí)物化視圖的名稱(可以是模式限定的)。

    CASCADE

    自動(dòng)刪除依賴于該實(shí)時(shí)物化視圖的對(duì)象(例如,其他物化視圖或常規(guī)視圖),然后再刪除所有依賴于自動(dòng)刪除對(duì)象的對(duì)象。

    RESTRICT

    如果有任何對(duì)象依賴于該實(shí)時(shí)物化視圖,則拒絕刪除該實(shí)時(shí)物化視圖。默認(rèn)選擇該參數(shù)。

示例

  1. 創(chuàng)建實(shí)時(shí)物化視圖的依賴插件。

    CREATE EXTENSION IF NOT EXISTS polar_ivm WITH SCHEMA pg_catalog ;
  2. 創(chuàng)建基表并導(dǎo)入初始數(shù)據(jù)。

    CREATE TABLE t( a INT, b VARCHAR);
    INSERT INTO t VALUES
      (1,'a'),
      (2,'b'),
      (3,'c'),
      (4,'d'),
      (5,'e');
  3. 創(chuàng)建實(shí)時(shí)物化視圖。

    CREATE MATERIALIZED VIEW mv
    REFRESH FAST
    ON COMMIT
    AS
    SELECT max(a),min(a),b FROM t GROUP BY b;
  4. 對(duì)基表進(jìn)行DML操作。

    • 查詢實(shí)時(shí)物化視圖數(shù)據(jù)。

      SELECT * FROM mv ORDER BY b;

      顯示結(jié)果如下:

       max | min | b
      -----+-----+---
         1 |   1 | a
         2 |   2 | b
         3 |   3 | c
         4 |   4 | d
         5 |   5 | e
      (5 rows)

      結(jié)果顯示實(shí)時(shí)物化視圖的數(shù)據(jù)與基表數(shù)據(jù)保持一致。

    • 向基表中插入新數(shù)據(jù),查詢實(shí)時(shí)物化視圖數(shù)據(jù)。

      INSERT INTO t VALUES(6,'f');
      
      SELECT * FROM mv ORDER BY b;

      顯示結(jié)果如下:

       max | min | b
      -----+-----+---
         1 |   1 | a
         2 |   2 | b
         3 |   3 | c
         4 |   4 | d
         5 |   5 | e
         6 |   6 | f
      (6 rows)

      結(jié)果顯示實(shí)時(shí)物化視圖的數(shù)據(jù)與基表數(shù)據(jù)保持一致。

    • 刪除基表數(shù)據(jù),查詢實(shí)時(shí)物化視圖數(shù)據(jù)。

      DELETE FROM t WHERE a = 2;
      
      SELECT * FROM mv ORDER BY b;

      顯示結(jié)果如下:

       max | min | b
      -----+-----+---
         1 |   1 | a
         3 |   3 | c
         4 |   4 | d
         5 |   5 | e
         6 |   6 | f
      (5 rows)

      結(jié)果顯示實(shí)時(shí)物化視圖的數(shù)據(jù)與基表數(shù)據(jù)保持一致。

    • 更新基表數(shù)據(jù),查詢實(shí)時(shí)物化視圖數(shù)據(jù)。

      UPDATE t SET a = a + 1;
      
      SELECT * FROM mv ORDER BY b;

      顯示結(jié)果如下:

       max | min | b
      -----+-----+---
         2 |   2 | a
         4 |   4 | c
         5 |   5 | d
         6 |   6 | e
         7 |   7 | f
      (5 rows)

      結(jié)果顯示實(shí)時(shí)物化視圖的數(shù)據(jù)與基表數(shù)據(jù)保持一致。

  5. 刪除實(shí)時(shí)物化視圖。

    DROP MATERIALIZED VIEW mv;