欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 2023-12-27 09:51 ? 次閱讀

一、子查詢

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

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

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

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

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

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)層查詢的一個 AND-ed 條件。這樣的子查詢不具備獨立性,需要和外層查詢按分組進行求解。

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)實戰(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)標量子查詢
);
其中子查詢 SELECT COALESCE (t2.c1, t1.c2),c2 FROM t2 WHERE t1.i1 = t2.i1 依賴于外層父查詢的 t1 表,因此屬于相關(guān)子查詢。執(zhí)行計劃:
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;
改寫后,子查詢獨立,不再依賴父查詢中元素。執(zhí)行計劃:
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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    775

    瀏覽量

    44268

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

    高級子查詢

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

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

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

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

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

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

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

    SQL語句怎么搞定跨實例查詢?

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

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

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

    簡述Django查詢生成原始SQL查詢的3種方法

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

    Spark SQL的概念及查詢方式

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

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

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

    sql查詢語句大全及實例

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

    sql語句where條件查詢

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

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

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

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

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