日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oracle execute immediate执行多条语句_用数据库的方式思考SQL是如何执行的

發布時間:2023/12/19 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle execute immediate执行多条语句_用数据库的方式思考SQL是如何执行的 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

私信我或關注微信號:猿來如此呀,回復:學習,獲取免費學習資源包。

今天我們就從數據庫的角度來思考一下 SQL 是如何被執行的。

關于今天的內容,你會從以下幾個方面進行學習:

  • Oracle 中的 SQL 是如何執行的,什么是硬解析和軟解析;
  • MySQL 中的 SQL 是如何執行的,MySQL 的體系結構又是怎樣的;
  • 什么是存儲引擎,MySQL 的存儲引擎都有哪些?
  • Oracle 中的 SQL 是如何執行的

    我們先來看下 SQL 在 Oracle 中的執行過程:

    從上面這張圖中可以看出,SQL 語句在 Oracle 中經歷了以下的幾個步驟。

  • 語法檢查:檢查 SQL 拼寫是否正確,如果不正確,Oracle 會報語法錯誤。
  • 語義檢查:檢查 SQL 中的訪問對象是否存在。比如我們在寫 SELECT 語句的時候,列名寫錯了,系統就會提示錯誤。語法檢查和語義檢查的作用是保證 SQL 語句沒有錯誤。
  • 權限檢查:看用戶是否具備訪問該數據的權限。
  • 共享池檢查:共享池(Shared Pool)是一塊內存池,最主要的作用是緩存 SQL 語句和該語句的執行計劃。Oracle 通過檢查共享池是否存在 SQL 語句的執行計劃,來判斷進行軟解析,還是硬解析。那軟解析和硬解析又該怎么理解呢?
  • 在共享池中,Oracle 首先對 SQL 語句進行 Hash 運算,然后根據 Hash 值在庫緩存(Library Cache)中查找,如果存在 SQL 語句的執行計劃,就直接拿來執行,直接進入“執行器”的環節,這就是軟解析。

    如果沒有找到 SQL 語句和執行計劃,Oracle 就需要創建解析樹進行解析,生成執行計劃,進入“優化器”這個步驟,這就是硬解析。

  • 優化器:優化器中就是要進行硬解析,也就是決定怎么做,比如創建解析樹,生成執行計劃。
  • 執行器:當有了解析樹和執行計劃之后,就知道了 SQL 該怎么被執行,這樣就可以在執行器中執行語句了。
  • 共享池是 Oracle 中的術語,包括了庫緩存,數據字典緩沖區等。我們上面已經講到了庫緩存區,它主要緩存 SQL 語句和執行計劃。而數據字典緩沖區存儲的是 Oracle 中的對象定義,比如表、視圖、索引等對象。當對 SQL 語句進行解析的時候,如果需要相關的數據,會從數據字典緩沖區中提取。

    庫緩存這一個步驟,決定了 SQL 語句是否需要進行硬解析。為了提升 SQL 的執行效率,我們應該盡量避免硬解析,因為在 SQL 的執行過程中,創建解析樹,生成執行計劃是很消耗資源的。

    你可能會問,如何避免硬解析,盡量使用軟解析呢?在 Oracle 中,綁定變量是它的一大特色。綁定變量就是在 SQL 語句中使用變量,通過不同的變量取值來改變 SQL 的執行結果。這樣做的好處是能提升軟解析的可能性,不足之處在于可能會導致生成的執行計劃不夠優化,因此是否需要綁定變量還需要視情況而定。

    舉個例子,我們可以使用下面的查詢語句:

    SQL> select * from player where player_id = 10001;

    你也可以使用綁定變量,如:

    SQL> select * from player where player_id = :player_id;

    這兩個查詢語句的效率在 Oracle 中是完全不同的。如果你在查詢 player_id = 10001 之后,還會查詢 10002、10003 之類的數據,那么每一次查詢都會創建一個新的查詢解析。而第二種方式使用了綁定變量,那么在第一次查詢之后,在共享池中就會存在這類查詢的執行計劃,也就是軟解析。

    因此我們可以通過使用綁定變量來減少硬解析,減少 Oracle 的解析工作量。但是這種方式也有缺點,使用動態 SQL 的方式,因為參數不同,會導致 SQL 的執行效率不同,同時 SQL 優化也會比較困難。

    MySQL 中的 SQL 是如何執行的

    Oracle 中采用了共享池來判斷 SQL 語句是否存在緩存和執行計劃,通過這一步驟我們可以知道應該采用硬解析還是軟解析。那么在 MySQL 中,SQL 是如何被執行的呢?

    首先 MySQL 是典型的 C/S 架構,即 Client/Server 架構,服務器端程序使用的 mysqld。整體的 MySQL 流程如下圖所示:

    你能看到 MySQL 由三層組成:

  • 連接層:客戶端和服務器端建立連接,客戶端發送 SQL 至服務器端;
  • SQL 層:對 SQL 語句進行查詢處理;
  • 存儲引擎層:與數據庫文件打交道,負責數據的存儲和讀取。
  • 其中 SQL 層與數據庫文件的存儲方式無關,我們來看下 SQL 層的結構:

  • 查詢緩存:Server 如果在查詢緩存中發現了這條 SQL 語句,就會直接將結果返回給客戶端;如果沒有,就進入到解析器階段。需要說明的是,因為查詢緩存往往效率不高,所以在 MySQL8.0 之后就拋棄了這個功能。
  • 解析器:在解析器中對 SQL 語句進行語法分析、語義分析。
  • 優化器:在優化器中會確定 SQL 語句的執行路徑,比如是根據全表檢索,還是根據索引來檢索等。
  • 執行器:在執行之前需要判斷該用戶是否具備權限,如果具備權限就執行 SQL 查詢并返回結果。在 MySQL8.0 以下的版本,如果設置了查詢緩存,這時會將查詢結果進行緩存。
  • 你能看到 SQL 語句在 MySQL 中的流程是:SQL 語句→緩存查詢→解析器→優化器→執行器。在一部分中,MySQL 和 Oracle 執行 SQL 的原理是一樣的。

    與 Oracle 不同的是,MySQL 的存儲引擎采用了插件的形式,每個存儲引擎都面向一種特定的數據庫應用環境。同時開源的 MySQL 還允許開發人員設置自己的存儲引擎,下面是一些常見的存儲引擎:

  • InnoDB 存儲引擎:它是 MySQL 5.5 版本之后默認的存儲引擎,最大的特點是支持事務、行級鎖定、外鍵約束等。
  • MyISAM 存儲引擎:在 MySQL 5.5 版本之前是默認的存儲引擎,不支持事務,也不支持外鍵,最大的特點是速度快,占用資源少。
  • Memory 存儲引擎:使用系統內存作為存儲介質,以便得到更快的響應速度。不過如果 mysqld 進程崩潰,則會導致所有的數據丟失,因此我們只有當數據是臨時的情況下才使用 Memory 存儲引擎。
  • NDB 存儲引擎:也叫做 NDB Cluster 存儲引擎,主要用于 MySQL Cluster 分布式集群環境,類似于 Oracle 的 RAC 集群。
  • Archive 存儲引擎:它有很好的壓縮機制,用于文件歸檔,在請求寫入時會進行壓縮,所以也經常用來做倉庫。
  • 需要注意的是,數據庫的設計在于表的設計,而在 MySQL 中每個表的設計都可以采用不同的存儲引擎,我們可以根據實際的數據處理需要來選擇存儲引擎,這也是 MySQL 的強大之處。

    數據庫管理系統也是一種軟件

    我們剛才了解了 SQL 語句在 Oracle 和 MySQL 中的執行流程,實際上完整的 Oracle 和 MySQL 結構圖要復雜得多:

    如果你只是簡單地把 MySQL 和 Oracle 看成數據庫管理系統軟件,從外部看難免會覺得“晦澀難懂”,畢竟組織結構太多了。我們在學習的時候,還需要具備抽象的能力,抓取最核心的部分:SQL 的執行原理。因為不同的 DBMS 的 SQL 的執行原理是相通的,只是在不同的軟件中,各有各的實現路徑。

    既然一條 SQL 語句會經歷不同的模塊,那我們就來看下,在不同的模塊中,SQL 執行所使用的資源(時間)是怎樣的。下面我來教你如何在 MySQL 中對一條 SQL 語句的執行時間進行分析。

    首先我們需要看下 profiling 是否開啟,開啟它可以讓 MySQL 收集在 SQL 執行時所使用的資源情況,命令如下:

    mysql> select @@profiling;

    profiling=0 代表關閉,我們需要把 profiling 打開,即設置為 1:

    mysql> set profiling=1;

    然后我們執行一個 SQL 查詢(你可以執行任何一個 SQL 查詢):

    mysql> select * from wucai.heros;

    查看當前會話所產生的所有 profiles,你會發現我們剛才執行了兩次查詢,Query ID 分別為 1 和 2。如果我們想要獲取上一次查詢的執行時間,可以使用:

    mysql> show profile;

    當然你也可以查詢指定的 Query ID,比如:

    mysql> show profile for query 2;

    查詢 SQL 的執行時間結果和上面是一樣的。

    在 8.0 版本之后,MySQL 不再支持緩存的查詢,原因我在上文已經說過。一旦數據表有更新,緩存都將清空,因此只有數據表是靜態的時候,或者數據表很少發生變化時,使用緩存查詢才有價值,否則如果數據表經常更新,反而增加了 SQL 的查詢時間。

    你可以使用 select version() 來查看 MySQL 的版本情況。

    總結

    我們在使用 SQL 的時候,往往只見樹木,不見森林,不會注意到它在各種數據庫軟件中是如何執行的,今天我們從全貌的角度來理解這個問題。你能看到不同的 RDBMS 之間有相同的地方,也有不同的地方。

    相同的地方在于 Oracle 和 MySQL 都是通過解析器→優化器→執行器這樣的流程來執行 SQL 的。

    但 Oracle 和 MySQL 在進行 SQL 的查詢上面有軟件實現層面的差異。Oracle 提出了共享池的概念,通過共享池來判斷是進行軟解析,還是硬解析。而在 MySQL 中,8.0 以后的版本不再支持查詢緩存,而是直接執行解析器→優化器→執行器的流程,這一點從 MySQL 中的 show profile 里也能看到。同時 MySQL 的一大特色就是提供了各種存儲引擎以供選擇,不同的存儲引擎有各自的使用場景,我們可以針對每張表選擇適合的存儲引擎。

    今天的內容到這里就結束了,你能說一下 Oracle 中的綁定變量是什么嗎?使用它有什么優缺點嗎?MySQL 的存儲引擎是一大特色,其中 MyISAM 和 InnoDB 都是常用的存儲引擎,這兩個搜索引擎的特性和使用場景分別是什么?

    最后留一道選擇題吧,解析后的 SQL 語句在 Oracle 的哪個區域中進行緩存?

    A. 數據緩沖區

    B. 日志緩沖區

    C. 共享池

    D. 大池

    如果這篇文章幫你理順了 Oracle 和 MySQL 執行 SQL 的過程,歡迎你把它分享給你的朋友或者同事。

    來源網絡,侵權聯系刪除

    總結

    以上是生活随笔為你收集整理的oracle execute immediate执行多条语句_用数据库的方式思考SQL是如何执行的的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。