Doris中的物化視圖-查詢(十九)

物化視圖創建完成后,用戶的查詢會根據規則自動匹配到最優的物化視圖。

比如我們有一張銷售記錄明細表,并且在這個明細表上創建了三張物化視圖。一個存儲了不同時間不同銷售員的售賣量,一個存儲了不同時間不同門店的銷售量,以及每個銷售員的總銷售量。

當查詢7月19日,各個銷售員都買了多少錢的話。就可以匹配 mv_1 物化視圖。直接對 mv_1 的數據進行查詢。

查詢自動匹配

物化視圖的自動匹配分為下面兩個步驟:

(1)根據查詢條件刪選出一個最優的物化視圖:這一步的輸入是所有候選物化視圖表的元數據,根據查詢的條件從候選集中輸出最優的一個物化視圖

(2)根據選出的物化視圖對查詢進行改寫:這一步是結合上一步選擇出的最優物化視圖,進行查詢的改寫,最終達到直接查詢物化視圖的目的。

其中 bitmap 和 hll 的聚合函數在查詢匹配到物化視圖后,查詢的聚合算子會根據物化視圖的表結構進行一個改寫。

最優路徑選擇

這里分為兩個步驟:

(1)對候選集合進行一個過濾。只要是查詢的結果能從物化視圖數據計算(取部分行,部分列,或部分行列的聚合)出都可以留在候選集中,過濾完成后候選集合大小>=1。

(2)從候選集合中根據聚合程度,索引等條件選出一個最優的也就是查詢花費最少物化視圖。

這里再舉一個相對復雜的例子,來體現這個過程:

候選集過濾目前分為 4 層,每一層過濾后去除不滿足條件的物化視圖。

比如查詢 7 月 19 日,各個銷售員都買了多少錢,候選集中包括所有的物化視圖以及 base表共 4 個:

第一層過濾先判斷查詢 where 中的謂詞涉及到的數據是否能從物化視圖中得到。也就是銷售時間列是否在表中存在。由于第三個物化視圖中根本不存在銷售時間列。所以在這一層過濾中,mv_3 就被淘汰了。

第二層是過濾查詢的分組列是否為候選集的分組列的子集。也就是銷售員 id 是否為表中分組列的子集。由于第二個物化視圖中的分組列并不涉及銷售員 id。所以在這一層過濾中,mv_2 也被淘汰了。

第三層過濾是看查詢的聚合列是否為候選集中聚合列的子集。也就是對銷售額求和是否能從候選集的表中聚合得出。這里 base 表和物化視圖表均滿足標準。

最后一層是過濾看查詢需要的列是否存在于候選集合的列中。由于候選集合中的表均滿足標準,所以最終候選集合中的表為 銷售明細表,以及 mv_1,這兩張。

候選集過濾完后輸出一個集合,這個集合中的所有表都能滿足查詢的需求。但每張表的查詢效率都不同。這時候就需要再這個集合根據前綴索引是否能匹配到,以及聚合程度的高低來選出一個最優的物化視圖。

從表結構中可以看出,base 表的銷售日期列是一個非排序列,而物化視圖表的日期是一個排序列,同時聚合程度上 mv_1 表明顯比 base 表高。所以最后選擇出 mv_1 作為該查詢的最優匹配。

最后再根據選擇出的最優解,改寫查詢。

剛才的查詢選中 mv_1 后,將查詢改寫為從 mv_1 中讀取數據,過濾出日志為 7月19日的 mv_1 中的數據然后返回即可。

查詢改寫

有些情況下的查詢改寫還會涉及到查詢中的聚合函數的改寫。

比如業務方經常會用到 count distinct 對 PV UV 進行計算。

例如:

廣告點擊明細記錄表中存放哪個用戶點擊了什么廣告,從什么渠道點擊的,以及點擊的時間。并且在這個 base 表基礎上構建了一個物化視圖表,存儲了不同廣告不同渠道的用戶bitmap 值。

由于 bitmap union 這種聚合方式本身會對相同的用戶 user id 進行一個去重聚合。當用戶查詢廣告在 web 端的 uv 的時候,就可以匹配到這個物化視圖。匹配到這個物化視圖表后就需要對查詢進行改寫,將之前的對用戶 id 求 count(distinct) 改為對物化視圖中 bitmap union列求 count。

所以最后查詢取物化視圖的第一和第三行求 bitmap 聚合中有幾個值。

使用及限制

(1)目前支持的聚合函數包括,常用的 sum,min,max count,以及計算 pv ,uv, 留存率,等常用的去重算法 hll_union,和用于精確去重計算 count(distinct)的算法bitmap_union。

