chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SQL改寫消除相關(guān)子查詢實(shí)踐

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 2023-12-27 09:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、子查詢

GaussDB (DWS) 根據(jù)子查詢?cè)?SQL 語句中的位置把子查詢分成了子查詢、子鏈接兩種形式。

子查詢 SubQuery:對(duì)應(yīng)于查詢解析樹中的范圍表 RangeTblEntry,更通俗一些指的是出現(xiàn)在 FROM 語句后面的獨(dú)立的 SELECT 語句。

子鏈接 SubLink:對(duì)應(yīng)于查詢解析樹中的表達(dá)式,更通俗一些指的是出現(xiàn)在 where/on 子句、targetlist 里面的語句。

1.1 非相關(guān)子查詢

子查詢的執(zhí)行不依賴于外層父查詢的任何屬性值。這樣子查詢具有獨(dú)立性,可獨(dú)自求解,形成一個(gè)子查詢計(jì)劃先于外層的查詢求解。示例:

select t1.c1,t1.c2
from t1
where t1.c1 in (
    select c2
    from t2
    where t2.c2 IN (2,3,4)
);

1.2 相關(guān)子查詢

子查詢的執(zhí)行依賴于外層父查詢的一些屬性值(如下列示例 t2.c1 = t1.c1 條件中的 t1.c1)作為內(nèi)層查詢的一個(gè) AND-ed 條件。這樣的子查詢不具備獨(dú)立性,需要和外層查詢按分組進(jìn)行求解。

select t1.c1,t1.c2
from t1
where t1.c1 in (
    select c2
    from t2
    where t2.c1 = t1.c1 AND t2.c2 in (2,3,4)
);

二、調(diào)優(yōu)實(shí)戰(zhàn)

2.1 案例:

UPDATE t1
SET (c1,c2)=(
SELECT COALESCE(t2.c1, t1.c2),c2 FROM t2 WHERE t1.i1 = t2.i1  -- 相關(guān)標(biāo)量子查詢
);
其中子查詢 SELECT COALESCE (t2.c1, t1.c2),c2 FROM t2 WHERE t1.i1 = t2.i1 依賴于外層父查詢的 t1 表,因此屬于相關(guān)子查詢。執(zhí)行計(jì)劃:
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------
  id |                   operation                   |     A-time     | A-rows | E-rows | E-distinct |  Peak Memory   | E-memory | A-width | E-width | E-costs
 ----+-----------------------------------------------+----------------+--------+--------+------------+----------------+----------+---------+---------+---------
   1 | ->  Streaming (type: GATHER)                  | 8.998          |      0 |      1 |            | 24KB           |          |         |      17 | 9.83
   2 |    ->  Update on public.t1                    | [0.086, 0.096] |      2 |      2 |            | [308KB, 308KB] |          |         |      17 | 9.74
   3 |       ->  Seq Scan on public.t1               | [0.058, 0.074] |      2 |      2 |            | [32KB, 32KB]   | 1MB      |         |      17 | 3.73
   4 |          ->  Result  [3, SubPlan 1]           | [0.033, 0.034] |      2 |     10 |            | [16KB, 16KB]   | 1MB      |         |       6 | 1.36
   5 |             ->  Materialize                   | [4.167, 4.458] |     20 |     10 |            | [16KB, 16KB]   | 16MB     | [24,24] |       6 | 1.36
   6 |                ->  Streaming(type: BROADCAST) | [4.105, 4.406] |     10 |     10 |            | [48KB, 48KB]   | 2MB      |         |       6 | 1.33
   7 |                   ->  Seq Scan on public.t2   | [0.013, 0.013] |      5 |      5 |            | [32KB, 32KB]   | 1MB      |         |       6 | 1.02
   8 |          ->  Result  [3, SubPlan 2]           | [0.006, 0.021] |      2 |     10 |            | [16KB, 16KB]   | 1MB      |         |       6 | 1.36
   9 |             ->  Materialize                   | [0.055, 0.061] |     20 |     10 |            | [16KB, 16KB]   | 16MB     | [24,24] |       6 | 1.36
  10 |                ->  Streaming(type: BROADCAST) | [0.034, 0.040] |     10 |     10 |            | [48KB, 48KB]   | 2MB      |         |       6 | 1.33
  11 |                   ->  Seq Scan on public.t2   | [0.005, 0.009] |      5 |      5 |            | [32KB, 32KB]   | 1MB      |         |       6 | 1.02

2.2 子查詢消除

改寫策略就是解除子查詢與父查詢依賴關(guān)系,改寫方案參考:

