資料庫系統概論【系統篇】

来源:https://www.cnblogs.com/enochgong/archive/2019/02/08/10355640.html
-Advertisement-
Play Games

一、關係查詢處理和查詢優化 關係資料庫系統的查詢處理 查詢處理的步驟分為4個階段:查詢分析、查詢檢查、查詢優化和查詢執行。 查詢語句(由此語句進行查詢) 1、查詢分析 首先對查詢語句進行掃描、詞法分析和語法分析。對SQL關鍵字、屬性名和關係名等,進行語法檢查和語法分析 ,即判斷查詢語句是否符合SQL ...


一、關係查詢處理和查詢優化

關係資料庫系統的查詢處理

        查詢處理的步驟分為4個階段:查詢分析、查詢檢查、查詢優化和查詢執行。

            查詢語句(由此語句進行查詢)

1、查詢分析

     首先對查詢語句進行掃描、詞法分析和語法分析。對SQL關鍵字、屬性名和關係名等,進行語法檢查和語法分析 ,即判斷查詢語句是否符合SQL語法規則。

2、查詢檢查

     對合法的查詢語句進行語義檢查,即根據數據字典中有關的模式定義檢查語句的資料庫對象,如關係名、屬性名是否存在和有效。

3、查詢優化

    查詢優化和分為代數優化和物理優化:代數優化是指按照一定的規則,通過對關係代數表達式進行等價變換,改變代數表達式中操作的次序和組合,使查詢執行更高效;

                                                                 物理優化則是指存取路徑和底層操作演算法的選擇。選擇的依據可以是基於規則的,也可以是基於代價的,也可以是基於語義的。

4、查詢執行

    依據優化器得到的執行策略生成查詢執行計劃,有代碼生成器(code generator)生成執行這個查詢計劃的代碼,然後加以執行,回送查詢結果;

實現查詢操作的實例:(資料庫優化的最終操作:儘量減少IO的塊數)

       1、選擇操作的實現

           (1)、簡單的全表掃描演算法(table scan)(全掃:io代價:總的塊數m block + O(n)元組代價)

           (2)、索引掃描演算法(index scan) 

                        通過索引先找到滿足條件的元組指針,再通過元組指針在查詢的基本表中找到數組;

        2、連接操作的實現:(連接操作是查詢處理中最常用也是最耗時的操作之一。)

           (1)、嵌套迴圈演算法(nested loop join):在實際實現中數據存取是按照數據塊讀入記憶體,而不是按照元組進行I/O的。

           (2)、排序-合併演算法(sort-merge join或merge join):1、如果參與連接的表沒有排好序,首先對錶按連接屬性排序 。2、在取表中的連接屬性,把它們表中的屬性連接起來。

           (3)、索引連接(index join)演算法:(B+樹   索引+基地址的方式)

           (4)、hash join演算法:以數組的方式:基地址+偏移(快);

關係資料庫系統的查詢優化

       查詢優化的優點不僅在於用戶不必考慮如何最好的表達查詢以獲得較高的效率,而且在於系統可以比用戶程式的“優化”做的更好,這是因為:(1)、優化器可以從數據字典中獲取許多統計信息 (2)、如果資料庫的物理統計信息改變了,系統可以自動對查詢進行重新優化以選擇相適應的執行計劃。(3)、優化器可以考慮數百種不同的執行計劃,而程式員一般只能考慮有限的幾種可能性。

(4)、優化器中包括了許多複雜的優化技術,這些技術往往只有最好的程式員才能掌握。

 

                                        總代價=I/O代價 +CPU代價 +記憶體代價+通信代價(數據結構:記憶體地址    ; 資料庫:硬碟的邏輯地址)

代數優化

       代數優化策略是通過對關係代數表達式的等價變換來提高查詢效率。

        1、連接,笛卡爾積的交換律

        2、連接、笛卡爾積的結合律

        3、投影的串接定律

        4、選擇的串接定律

        5、選擇與投影操作的交換律

        6、選擇與笛卡爾積的交換律

        7、選擇與並的分配律

        8、選擇與差運算的分配律

        9、選擇對自然連接的分配律

       10、投影與笛卡爾積的分配律

        11、投影與並的分配律

  查詢樹的啟髮式優化

      (1)、選擇運算應儘可能先做

      (2)、把投影運算和選擇運算同時進行

      (3)、把投影同其前或其後的雙目運算結合起來

      (4)、把某些選擇同在它前面要執行的笛卡爾積結合起來成為一個連接運算。

      (5)、找出公共子表達式。

物理優化

        代數優化改變查詢語句中操作的次序和組合,但不涉及底層的存取路徑。物理優化就是要選擇高效合理的操作演算法或存取路徑。

        選擇的方法可以是:

        (1)、基於規則的啟髮式優化

        (2)、基於代價估算的優化

        (3)、兩者結合的優化方法