(2)物化視圖的聚合函數的參數不支持表達式僅支持單列,比如: sum(a+b)不支持。

(3)使用物化視圖功能后,由于物化視圖實際上是損失了部分維度數據的。所以對表的 DML 類型操作會有一些限制:

如果表的物化視圖 key 中不包含刪除語句中的條件列,則刪除語句不能執行。 比如想要刪除渠道為 app 端的數據,由于存在一個物化視圖并不包含渠道這個字段,則這個刪除不能執行,因為刪除在物化視圖中無法被執行。這時候你只能把物化視圖先刪除,然后刪除完數據后,重新構建一個新的物化視圖。

(4)單表上過多的物化視圖會影響導入的效率:導入數據時,物化視圖和 base 表數據是同步更新的,如果一張表的物化視圖表超過 10 張,則有可能導致導入速度很慢。這就像單次導入需要同時導入 10 張表數據是一樣的。

(5)相同列,不同聚合函數,不能同時出現在一張物化視圖中,比如:select sum(a), min(a) from table 不支持。

(6)物化視圖針對 Unique Key 數據模型,只能改變列順序,不能起到聚合的作用,所以在 Unique Key 模型上不能通過創建物化視圖的方式對數據進行粗粒度聚合操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167612.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#,《小白學程序》第二課:數組,循環與排序

1 什么是數組&#xff1f; 數組 Array 是一組數值&#xff08;數 或 值&#xff09;。 int[] a; int[,] b; int[][] c; Anything[] d; 都是數組。 2 排序 排序就是按大小、名字、拼音或你指定的信息進行比較后排隊。 排序是數組最基本的功能需求。 3 文本格式 /// <summa…

《數據結構、算法與應用C++語言描述》-代碼實現散列表(線性探查與鏈式散列)

散列表 完整可編譯運行代碼&#xff1a;Github:Data-Structures-Algorithms-and-Applications/_22hash/ 定義 字典的另一種表示方法是散列&#xff08;hashing&#xff09;。它用一個散列函數&#xff08;也稱哈希函數&#xff09;把字典的數對映射到一個散列表&#xff08…

spring-webflux的一些概念的理解

Spring5的webflux可以支持高吞吐量&#xff0c;使用相同的資源可以處理更加多的請求&#xff0c;它將會成為未來技術的趨勢&#xff0c;但是相對于學習其他的框架相比&#xff0c;它的學習曲線很高&#xff0c;綜合了很多現有的技術&#xff0c;即使按照教程學習能編寫代碼&…

requests庫的學習(詳細篇)

一、request庫的安裝 requests屬于第三方庫&#xff0c;Python不內置&#xff0c;因此需要我們手動安裝。 pip3 install requests

HTML5新特性

HTML5新特性 前言語義化標簽常用語義化標簽優點 新增input屬性新增type屬性值內容其他新增input屬性 video&#xff08;視頻&#xff09;與audio&#xff08;音頻&#xff09;標簽 前言 本文主要講解HTML5中新增了哪些內容。 語義化標簽 HTML5新增了語義化標簽這個特性&…

第一類曲線積分@對弧長的曲線積分

文章目錄 abstract對弧長的曲線積分曲線形構件的質量第一類曲線積分曲線積分存在性利用曲線積分的定義描述曲線形構件質量問題推廣曲線積分可加性閉曲線積分 曲線積分性質曲線積分的計算方法證明(部分推導) 小結曲線弧顯函數形式方程下的曲線積分公式推廣例例例 abstract 在積…