UPDATE t1
SET (c1,c2)=(t3.c1,t3.c2)
FROM (
SELECT t2.i1,COALESCE(t2.c1, t1.c2) c1,t2.c2 FROM t1,t2 WHERE t1.i1 = t2.i1
)t3
WHERE t1.i1 = t3.i1;
改寫后,子查詢獨(dú)立,不再依賴父查詢中元素。執(zhí)行計(jì)劃:
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
  id |                      operation                      |     A-time     | A-rows | E-rows | E-distinct |  Peak Memory   | E-memory | A-width | E-width | E-costs
 ----+-----------------------------------------------------+----------------+--------+--------+------------+----------------+----------+---------+---------+---------
   1 | ->  Streaming (type: GATHER)                        | 13.141         |      0 |      1 |            | 24KB           |          |         |      33 | 10.56
   2 |    ->  Update on public.t1                          | [6.242, 6.362] |      2 |      2 |            | [308KB, 308KB] |          |         |      33 | 10.47
   3 |       ->  Streaming(type: RESTORE)                  | [6.186, 6.310] |      2 |      2 |            | [48KB, 48KB]   | 2MB      |         |      33 | 4.46
   4 |          ->  Nested Loop (5,11)                     | [4.082, 4.801] |      2 |      2 |            | [32KB, 32KB]   | 1MB      |         |      33 | 4.44
   5 |             ->  Streaming(type: BROADCAST)          | [3.804, 4.541] |      4 |      4 |            | [48KB, 48KB]   | 2MB      |         |      27 | 2.36
   6 |                ->  Nested Loop (7,8)                | [2.972, 4.267] |      2 |      2 |            | [32KB, 32KB]   | 1MB      |         |      27 | 2.20
   7 |                   ->  Seq Scan on public.t1         | [0.010, 0.011] |      2 |      2 |            | [16KB, 16KB]   | 1MB      |         |      14 | 1.01
   8 |                   ->  Materialize                   | [2.724, 4.055] |      6 |      4 |            | [16KB, 16KB]   | 16MB     | [28,28] |      13 | 1.17
   9 |                      ->  Streaming(type: BROADCAST) | [2.667, 4.008] |      4 |      4 |            | [48KB, 48KB]   | 2MB      |         |      13 | 1.17
  10 |                         ->  Seq Scan on public.t1   | [0.008, 0.012] |      2 |      2 |            | [16KB, 16KB]   | 1MB      |         |      13 | 1.01
  11 |             ->  Materialize                         | [0.018, 0.022] |     12 |      5 |            | [16KB, 16KB]   | 16MB     | [32,32] |      14 | 2.03
  12 |                ->  Seq Scan on public.t2            | [0.007, 0.009] |






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    789

    瀏覽量

    45979

原文標(biāo)題:數(shù)倉(cāng)調(diào)優(yōu)實(shí)踐丨 SQL改寫消除相關(guān)子查詢

