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

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

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

3天內不再提示

SQL改寫消除相關子查詢實踐

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

掃碼添加小助手

加入工程師交流群

一、子查詢

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

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

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

1.1 非相關子查詢

子查詢的執(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 相關子查詢

子查詢的執(zhí)行依賴于外層父查詢的一些屬性值(如下列示例 t2.c1 = t1.c1 條件中的 t1.c1)作為內層查詢的一個 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)
);

二、調優(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  -- 相關標量子查詢
);
其中子查詢 SELECT COALESCE (t2.c1, t1.c2),c2 FROM t2 WHERE t1.i1 = t2.i1 依賴于外層父查詢的 t1 表,因此屬于相關子查詢。執(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 子查詢消除

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

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] |






審核編輯:劉清

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

    關注

    1

    文章

    807

    瀏覽量

    46906

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

    高級子查詢

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

    SQL查詢慢的原因分析總結

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

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

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

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

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

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

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

    SQL構造查詢的方式詳細概述

    所以您想學習SQL? 太好了,你應該! 您是否知道,這是數(shù)據(jù)分析師和數(shù)據(jù)工程師最需要的第一技能,而數(shù)據(jù)科學家則是第三要的技能? 在本文中,我將向您解釋如何以最簡單的方式使用SQL查詢。 但首先,讓我定義幾個術語……
    的頭像 發(fā)表于 04-12 11:47 ?2987次閱讀

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

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

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

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

    Spark SQL的概念及查詢方式

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

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

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

    sql查詢語句大全及實例

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

    sql語句where條件查詢

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

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

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

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

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