二、資料庫恢復技術

 1、事務

            所謂事務是用戶定義的一個資料庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。

           事務和程式是兩個概念。一般來講,一個程式中包含多個事務。

           在SQL中,定義的事務的語句一般有三條:(1)、BEGIN TRANSACTION (2)、COMMIT:即是提交事務的所有操作。將事務中所有對資料庫的更新寫回到磁碟上的物理資料庫中去。 (3)、ROLLBACK:所有已完成的操作全部撤退,回滾到事務開始時的狀態。

          事務是恢復和併發控制的基本單位。

2、事務的ACID特性

      原子性(Atomicity):事務是資料庫的邏輯工作單位,事務中包括的諸操作要麼是都做,要麼都不做。

     一致性(Consistency):事務執行的結果必須是使資料庫從一個一致狀態變到另一個一致性狀態。

     隔離性(Isolation):一個事務的執行不能被其他事務干擾。

     持續性(Durability):也稱永久性(Permanence),指一個事務一旦提交,它對資料庫中數據的改變就應該是永久性的。

3、故障的種類

     (1)、事務內部的故障:例如運算溢出、併發事務放生死鎖而被選中撤銷該事務、違反了某些完整性限制而被終止等。事務故障意味著事務沒有達到預期的終點,恢復程式要在不影響其他事務運行的情況下,強行回滾該事務,即撤銷該事務已經作出的任何對資料庫的修改,使得該事務好像根本沒有啟動一樣,該類恢復操作稱為事務撤銷(UNDO)

     (2)、系統故障:系統故障是指造成系統停止運轉的任何事件,使得系統要重新啟動。第一個:一些尚未完成的事務的結果可能已送入物理資料庫,從而造成資料庫可能處於不正確的狀態,需要(UNDO);第二個:發生系統故障時,有些已完成的事務可能有一部分甚至全部留在緩衝區,尚未寫回到磁碟上的物理資料庫中,系統故障使得這些事務對資料庫的修改部分或全部丟失,這也會使資料庫處於不一致狀態,因此應將這些事務已提交的結果重新寫入資料庫(REDO)。

     (3)、介質故障

     (4)、電腦病毒

      總結:各類故障對資料庫的影響有兩種可能性,一是資料庫本身被破壞,二是資料庫沒有被破壞,但數據可能不正確,這是由於事務的運行被非正常終止造成的。恢復的基本原理十分簡單,冗餘;利用別處的冗餘數據進行重建。

4、恢復的實現技術

      建立冗餘數據最常用的技術是數據轉儲和登記日誌文件(logging)。資料庫恢復是將資料庫從錯狀態恢復到某一已知的正確狀態的功能。

       4.1、數據轉儲

                靜態轉儲(停機更新)是在系統中無運行事務時進行的轉儲操作。  

               動態轉儲(不停機更新)是指轉儲期間允許對資料庫進行存取或修改。缺點:轉儲結束時後援副本上的數據並不能保證正確有效。

               海量轉儲是指每次轉儲全部資料庫

               增量轉儲則指每次只轉儲上一次轉儲後更新過的數據。

       4.2、登記日誌文件

               日誌文件的格式和內容

               日誌文件是用來記錄事務對資料庫的更新操作的文件;兩種格式:已記錄為單位的日誌文件和以數據塊為單位的日誌文件

               日誌文件中需要登記的內容包括:1、各個事務的開始(BEGIN TRANSACTION)標記   2、各個事務的結束(COMMIT或ROLLBACK)標記  3、各個事務的所有更新操作。

               每個日誌記錄的內容包括:事務標識,操作的類型,操作對象,更新前數據的舊值,更新後數據的新值;對於以數據塊為單位的日誌文件,日誌記錄的內容包括事務標識和被更新的數據塊。

          日誌文件的作用:日誌文件用於保存對數據的更新操作;

           (1)、事務故障恢復和系統故障恢復必須用日誌文件

           (2)、在動態轉儲方式中必須建立日誌文件,後備副本和日誌文件結合起來才能有效地恢複數據庫。

5、恢復策略

      5.1、事務故障的恢復

              (1)、反向掃描日誌文件,查找該事務的更新操作。

              (2)、對該事物的更新操作執行逆操作

              (3)、繼續反向掃描日誌文件,查找該事務的其他更新操作,並做同樣處理

              (4)、如此處理下去,直到讀到此事務的開始標記,事務故障恢復就完成了。

       5.2、系統故障的恢復

                 (1)、正向掃描日誌文件,找出在故障發生前已經提交的事務,將其事務標識記入重做隊列(REDO-LIST)。同時找出故障發生時尚未完成的事務(這些事務只有BEGIN TRANSACTION記錄,無相應的COMMIT記錄),將其事務標識記入撤退隊列(UNDO-LIST)。

                 (2)、反向掃描日誌文件,對每個撤退事務的更新操作執行逆操作,將日誌文件記錄中“更新前的值”寫入資料庫。

                 (3)、對重做隊列中的各個事務進行重做處理