文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    在Delphi中動(dòng)態(tài)地使用SQL查詢語句

    在Delphi中動(dòng)態(tài)地使用SQL查詢語句在一般的數(shù)據(jù)庫(kù)管理系統(tǒng)中,通常都需要應(yīng)用SQL查詢語句來提高程序的動(dòng)態(tài)特性。下面介紹如何在Delphi中實(shí)現(xiàn)這種功能。在Delphi中,使用
    發(fā)表于 05-10 11:10

    SQL語言實(shí)現(xiàn)數(shù)據(jù)庫(kù)記錄的查詢

    絕大部分DBMS都支持SQL語言,LabVIEW數(shù)據(jù)庫(kù)工具包實(shí)現(xiàn)的實(shí)質(zhì)也是基于SQL語言,它為不熟悉SQL語言的用戶把SQL語言封裝了起來,以方便他們使用。所以,我們也可以利用
    發(fā)表于 07-01 21:25

    高級(jí)子查詢

    高級(jí)子查詢(相關(guān)子查詢)
    發(fā)表于 05-23 16:15

    SQL查詢慢的原因分析總結(jié)

    sql 查詢慢的48個(gè)原因分析 1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程序設(shè)計(jì)的缺陷)。 2、I/O吞吐量小,形成了瓶頸效應(yīng)。 3、沒有創(chuàng)建計(jì)算列導(dǎo)致查詢不優(yōu)化。 4
    發(fā)表于 03-08 11:58 ?0次下載

    Delphi教程之在SQL查詢中使用動(dòng)態(tài)參數(shù)

    Delphi教程之在SQL查詢中使用動(dòng)態(tài)參數(shù),學(xué)習(xí)Delphi的必備資料。
    發(fā)表于 03-31 11:29 ?4次下載

    基于KingView的SQL數(shù)據(jù)查詢設(shè)計(jì)_楊洋

    基于KingView的SQL數(shù)據(jù)查詢設(shè)計(jì)_楊洋
    發(fā)表于 01-17 19:57 ?1次下載

    SQL語句怎么搞定跨實(shí)例查詢?

    這個(gè)SQL的語法完全兼容MySQL,只是在From的表名前面帶上DBLink。所以,業(yè)務(wù)方只需要使用DMS跨數(shù)據(jù)庫(kù)查詢SQL便可輕松解決拆庫(kù)之后的跨庫(kù)查詢難題,業(yè)務(wù)基本無需改造。
    發(fā)表于 11-03 10:22 ?5996次閱讀

    SQL查詢優(yōu)化是怎么回事

    查詢 (Subquery)的優(yōu)化一直以來都是 SQL 查詢優(yōu)化中的難點(diǎn)之一。 關(guān)聯(lián)子查詢的基本執(zhí)行方式類似于 Nested-Loop,但是這種執(zhí)行方式的效率常常低到難以忍受。 當(dāng)數(shù)據(jù)
    的頭像 發(fā)表于 02-01 13:55 ?2496次閱讀
    <b class='flag-5'>SQL</b>子<b class='flag-5'>查詢</b>優(yōu)化是怎么回事

    簡(jiǎn)述Django查詢生成原始SQL查詢的3種方法

    我們使用Django ORM使查詢數(shù)據(jù)庫(kù)變得非常容易,但是如果我們知道幕后發(fā)生了什么或?qū)δ承〥jango查詢執(zhí)行了什么SQL查詢,對(duì)我們提升查詢
    的頭像 發(fā)表于 06-04 16:36 ?2412次閱讀

    Spark SQL的概念及查詢方式

    SQL查詢。 Hive的繼承,Spark SQL通過內(nèi)嵌的hive或者連接外部已經(jīng)部署好的hive案例,實(shí)現(xiàn)了對(duì)hive語法的繼承和操作。 標(biāo)準(zhǔn)化的連接方式,Spark SQL
    的頭像 發(fā)表于 09-02 15:44 ?4464次閱讀
    Spark <b class='flag-5'>SQL</b>的概念及<b class='flag-5'>查詢</b>方式

    一文終結(jié)SQL查詢優(yōu)化

    查詢(Subquery)的優(yōu)化一直以來都是 SQL 查詢優(yōu)化中的難點(diǎn)之一。關(guān)聯(lián)子查詢的基本執(zhí)行方式類似于 Nested-Loop,但是這種執(zhí)行方式的效率常常低到難以忍受。
    的頭像 發(fā)表于 04-28 14:19 ?1154次閱讀
    一文終結(jié)<b class='flag-5'>SQL</b>子<b class='flag-5'>查詢</b>優(yōu)化

    sql查詢語句大全及實(shí)例

    SQL(Structured Query Language)是一種專門用于數(shù)據(jù)庫(kù)管理系統(tǒng)的標(biāo)準(zhǔn)交互式數(shù)據(jù)庫(kù)查詢語言。它被廣泛應(yīng)用于數(shù)據(jù)庫(kù)管理和數(shù)據(jù)操作領(lǐng)域。在本文中,我們將為您詳細(xì)介紹SQL
    的頭像 發(fā)表于 11-17 15:06 ?2674次閱讀

    sql語句where條件查詢

    SQL是一種用于管理和操作關(guān)系型數(shù)據(jù)庫(kù)的編程語言。其中,WHERE子句是用于過濾查詢結(jié)果的重要部分。通過WHERE條件,我們可以指定一系列條件,以僅返回滿足條件的記錄。本文將探討WHERE條件查詢
    的頭像 發(fā)表于 11-23 11:28 ?1934次閱讀

    oracle執(zhí)行sql查詢語句的步驟是什么

    Oracle數(shù)據(jù)庫(kù)是一種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),具有強(qiáng)大的SQL查詢功能。Oracle執(zhí)行SQL查詢語句的步驟包括編寫SQL語句、解析
    的頭像 發(fā)表于 12-06 10:49 ?1545次閱讀

    查詢SQL在mysql內(nèi)部是如何執(zhí)行?

    我們知道在mySQL客戶端,輸入一條查詢SQL,然后看到返回查詢的結(jié)果。這條查詢語句在 MySQL 內(nèi)部到底是如何執(zhí)行的呢?本文跟大家探討一下哈,我們先來看下MySQL基本架構(gòu)~
    的頭像 發(fā)表于 01-22 14:53 ?1023次閱讀
    <b class='flag-5'>查詢</b><b class='flag-5'>SQL</b>在mysql內(nèi)部是如何執(zhí)行?