国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)庫中的SQL是如何執(zhí)行的?

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)庫中的SQL是如何執(zhí)行的?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

簡(jiǎn)介

參考文獻(xiàn):03丨學(xué)會(huì)用數(shù)據(jù)庫的方式思考SQL是如何執(zhí)行的

以oracle和MySQL為例,講解了sql是怎么被執(zhí)行的,并且對(duì)比了執(zhí)行過程中,oracle和MySQL的異同。

個(gè)人感覺,講解的核心是SQL執(zhí)行時(shí)的緩存機(jī)制。

Oracle中的sql是如何執(zhí)行的

自我口述一下

sql語句在提交后,

首先進(jìn)行“語法檢查”,檢查sql語法是否正確,關(guān)鍵字等的拼寫是否異常;

然后進(jìn)行“語義檢查”,檢查sql中涉及到的訪問對(duì)象是否存在,比如說from的表,或者是select的字段等。

語法檢查和語義檢查是為了避免sql語句本身出現(xiàn)錯(cuò)誤,保證sql語句是可以運(yùn)行的。

然后進(jìn)行“權(quán)限檢查”,檢查當(dāng)前用戶是否有所調(diào)用表的訪問權(quán)限,是否可以訪問這些數(shù)據(jù)。

然后進(jìn)行“共享池檢查”, 這一步是檢查sql語句及其執(zhí)行計(jì)劃是否緩存在共享池中,如果當(dāng)前有緩存,就將它們?nèi)〕鰜恚@個(gè)過程被稱為sql語句的軟解析;如果該語句和其對(duì)應(yīng)的執(zhí)行計(jì)劃沒有緩存過,那sql語句將被送進(jìn)“優(yōu)化器”,創(chuàng)建解析樹對(duì)其解析,同時(shí)生成執(zhí)行計(jì)劃,這個(gè)過程被稱為硬解析。

在執(zhí)行計(jì)劃就位后,就知道了sql該怎么被執(zhí)行,這時(shí)候再進(jìn)行“執(zhí)行器”階段,執(zhí)行sql語句,返回執(zhí)行結(jié)果。

數(shù)據(jù)庫中的SQL是如何執(zhí)行的?

共享池(shared pool)是oracle中的術(shù)語,是一塊內(nèi)存池,包括了庫緩存區(qū)數(shù)據(jù)字典緩存區(qū)。庫緩存區(qū)主要是用來緩存sql語句和其執(zhí)行計(jì)劃,數(shù)據(jù)字典緩存區(qū)存儲(chǔ)的是Oracle中各種對(duì)象,如表、視圖、索引等對(duì)象,其緩存細(xì)粒度更小,但也更實(shí)用,當(dāng)對(duì)sql語句進(jìn)行解析的時(shí)候,如果需要相應(yīng)的對(duì)象,那直接去數(shù)據(jù)字典緩存區(qū)去找。

那庫緩存過程中,Oracle是怎么進(jìn)行軟解析的呢?

Oracle首先對(duì)SQL語句做hash運(yùn)算,然后根據(jù)得到的hash值,在庫緩存(library Cache)中查找,找得到就取出來,做軟解析,找不到的話那就只能硬解析。

為了提升sql的執(zhí)行效率,我們應(yīng)該盡量避免硬解析,因?yàn)樵趕ql的執(zhí)行過程中,創(chuàng)建解析樹,生成執(zhí)行計(jì)劃是相當(dāng)耗資源的。

那在Oracle中,如何主動(dòng)避免使用硬解析呢?

Oracle提供了一種方法,就是綁定變量

Oracle中使用綁定變量來避免一類執(zhí)行計(jì)劃的無謂消耗。

在Oracle中,以下兩個(gè)sql語句是會(huì)生成兩套執(zhí)行計(jì)劃的,即使這兩套執(zhí)行計(jì)劃是一模一樣的:

select * from player where player_id = 1001

select * from player where player_id = 1002

只要后面的常數(shù)變了,那么每一次查詢都會(huì)創(chuàng)建一個(gè)新的查詢解析。這種花銷是不必要的,于是Oracle提出了綁定變量:

select * from player where player_id = :player_id

采用了綁定變量后,在第一次查詢后,共享池中就會(huì)緩存此類查詢的執(zhí)行計(jì)劃,主動(dòng)避免了下次的硬解析。

簡(jiǎn)單百度了下,Oracle中應(yīng)該是大量使用綁定變量來主動(dòng)避免硬解析。但并不是說綁定變量就是萬能的,這種類似動(dòng)態(tài)sql的方式,可能過于固化,優(yōu)化的話也比較難。

當(dāng)然,以上是官方說法,我不是很懂,只是下意識(shí)覺得過于僵硬,不容易變通

MySQL中的sql是如何執(zhí)行的

Mysql的執(zhí)行過程跟Oracle有相同的地方,也有不同的地方。

sql語句送入后,

首先進(jìn)行緩存查詢,如果緩存中有這條sql語句,那就直接把結(jié)果返回給客戶端;如果沒有,則進(jìn)入解析器階段。需要特殊說明的是,這種緩存查詢方式效率不高,在MySQL8.0后就被拋棄了。

至于為什么說它查詢效率不高,原因很簡(jiǎn)單。每次表發(fā)生變動(dòng)后,比如說加入了新數(shù)據(jù),原先依賴這張表的緩存查詢就全部失效被清空,而大部分表實(shí)際上都是在時(shí)刻變動(dòng)的,這種緩存機(jī)制只對(duì)不會(huì)更新的靜態(tài)表有作用,對(duì)實(shí)時(shí)更新的動(dòng)態(tài)表來說,這種緩存機(jī)制的作用反而是負(fù)面的,反而增加了sql的查詢時(shí)間,畢竟每次運(yùn)行完后還要花時(shí)間緩存一下結(jié)果,哪怕下一秒這個(gè)結(jié)果就沒用了。

解析器階段,會(huì)做語法分析和語義分析;

然后是優(yōu)化器階段,確定執(zhí)行計(jì)劃;

然后是執(zhí)行器階段,執(zhí)行前會(huì)先進(jìn)行權(quán)限鑒定,判斷該用戶是否具備查詢權(quán)限。如果具備,則執(zhí)行sql并返回結(jié)果。如果是MySQL8.0以下的版本,如果設(shè)置了查詢緩存,則會(huì)同時(shí)將查詢結(jié)果進(jìn)行緩存。

數(shù)據(jù)庫中的SQL是如何執(zhí)行的?

可以看到,MySQL和Oracle的執(zhí)行流程大體上是相同的,或者說執(zhí)行思路是相同的。

不同的地方主要是MySQL的引擎特性引起的。MySQL作為一種優(yōu)秀的開源數(shù)據(jù)庫,其數(shù)據(jù)引擎采用插件的方式,提供了多種引擎可供選擇,甚至,還允許開發(fā)人員設(shè)置自己的開發(fā)引擎。一些具體的開發(fā)引擎就不介紹了,放個(gè)簡(jiǎn)單的截圖吧。
數(shù)據(jù)庫中的SQL是如何執(zhí)行的?

需要注意的一點(diǎn)是,MySQL中每個(gè)表的設(shè)計(jì)都可以采用不同的數(shù)據(jù)庫引擎,你完全可以根據(jù)表本身的特性,靈活選擇其對(duì)應(yīng)的數(shù)據(jù)庫引擎,這也是MySQL的強(qiáng)大之處

另一個(gè)需要提的是,如何在sql中查看每一句sql在執(zhí)行時(shí)所使用的資源和時(shí)間等信息。即使用profiling。具體用法就不提了,需要用到的時(shí)候自己查吧。文章來源地址http://www.zghlxwxcb.cn/news/detail-488343.html