html table樣式的設計 表格邊框修飾

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>今日小說排行榜</title> <style> table {border-collapse: collapse;border: 4px double red; /*…

Python之Pygame游戲編程詳解

一、介紹 1.1 定義 Pygame是一種流行的Python游戲開發庫&#xff0c;它提供了許多功能&#xff0c;使開發人員可以輕松創建2D游戲。它具有良好的跨平臺支持&#xff0c;可以在多個操作系統上運行&#xff0c;例如Windows&#xff0c;MacOS和Linux。在本文中&#xff0c;我們將…

單鏈表的反轉?太細了哥們!細到離譜!

單鏈表的反轉&#xff08;面試常出&#xff09;&#xff1a; ? 單鏈表的反轉&#xff0c;可以通過很多種方法實現。包括迭代法&#xff0c;遞歸法&#xff0c; 迭代法&#xff1a; 定義三個指針&#xff1a;prev、current和next&#xff0c;它們分別表示前一個節點、當前節點…

NSGA-III求解微電網多目標優化調度(MATLAB)

一、NSGA-III簡介 NSGA-III算法由Kalyanmoy Deb和Himanshu Jain于 2014年提出。 參考文獻&#xff1a;Deb K , Jain H . An Evolutionary Many-Objective Optimization Algorithm Using Reference Point-Based Nondominated Sorting Approach, Part I: Solving Problems With …

[chroot+seccomp逃逸] THUCTF2019 之 固若金湯

題目分析 附件為一個源碼, 其中注釋我都寫好了, 主要就講關鍵的知識點. #define _GNU_SOURCE#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <errno.h> #include <sched.h> #include <uni…

【C/PTA —— 10.函數1(課外實踐)】

C/PTA —— 10.函數1&#xff08;課外實踐&#xff09; 一.函數題6-1 符號函數6-2 求排列數6-3 求一個大于10的n位整數w的后n-1位的數&#xff0c;并作為函數值返回。6-4 其右上三角&#xff08;含主對角線&#xff09;元素之和。6-5 字符串比較6-6 使用函數求素數和6-7 使用函…

【電子通識】為什么說做產品不是簡單的將不同的技術進行搭積木?

很多人說做產品的硬件工程師&#xff0c;其實就是將專項技術工程師已經調好的模塊進行拼接。類似于小孩將積木搭成一個房子的形狀&#xff0c;雖然不同人搭的房子風格迥異&#xff0c;但所使用的原材料卻都是一樣的。 首先我并不同意這種看法&#xff0c;原因是產品工程師是需要…

JVM深入理解

JVM深入理解&#xff08;一&#xff09; JVM是什么 JRE、JDK和JVM 的關系 JVM原理 1、JVM是什么&#xff1f; JVM是Java Virtual Machine&#xff08;Java虛擬機&#xff09;的縮寫&#xff0c;由一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域等組…

MediaCodec詳解

MediaCodec 是Android平臺提供的一個API&#xff0c;用于對音頻和視頻數據進行編碼&#xff08;轉換為不同的格式&#xff09;和解碼&#xff08;從一種格式轉換回原始數據&#xff09;。它是Android 4.1&#xff08;API級別16&#xff09;及以上版本的一部分&#xff0c;允許開…

Sulfo-CY5 Azide在其他生物學研究中的應用

除了生物成像、生物分子標記、分子生物學研究和生物傳感與診斷等領域外&#xff0c;Sulfo-CY5 Azide還在其他生物學研究中有多種應用&#xff0c;**(來自星戈瑞的花菁染料)**如下&#xff1a; ****細胞追蹤和細胞遷移研究&#xff1a;****Sulfo-CY5 Azide可以被用作細胞標記劑&…

【教3妹學編程-算法題】統計和小于目標的下標對數目

2哥 : 3妹&#xff0c;OpenAI的宮斗劇迎來了大結局&#xff01;OpenAI宣布阿爾特曼復職CEO&#xff0c;董事會重組 3妹&#xff1a;啊&#xff1f;到底誰才是幕后操縱者啊&#xff0c;有咩有揪出來 2哥 : 也不是很清楚&#xff0c;據說在被開除的幾周前&#xff0c;前CEO曾譴責…

Linux 家目錄和根目錄

摘要&#xff1a; 在 Linux 操作系統中&#xff0c;家目錄和根目錄是兩個非常重要的概念。它們是 Linux 文件系統中的兩個關鍵節點&#xff0c;為用戶和系統進程提供存儲、管理和訪問文件和目錄的接口。本文旨在深入探討和理解這兩個目錄的結構、功能和使用方式&#xff0c;同時…

行情分析 - - 加密貨幣市場大盤走勢(11.24)

大餅昨日震蕩幅度很小&#xff0c;而今天延續昨日的空頭思路。當然如果從MACD日線來看&#xff0c;處于上漲趨勢&#xff0c;穩健的可以選擇觀望等待。空頭思路是因為目前EMA21均線和EMA55均線依然保持很遠&#xff0c;最近兩個月BTC上漲40%&#xff0c;而最近持續保持高位很快…

同時可視化原始中心點和經過坐標轉換后的中心點

std::vector<Eigen::Vector2d> centroids_unknown_motion_underk;std::vector<Eigen::Vector2d> measurements_centroids_unknown_motion_k= transformLandmarks(centroids_unknown_motion_k, weights_pose); // 數據填充 // k時刻經過轉換到k-1時刻坐標系下的中心…