6、具有檢查點的恢復技術

      具體的檢查點(checkpoint)記錄相關技術請查閱相關的書籍。

      系統使用檢查點方法進行恢復的步驟是:

       (1)、從重新開始文件中找到最後一個檢查點記錄在日誌文件中的地址,由該地址在日誌文件中找到最後一個檢查點記錄。

       (2)、由該檢查點記錄得到檢查點建立時刻所有正在執行的事務清單ACTIVE-LIST.

                    UNDO-LIST:需要執行UNDO操作的事務集合

                    REDO-LIST:需要執行REDO操作的事務集合

                  把ACTIVE-LIST暫時放入UNDO-LIST隊列,REDO隊列暫為空。

       (3)、從檢查點開始正向掃描日誌文件。1、如有新開始的事務Ti,把Ti暫時放入UNDO-LIST隊列;2、如有提交的事務Tj,Tj從UNDO-LIST隊列移到REDO-LIST隊列;直到日誌文件結束;

       (4)、對UNDO-LIST中的每個事務執行UNDO操作,對REDO-LIST中的每個事務執行REDO操作。

三、併發控制

         事務可以一個一個地串列執行,即每個時刻只有一個事務運行,其他事務必須等到這個事務結束以後方能運行。在單處理機系統中,事務的並行執行實際上是這些並行事務的並行操作輪流交叉運行。1、CPU時間切片   2、搶占式的運行:誰搶到CPU,誰運行。

         併發操作帶來的數據不一致性包括丟失修改(lost update)、不可重覆讀(non-repeatable read)、讀“臟”數據(dirty read).

                   具體的操作可以參考相關的資料

       併發控制的主要技術有封鎖(locking)、時間戳(timestamp)、樂觀控製法(optimistic scheduler)和多版本併發控制(multi-version concurrency control,MVCC)等。

封鎖

      基本的封鎖類型有兩種:排它鎖(exclusive locks,簡稱X鎖)和共用鎖(share locks,簡稱S鎖)。

     排他鎖又稱為寫鎖。

     共用鎖又稱為讀鎖。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當前的網路中有三種通訊模式:單播、廣播、組播(多播),其中的組播出現時間最晚但同時具備單播和廣播的優點,最具有發展前景。 一、單播: 主機之間“一對一”的通訊模式,網路中的交換機和路由器對數據只進行轉發不進行複製。如果10個客戶機需要相同的數據,則伺服器需要逐一傳送,重覆10次相同的工作。但由於其能 ...
  • 今天我們簡單歸總下客戶端加域的先決條件或著說準備工作,方便新手或者管理員日常加域失敗排錯等內容,希望可以幫到大家。一.網路準備:(保證客戶端與域控解析與網路通信正常)DHCP模式:DHCP已指定域控為主備DNS,客戶端IP地址是DHCP無需手動指定DNS地址。靜態IP模式:客戶端IP地址是手動指定的... ...
  • 以前折騰的時候禁用過,現在已經忘記目錄了,結果今天手賤把系統從 18.04 升級到了 18.10 ,很多東西都要重新搞過,而且用慣了 mac 已經不熟悉 linux 上瞎折騰的那一套了,簡直坑爹。。 由於已經手動裝了 和 兩個擴展,所以預設的已經沒用啦,考慮把它們禁掉,首先要找到它們所在的目錄: 只 ...
  • 簡單對客戶端加域埠做彙總操作,希望對大家有幫助。之前有對服務埠做彙總,具體請參照:Windows Server 2016-Active Directory域服務埠彙總:http://blog.51cto.com/wenzhongxiang/2088693 協議埠埠類型備註 TCP/UDP5... ...
  • 最近在學習Linux操作系統。學到了關於定時任務的章節,作為一個總結寫下這篇文章。在Linux中,我們可以將耗時大的任務如複製大文件,壓縮、解壓縮大文件等放進定時任務中(深夜執行,因為工作時間訪問量大,這類操作會影響系統運行)。 Linux操作系統中關於定時任務主要有種操作方式: 1. at 一次性 ...
  • 目錄 1. 單用戶模式 2. 救援模式 3. 總結 1、 單用戶模式 單用戶模式可以對系統進行修複,如:修改root密碼,修改因配置不正確而導致系統啟動失敗的配置文件等。 (1) Centos7進入單用戶模式 1) 進入grub2菜單時按 ‘e’ 進入編輯模式 2) 在編輯模式中下翻,在指定行修改 ...
  • 在內核分析網路分組時,底層協議的數據將傳輸到跟高的層。而發送數據的時候順序是相反的。每一層都是通過加(首部+凈荷)傳向跟底層,直至最終發送。 這些操作決定了網路的的性能。 就如下圖所示 linux因此設計了一個結構體 如下代碼 套接字換從區在各個層交換數據,就不用複製數據了。 從以上欄位和註釋可以看 ...
  • 1. HDFS Shell基礎 [root@master hadoop]# hadoop fsUsage: hadoop fs [generic options] [-appendToFile <localsrc> ... <dst>] [-cat [-ignoreCrc] <src> ...] [ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...