到了這里,關(guān)于數(shù)據(jù)庫中的SQL是如何執(zhí)行的?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Navicat中導(dǎo)入數(shù)據(jù)庫SQL腳本并執(zhí)行

    Navicat中導(dǎo)入數(shù)據(jù)庫SQL腳本并執(zhí)行

    1、打開Navicat數(shù)據(jù)庫管理工具; 2、點(diǎn)擊菜單欄上的“工具”,選擇“命令列界面”; 打開了命令列界面 3、復(fù)制sql腳本到命令列界面內(nèi),按enter(回車)執(zhí)行,會(huì)發(fā)現(xiàn)執(zhí)行成功的OK返回消息,如下所示: 4、刷新,否則無法看到新增的數(shù)據(jù)庫、數(shù)據(jù)表、數(shù)據(jù)表中的記錄

    2024年02月11日
    瀏覽(102)
  • postgresql|數(shù)據(jù)庫|批量執(zhí)行SQL腳本文件的shell腳本

    postgresql|數(shù)據(jù)庫|批量執(zhí)行SQL腳本文件的shell腳本

    對(duì)于數(shù)據(jù)庫的維護(hù)而言,肯定是有SQL腳本的執(zhí)行,例如,某個(gè)項(xiàng)目需要更新,那么,可能會(huì)有很多的SQL腳本需要執(zhí)行,SQL腳本可能會(huì)包含有建表,插入數(shù)據(jù),索引建立,約束建立,主外鍵建立等等內(nèi)容。 那么,幾個(gè)SQL腳本可能無所謂,navicat或者psql命令行 簡(jiǎn)簡(jiǎn)單單的就導(dǎo)入了

    2024年02月01日
    瀏覽(88)
  • 【Sql】sql server數(shù)據(jù)庫提示:執(zhí)行Transact-SQL語句或批處理時(shí)發(fā)生了異常。 無法打開數(shù)據(jù)庫msdb,錯(cuò)誤:926。

    【Sql】sql server數(shù)據(jù)庫提示:執(zhí)行Transact-SQL語句或批處理時(shí)發(fā)生了異常。 無法打開數(shù)據(jù)庫msdb,錯(cuò)誤:926。

    【問題描述】 打開sql server2008r2數(shù)據(jù)庫的時(shí)候, 系統(tǒng)提示執(zhí)行Transact-SQL語句或批處理時(shí)發(fā)生了異常。 無法打開數(shù)據(jù)庫msdb,錯(cuò)誤:926。 【概念理解】 首先MSDB數(shù)據(jù)庫是的作用: 用于給SQL Server代理提供必要的信息來運(yùn)行調(diào)度警報(bào)、作業(yè)及記錄操作。同時(shí)也會(huì)記錄數(shù)據(jù)庫的備份和

    2024年02月04日
    瀏覽(103)
  • SQL Server數(shù)據(jù)庫判斷最近一次的備份執(zhí)行結(jié)果

    SQL Server數(shù)據(jù)庫判斷最近一次的備份執(zhí)行結(jié)果

    在SQL Server的官方文檔里面可以看到備份和還原的表,但是這些表里面只能找到備份成功的相關(guān)信息,無法找到備份失敗的記錄,比如 msdb.dbo.backupset 。對(duì)于一些監(jiān)控系統(tǒng)未監(jiān)控作業(yè)的情況下,想要監(jiān)控?cái)?shù)據(jù)庫備份任務(wù)執(zhí)行失敗而觸發(fā)告警規(guī)則,有些麻煩。 但是SQL server內(nèi)部是

    2024年02月03日
    瀏覽(27)
  • PostgreSQL數(shù)據(jù)庫命令行執(zhí)行SQL腳本的三種方式

    PostgreSQL數(shù)據(jù)庫命令行執(zhí)行SQL腳本的三種方式

    生成環(huán)境中,出于安全性等原因,往往不提供數(shù)據(jù)庫連接工具,所以對(duì)數(shù)據(jù)庫的更新和升級(jí)就得通過命令行來實(shí)現(xiàn)。本文總結(jié)了三種命令行執(zhí)行sql腳本的方式。 命令格式: psql [option…] [dbname] [username] 常用參數(shù)介紹: -h:指定IP地址或主機(jī)名。 -p:指定端口,默認(rèn)為5432。 -U:

    2024年02月11日
    瀏覽(26)
  • mapper.xml中循環(huán)執(zhí)行多條語句時(shí)報(bào)錯(cuò),但是單獨(dú)拿SQL到數(shù)據(jù)庫卻可以執(zhí)行

    mapper.xml中循環(huán)執(zhí)行多條語句時(shí)報(bào)錯(cuò),但是單獨(dú)拿SQL到數(shù)據(jù)庫卻可以執(zhí)行

    我是批量修改數(shù)據(jù),用foreach標(biāo)簽包住update語句,報(bào)錯(cuò)信息如下: 最后解決,在數(shù)據(jù)源配置中添加參數(shù):

    2024年02月12日
    瀏覽(25)
  • Oracle數(shù)據(jù)庫SQL*Plus命令行執(zhí)行SQL語句時(shí),中文亂碼報(bào)錯(cuò)解決方法

    Oracle數(shù)據(jù)庫SQL*Plus命令行執(zhí)行SQL語句時(shí),中文亂碼報(bào)錯(cuò)解決方法

    ??歡迎來到Java學(xué)習(xí)路線專欄~Oracle數(shù)據(jù)庫SQL*Plus命令行執(zhí)行SQL語句時(shí),中文亂碼報(bào)錯(cuò)解決方法 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:Java學(xué)習(xí)路線 ??其他專欄:Java學(xué)習(xí)路線 Java面試技巧 Java實(shí)戰(zhàn)項(xiàng)目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí) ??

    2024年01月22日
    瀏覽(27)
  • 自己動(dòng)手做數(shù)據(jù)庫系統(tǒng):解釋執(zhí)行 update 和 delete 對(duì)應(yīng)的 sql 語句

    在上一節(jié)我們完成了 select 語句的解釋執(zhí)行,本節(jié)我們看看 Update 和 Delete 對(duì)應(yīng)的語句如何解釋執(zhí)行,當(dāng)然他們的實(shí)現(xiàn)原理跟我們前面實(shí)現(xiàn)的 select 語句執(zhí)行大同小異。無論是 update還是 delete 都是對(duì)數(shù)據(jù)表的修改,因此他們的實(shí)現(xiàn)方法基本相同。 假設(shè)我們要執(zhí)行如下 sql 語句:

    2024年01月22日
    瀏覽(26)
  • 【云原生技術(shù)】云計(jì)算中的數(shù)據(jù)庫數(shù)據(jù)傳輸服務(wù)簡(jiǎn)介

    云計(jì)算中的數(shù)據(jù)庫數(shù)據(jù)傳輸服務(wù)是指用于在不同數(shù)據(jù)庫環(huán)境之間遷移和同步數(shù)據(jù)的服務(wù)。這些服務(wù)通常由云服務(wù)提供商提供,用于幫助用戶將他們的數(shù)據(jù)從本地?cái)?shù)據(jù)庫遷移到云數(shù)據(jù)庫,或者在不同的云數(shù)據(jù)庫之間遷移數(shù)據(jù)。這些服務(wù)關(guān)鍵在于確保數(shù)據(jù)遷移的安全性、高效性和

    2024年01月23日
    瀏覽(23)
  • 【JaveWeb教程】(17) MySQL數(shù)據(jù)庫開發(fā)之 MySQL簡(jiǎn)介、安裝、數(shù)據(jù)類型、SQL通用語法 詳細(xì)代碼示例講解

    【JaveWeb教程】(17) MySQL數(shù)據(jù)庫開發(fā)之 MySQL簡(jiǎn)介、安裝、數(shù)據(jù)類型、SQL通用語法 詳細(xì)代碼示例講解

    在我們講解SpringBootWeb基礎(chǔ)知識(shí)(請(qǐng)求響應(yīng)案例)的時(shí)候,我們講到在web開發(fā)中,為了應(yīng)用程序職責(zé)單一,方便維護(hù),我們一般將web應(yīng)用程序分為三層,即:Controller、Service、Dao 。 之前我們的案例中,是這樣子的請(qǐng)求流程:瀏覽器發(fā)起請(qǐng)求,先請(qǐng)求Controller;Controller接收到請(qǐng)求之

    2024年01月25日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包