當前位置:首頁 » 服務存儲 » 磁碟存儲器管理實驗心得體會
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

磁碟存儲器管理實驗心得體會

發布時間: 2022-11-06 00:39:28

Ⅰ 計算機拆裝的心得體會

經過四天的實習,我著實替我自己捏了一把汗,因為我在實習中遇到了所有可能遇到的問題,如果從學習的角度來說,遇到更多的問題還是很幸運的!實習時我們雖然用的是比較新的機箱,但是問題往往隱藏在那華麗的機箱內部;我們從第一天一開始啟動機子,困難就用藍屏來刁難我們,我們但並沒有被困難嚇到,而是開始了攻克難關的艱難旅程。我們從顯卡開始檢查,經由CPU,顯示器,內部連線,再到電源逐一進行檢測,我們各盡所能,努力尋找問題所在,哲言說的好「努力一定會有結果,但結果未必是好結果」,現實是殘酷的,我們最終還是「抱著希望去,帶著失望來」一切措施都實施了,但是問題依然未被解決,連同組的同學都對我投來了失望的目光,我也自感失望,因為平時他們是比較信任我的,為了能夠解決問題,我們請教了所有能夠請教的同學,我們每次都是失望而歸,最後我們只能求助於老師了,老師經過一番研究發現:這台主機主板根本不通電,即使看起來外表很是誘人。結果讓我們很是失望,我們最後只能對那新機子說拜拜啦!

另外,我感覺組裝實習對我的幫助很大,平日里的理論學習只是紙上談兵,並不能很好的掌握計算機組裝的實際情況,而且也容易產生反感,但是只有結合實踐的組裝學習,才容易被接受,被吸收被理解,只有自己實實在在的摸過,自己才敢說自己掌握了多少東西。

總之,經過這次實習,我掌握了書本上沒有的一些東西,讓我受益匪淺

Ⅱ 什麼是磁碟存儲

平均等待時間和磁碟轉速有關,它用磁碟旋轉一周所需時間的一半來表示
通常,採用平均等待時間來表示,平均等待時間為磁碟旋轉半圈所需要的時間
所以選b

Ⅲ 磁碟存儲器的物理特性

磁碟兩面塗有可磁化介質的平面圓片,數據按閉合同心圓軌道記錄在磁性介質上,這種同心圓軌道稱磁軌。磁碟的主要技術參數記錄密度包括位密度、道密度和面密度。位密度指碟片同心圓軌道上單位長度上記錄多少位單元,用位/毫米(bpmm)表示;道密度是指記錄面徑向每單位長度上所能容納的磁軌數,常用道/毫米(tpmm)表示;面密度是指記錄面上單位面積所記錄的位單元,常用位/毫米2表示。磁碟的存儲容量是磁碟上所能記錄二進制數碼的總量,常用千位元組(KB)或兆位元組(MB)來表示。存取時間包括磁頭從一道移到另一道所需的時間、磁頭移動後的穩時間、碟片旋轉等待時間、磁頭載入時間常用毫秒(ms)表示。誤碼率指在向設備寫入一批數據並回讀後,所檢出的錯誤位數與這一批數據總位數的比值。

Ⅳ 磁碟存儲器中磁軌,柱面,扇區有什麼作用

①磁軌:每個碟片的每一面都要劃分成若干條形如同心圓的磁軌,這些磁軌就是磁頭讀寫數據的路徑。磁碟的最外層是第0道,最內層是第n道。
②柱面:一個硬碟由幾個碟片組成,每個碟片又有兩個盤面,每個盤面都有相同數目的磁軌。所有盤面上相同半徑的磁軌組合在一起,叫做一個柱面。
③扇區:為了存取數據的方便,每個磁軌又分為許多稱之為扇區的小區段。每個磁軌(不管是里圈還是外圈)上的扇區數是一樣的,每個磁軌記錄的數據也是一樣多。所以內圈磁軌上的記錄密度要大於外圈磁軌上的記錄密度。

Ⅳ 誰知道磁碟管理的作用

磁碟管理是一項使用計算機時的常規任務,Windows 2000 Server的磁碟管理任務是以一組磁碟管理應用程序的形式提供給用戶的,它們位於「計算機管理」控制台中,包括查錯程序、磁碟碎片整理程序、磁碟整理程序等。
磁碟存儲器不僅容量大,存取速度快,而且可以實現隨機存取,是實現虛擬存儲器所必需的硬體。因此在現代計算機系統中,都配置了磁碟存儲器,並以它為主,存放文件。磁碟存儲管理的主要任務是:
·為文件分配必要的存儲空間;
·提高磁碟存儲空間的利用率;
·提高對磁碟的I/O速度,以改善文件系統的性能;
·採取必要的冗餘措施,來確保文件系統的可靠性。
1.磁碟調度演算法
磁碟是可被多個進程共享的設備。當有多個進程都請求訪問磁碟時,應採用一種適當的調度演算法,以使各進程對磁碟的平均訪問(主要是尋道)時間最小。由於在訪問磁碟的時間中,主要是尋道時間,因此,磁碟調度的目標應是使磁碟的平均尋道時間最少。目前常用的磁碟調度演算法有:先來先服務;最短尋道時間優先;掃描演算法;循環掃描演算法等。
(1)先來先服務.(First-Come,First-Served,FCFS)
這是一種簡單的磁碟調度演算法。它根據進程請求訪問磁碟的先後次序進行調度。此演算法的優點是公平、簡單,且每個進程的請求都能依次得到處理,不會出現某一進程的請求長期得不到滿足的情況。但此演算法由於未對尋道進行優化,致使平均尋道時間可能較長。圖4-5示出了有9個進程先後提出磁碟I/O請求時,按FCFS演算法進行調度的情況。這里,將進程號(請求者)按其發出請求的先後次序排列。這樣,平均尋道距離為55.3條磁軌。與後面要講的幾種調度演算法相比,其平均尋道距離較大。故FCFS演算法僅適用於請求磁碟I/O的進程數目較少的場合。
(2)最短尋道時間優先(ShortestSeekTimeFirst,SSTF)
該演算法選擇這樣的進程,其要求訪問的磁軌與當前磁頭所在的磁軌距離最近,以使每次的尋道時間最短,但這種調度演算法卻不能保證平均尋道時間最短。圖4-6所示按SSTF演算法進行調度時,各進程被調度的次序,每次磁頭的移動距離,以及9次磁頭移動的平均距離。比較圖4-5和圖4-6可以看出,SSTF演算法的平均每次磁頭移動距離,明顯低於FCFS的距離。SSTF較之FCFS有更好的尋道性能,故過去一度被廣泛採用過。
(3)各種掃描演算法
1)掃描(SCAN)演算法。SSTF演算法雖然獲得較好的尋道性能,但它可能導致某些進程發生「飢餓」(starvation)。SCAN演算法不僅考慮到欲訪問的磁軌與當前磁軌的距離,更優先考慮的是磁頭的當前移動方向。例如,當磁頭正在自里向外移動時,SCAN演算法所選擇的下一個訪問對象應是其欲訪問的磁軌既在當前磁軌之外,又是距離最近的。這樣自里向外地訪問,直到再五更外的磁軌需要訪問才將磁臂換向,自外向里移動。這時,同樣也是每次選擇這樣的進程來調度,即其要訪問的磁軌,在當前磁軌之內,從而避免了飢餓現象的出現。由於這種演算法中磁頭移動的規律頗似電梯的運行,露故又稱為電梯調度演算法。
2)循環掃描(CSCAN)演算法。處理該進程的請求,致使該進程的請求被嚴重地推遲。為了減少這種延遲,CSCAN演算法規定磁頭單向移動。例如,只自里向外移動,當磁頭移到最外的被訪問磁軌時,磁頭立即返回到最里的欲訪磁軌,即將最小磁軌號緊接著最大磁軌號構成循環,進行掃描。
2.廉價冗餘磁碟陣列RAID
磁碟系統中比較引人注目的是廉價冗餘磁碟陣列(Rendant arrays ofinexpensive disk,RAID)的發展,這是將並行處理原理引入磁碟系統。它採用低成本的小溫盤,使多台磁碟構成磁碟陣列,數據展開存儲在多台磁碟上,提高數據傳輸的帶寬,並利用冗餘技術提高可靠性。磁碟陣列還具有容量大,數據傳輸率高,功耗低,體積小,成本低和便於維護等優點。1987年美國加州大學伯克利分校的D.A.Patterson等人,首先提出了廉價冗餘磁碟陣列的概念,並將RAID分為6級:
RAID-0。該級僅提供了並行交叉存取。它雖然有效提高了磁碟I/O速度,但並無冗餘校驗功能,致使磁碟系統的可靠性不好。只要陣列中有一個磁碟損壞,便會造成不可彌補的數據丟失。
RAID-1。它是鏡像磁碟冗餘陣列,將每一數據塊重復存人鏡像磁碟,以改善磁碟機的可靠性。鏡像盤也稱拷貝盤,它相當於一個不斷進行備份操作的磁碟。這種磁碟的冗餘度為100%,使有效容量下降了一半,成本較高。鏡像盤是磁碟陣列的簡單形式。
RAID-2。它是採用海明碼糾錯冗餘的磁碟陣列,將數據位交叉寫人幾個磁碟中,並利用幾個磁碟驅動器進行按位的出錯檢查,它比鏡像磁碟冗餘陣列的冗餘度小。這種陣列中的數據讀寫操作涉及陣列中的每一個磁碟,這影響小文件的傳輸率,因此它適合於大量順序數據訪問。
RAID-3。它是採用奇偶校驗冗餘的磁碟陣列,也採用數據位交叉,陣列中只有一個校驗盤。將數據按位交叉寫到幾個磁碟上,用一個校驗盤檢查數據錯誤。各磁碟同步運轉,陣列中的驅動器數量可擴展。這種陣列冗餘度較小,因為採用數據位交叉,所以也適合大量順序數據訪問。
RAID-4。它是一種獨立傳送磁碟陣列,採用數據塊交叉,用一個校驗盤。將數據按塊交叉存儲在多個磁碟上。在數據不沖突時,多個磁碟可並行進行數據讀操作。這種磁碟陣列適用於小塊數據讀寫,它的小塊數據傳輸速度比RAID-3快。
RAID-5。它也是一種獨立傳送磁碟陣列,採用數據塊交叉和分布的冗餘校驗,將數據和校驗都分布在各個磁碟中,沒有專門的奇偶校驗驅動器。奇偶校驗碼被分布存放在陣列中各驅動器中,磁碟冗餘度低,使並行讀寫操作成為可能。這種方法也適用於小塊數據的讀寫。但對控制器的要求較高,是最難實現的一種磁碟陣列。
RAID自1988年面世後,很快流行起來,這主要是因為RAID具有以下明顯的優點:
可靠性高。RAID的最大特點就是它的高可靠性。除了RAID-0級外,其餘各級都採用了容錯技術。與單台磁碟機相比,其可靠性往往高出一個數量級。
磁碟I/O速度高。由於磁碟陣列採取並行交叉存取,故可將磁碟I/O速度提高N-1倍,N為磁碟數目。性能/價格比高。利用RAID技術實現犬容量高速存儲器時,其體積與相同容量和速度的大型磁碟系統相比,只是後者的三分之一,價格也是後者的三分之一,且可靠性更高。

Ⅵ I/O設備管理

I/O系統不僅包括 各種I/O設備 ,還包括與設備相連的 設備控制器 ,有些系統還配備了專門用於輸入/輸出控制的專用計算機( 通道 ),此外: I/O系統要通過匯流排與CPU、內存相連

I/O系統的結構分為兩大類:

CPU與內存之間可以直接進行信息交換,但是 不能直接與設備進行信息交換 ,必須經過 設備控制器

主機I/O系統採用四級結構,包括: 主機、通道、設備控制器和設備

一個通道可以控制多個設備控制器。

一個設備控制器可以控制多個設備。

設備控制器是 CPU與I/O設備之間的介面 ,接收I/O命令並 控制設備 完成I/O工作。

設備控制器是一個 可編址設備 ,鏈接多個設備時可有多個設備地址。

一種特殊的處理機,它具有執行I/O指令的能力,並通過執行通道程序來控制I/O操作。

大型主機系統中 專門用於I/O的專用計算機

引入通道能夠使CPU從控制I/O操作的任務中解脫,使 CPU與I/O並行工作 ,提高CPU利用率和系統吞吐量。

目的:盡量 減少 主機對輸入/輸出控制的 干預 提高 主機與輸入/輸出的 並行程度

工作流程:

缺點:

使CPU經常處於 循環檢測狀態 ,造成 CPU的極大浪費 ,影響整個進程的 吞吐量

現在計算機系統廣泛採用中斷控制方式完成對I/O控制。

工作流程:

優點:

使CPU和I/O設備在某些時間段上 並行工作 ,提高 CPU利用率 系統吞吐量

DMA控制器結構:

DMA控制器中的寄存器:

工作流程:

緩沖區是用來 保存兩個設備之間或設備與應用程序之間傳輸數據的內存區域

由於CPU的速度遠遠高於I/O設備,為了 盡可能使CPU與設備並行工作 ,提高系統的性能,通常需要操作系統在設備管理軟體中提供緩沖區管理功能。

在數據到達速率與數據離去速率不同的地方,都可以引入緩沖區。

引入緩沖的原因:

引入緩沖的主要作用:

最簡單 的緩沖類型,在主存儲器的系統區中 只設立一個緩沖區

用戶進程發出I/O請求時,操作系統為該操作分配一個位於主存的緩沖區。

當一個進程往這一個緩沖區中傳輸數據(或從這個緩沖區讀取數據)時,操作系統正在清空(或填充)另一個緩沖區,這個技術稱為雙緩沖(Double Buffering),或緩沖交換(Buffering Swapping)。

在數據到達和數據離去的速度差別很大的情況下,需要增加緩沖區的數量。

多個緩沖區:

多個指針:

Getbuf過程:

Releasebuf過程:

進程使用完緩沖區後,使用Releasebuf過程 釋放緩沖區

公共緩沖池中設置多個可供若干進程共享的緩沖區,提高緩沖區的利用率。

緩沖池的組成:

支持設備分配的數據結構需要記錄設備的狀態(忙或空閑)、設備類型等基本信息。

系統為每個設備建立一張設備控製表,多張設備控制構成設備控製表集合。

每張設備控製表,包含:

系統為每個控制器設置一張 用於記錄該控制器信息 的控制器控製表。通常包含:

系統為每個通道設備設一張通道控製表,通常包含:

記錄了 系統中全部設備 的情況,每個設備佔一個表目,其中包括:

關鍵點:是否具備 「請求和保持」 的條件。

基本含義: 應用程序獨立於具體使用的物理設備

應用程序中,使用 邏輯設備名稱 來請求使用某類設備。

系統在實際執行時,必須使用 物理設備名稱

實現設備獨立性 帶來的好處

設備獨立軟體的功能:

獨占設備的分配程序:

在多道程序環境下,利用 一道程序 來模擬 離線輸入 時的 外圍控制機 的功能,把低速I/O設備上的數據傳送到高速輸出磁碟上,再利用 另一道程序 來模擬 離線輸出 外圍控制機 的功能,把數據從磁碟傳送到低速輸出設備上。

這種在 聯機情況下實現的同時外圍操作 稱為SPOOLing。

SPOOLing的 組成

利用SPOOLing技術 實現共享列印機

SPOOLing的 特點

輸入輸出軟體總體目標是 將軟體組織成一種層次結構

低層軟體 用來屏蔽硬體的具體細節。

高層軟體 則主要是為用戶提供一個簡潔、規范的界面。

設備管理的4個層次:

將發出I/O請求而被阻塞的進程喚醒。

設備驅動程序是 I/O進程與設備控制器之間的通信程序 ,其主要任務接受上層軟體發來的抽象的I/O請求,如 read 和 write 命令,把它們轉換為具體要求後,發送給設備控制器啟動設備去執行。

磁碟存儲器不僅 容量大,存取速度快 ,而且可以實現 隨機存取 ,是存放大量程序和數據的理想設備。

磁碟管理的 重要目標 :提高磁碟 空間利用率 和磁碟 訪問速度

一個物理記錄存儲在一個扇區上,磁碟存儲的物理記錄數目是由 扇區數、磁軌數 磁碟面數 決定的。

磁碟類型:

磁碟訪問時間:

磁碟調度的一個重要目標是 使磁碟的平均尋道時間最少 。包括有:

最簡單 的磁碟調度演算法。

根據進行 請求訪問磁碟的先後順序 進行調度。

優點:公平、簡單,且每個進程的請求都能依次得到處理,不會出現某一進程的請求長期得不到滿足的情況

缺點:平均尋道時間較長

該演算法選擇的進程:其 要求訪問的磁軌 當前磁頭所在的磁軌 距離 最近 ,以使每次的尋道時間最短。

優點:每次的尋道時間最短

缺點:可能導致某個進程發生 飢餓 現象

又叫 電梯調度演算法 ,不僅考慮到要訪問的磁軌與當前磁軌的距離,更優先考慮磁頭當前的移動方向。

優點:有較好的尋道性能,防止 「飢餓」 現象

缺點:有時候進程請求被大大推遲

在掃描演算法的基礎上,規定磁頭是單向移動的。將最小磁軌號緊接著最大磁軌號構成循環,進行循環掃描。

NStepSCAN :FCFS + SCAN

FSCAN

Ⅶ 為什麼這個存儲過程執行的性能這么差

大家都在討論關於資料庫優化方面的東東,剛好參與開發了一個數據倉庫方面的項目,以下的一點東西算是資料庫優化方面的學習 實戰的一些心得體會了,拿出來大家共享。歡迎批評指正阿!

sql語句:
是對資料庫(數據)進行操作的惟一途徑;
消耗了70%~90%的資料庫資源;獨立於程序設計邏輯,相對於對程序源代碼的優化,對SQL語句的優化在時間成本和風險上的代價都很低;
可以有不同的寫法;易學,難精通。

SQL優化:
固定的SQL書寫習慣,相同的查詢盡量保持相同,存儲過程的效率較高。
應該編寫與其格式一致的語句,包括字母的大小寫、標點符號、換行的位置等都要一致

ORACLE優化器:
在任何可能的時候都會對表達式進行評估,並且把特定的語法結構轉換成等價的結構,這么做的原因是
要麼結果表達式能夠比源表達式具有更快的速度
要麼源表達式只是結果表達式的一個等價語義結構
不同的SQL結構有時具有同樣的操作(例如:= ANY (subquery) and IN (subquery)),ORACLE會把他們映射到一個單一的語義結構。

1 常量優化:
常量的計算是在語句被優化時一次性完成,而不是在每次執行時。下面是檢索月薪大於2000的的表達式:
sal > 24000/12
sal > 2000
sal*12 > 24000
如果SQL語句包括第一種情況,優化器會簡單地把它轉變成第二種。
優化器不會簡化跨越比較符的表達式,例如第三條語句,鑒於此,應盡量寫用常量跟欄位比較檢索的表達式,而不要將欄位置於表達式當中。否則沒有辦法優化,比如如果sal上有索引,第一和第二就可以使用,第三就難以使用。

2 操作符優化:
優化器把使用LIKE操作符和一個沒有通配符的表達式組成的檢索表達式轉換為一個「=」操作符表達式。
例如:優化器會把表達式ename LIKE 'SMITH'轉換為ename = 'SMITH'
優化器只能轉換涉及到可變長數據類型的表達式,前一個例子中,如果ENAME欄位的類型是CHAR(10), 那麼優化器將不做任何轉換。
一般來講LIKE比較難以優化。

其中:
~~ IN 操作符優化:
優化器把使用IN比較符的檢索表達式替換為等價的使用「=」和「OR」操作符的檢索表達式。
例如,優化器會把表達式ename IN ('SMITH','KING','JONES')替換為
ename = 'SMITH' OR ename = 'KING' OR ename = 'JONES『

~~ ANY和SOME 操作符優化:
優化器將跟隨值列表的ANY和SOME檢索條件用等價的同等操作符和「OR」組成的表達式替換。
例如,優化器將如下所示的第一條語句用第二條語句替換:
sal > ANY (:first_sal, :second_sal)
sal > :first_sal OR sal > :second_sal
優化器將跟隨子查詢的ANY和SOME檢索條件轉換成由「EXISTS」和一個相應的子查詢組成的檢索表達式。
例如,優化器將如下所示的第一條語句用第二條語句替換:
x > ANY (SELECT sal FROM emp WHERE job = 'ANALYST')
EXISTS (SELECT sal FROM emp WHERE job = 'ANALYST' AND x > sal)

~~ ALL操作符優化:
優化器將跟隨值列表的ALL操作符用等價的「=」和「AND」組成的表達式替換。例如:
sal > ALL (:first_sal, :second_sal)表達式會被替換為:
sal > :first_sal AND sal > :second_sal
對於跟隨子查詢的ALL表達式,優化器用ANY和另外一個合適的比較符組成的表達式替換。例如
x > ALL (SELECT sal FROM emp WHERE deptno = 10) 替換為:
NOT (x <= ANY (SELECT sal FROM emp WHERE deptno = 10))
接下來優化器會把第二個表達式適用ANY表達式的轉換規則轉換為下面的表達式:
NOT EXISTS (SELECT sal FROM emp WHERE deptno = 10 AND x <= sal)

~~ BETWEEN 操作符優化:
優化器總是用「>=」和「<=」比較符來等價的代替BETWEEN操作符。
例如:優化器會把表達式sal BETWEEN 2000 AND 3000用sal >= 2000 AND sal <= 3000來代替。

~~ NOT 操作符優化:
優化器總是試圖簡化檢索條件以消除「NOT」邏輯操作符的影響,這將涉及到「NOT」操作符的消除以及代以相應的比較運算符。
例如,優化器將下面的第一條語句用第二條語句代替:
NOT deptno = (SELECT deptno FROM emp WHERE ename = 'TAYLOR')
deptno <> (SELECT deptno FROM emp WHERE ename = 'TAYLOR')
通常情況下一個含有NOT操作符的語句有很多不同的寫法,優化器的轉換原則是使「NOT」操作符後邊的子句盡可能的簡單,即使可能會使結果表達式包含了更多的「NOT」操作符。
例如,優化器將如下所示的第一條語句用第二條語句代替:
NOT (sal < 1000 OR comm IS NULL)
NOT sal < 1000 AND comm IS NOT NULL sal >= 1000 AND comm IS NOT NULL

如何編寫高效的SQL:
當然要考慮sql常量的優化和操作符的優化啦,另外,還需要:

1 合理的索引設計:
例:表record有620000行,試看在不同的索引下,下面幾個SQL的運行情況:
語句A
SELECT count(*) FROM record
WHERE date >'19991201' and date < '19991214『 and amount >2000

語句B
SELECT count(*) FROM record
WHERE date >'19990901' and place IN ('BJ','SH')

語句C
SELECT date,sum(amount) FROM record
group by date
1 在date上建有一個非聚集索引
A:(25秒)
B:(27秒)
C:(55秒)
分析:
date上有大量的重復值,在非聚集索引下,數據在物理上隨機存放在數據頁上,在范圍查找時,必須執行一次表掃描才能找到這一范圍內的全部行。
2 在date上的一個聚集索引
A:(14秒)
B:(14秒)
C:(28秒)
分析:
在聚集索引下,數據在物理上按順序在數據頁上,重復值也排列在一起,因而在范圍查找時,可以先找到這個范圍的起末點,且只在這個范圍內掃描數據頁,避免了大范圍掃描,提高了查詢速度。
3 在place,date,amount上的組合索引
A:(26秒)
C:(27秒)
B:(< 1秒)
分析:
這是一個不很合理的組合索引,因為它的前導列是place,第一和第二條SQL沒有引用place,因此也沒有利用上索引;第三個SQL使用了place,且引用的所有列都包含在組合索引中,形成了索引覆蓋,所以它的速度是非常快的。
4 在date,place,amount上的組合索引
A: (< 1秒)
B:(< 1秒)
C:(11秒)
分析:
這是一個合理的組合索引。它將date作為前導列,使每個SQL都可以利用索引,並且在第一和第三個SQL中形成了索引覆蓋,因而性能達到了最優。

總結1
預設情況下建立的索引是非聚集索引,但有時它並不是最佳的;合理的索引設計要建立在對各種查詢的分析和預測上。一般來說:
有大量重復值、且經常有范圍查詢(between, >,< ,>=,< =)和order by、group by發生的列,考慮建立聚集索引;
經 常同時存取多列,且每列都含有重復值可考慮建立組合索引;在條件表達式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。比如在雇員 表的「性別」列上只有「男」與「女」兩個不同值,因此就無必要建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重降低更新速度。
組合索引要盡量使關鍵查詢形成索引覆蓋,其前導列一定是使用最頻繁的列。

2 避免使用不兼容的數據類型:
例如float和INt、char和varchar、bINary和varbINary是不兼容的。數據類型的不兼容可能使優化器無法執行一些本來可以進行的優化操作。例如:
SELECT name FROM employee WHERE salary > 60000
在這條語句中,如salary欄位是money型的,則優化器很難對其進行優化,因為60000是個整型數。我們應當在編程時將整型轉化成為錢幣型,而不要等到運行時轉化。

3 IS NULL 與IS NOT NULL:
不 能用null作索引,任何包含null值的列都將不會被包含在索引中。即使索引有多列這樣的情況下,只要這些列中有一列含有null,該列就會從索引中排 除。也就是說如果某列存在空值,即使對該列建索引也不會提高性能。任何在WHERE子句中使用is null或is not null的語句優化器是不允 許使用索引的。

4 IN和EXISTS:
EXISTS要遠比IN的效率高。裡面關繫到full table scan和range scan。幾乎將所有的IN操作符子查詢改寫為使用EXISTS的子查詢。
例子:
語句1
SELECT dname, deptno FROM dept
WHERE deptno NOT IN
(SELECT deptno FROM emp);
語句2
SELECT dname, deptno FROM dept
WHERE NOT EXISTS
(SELECT deptno FROM emp
WHERE dept.deptno = emp.deptno);
明顯的,2要比1的執行性能好很多
因為1中對emp進行了full table scan,這是很浪費時間的操作。而且1中沒有用到emp的INdex,
因為沒有WHERE子句。而2中的語句對emp進行的是range scan。

5 IN、OR子句常會使用工作表,使索引失效:
如果不產生大量重復值,可以考慮把子句拆開。拆開的子句中應該包含索引。

6 避免或簡化排序:
應當簡化或避免對大型表進行重復的排序。當能夠利用索引自動以適當的次序產生輸出時,優化器就避免了排序的步驟。以下是一些影響因素:
索引中不包括一個或幾個待排序的列;
group by或order by子句中列的次序與索引的次序不一樣;
排序的列來自不同的表。
為了避免不必要的排序,就要正確地增建索引,合理地合並資料庫表(盡管有時可能影響表的規范化,但相對於效率的提高是值得的)。如果排序不可避免,那麼應當試圖簡化它,如縮小排序的列的范圍等。

7 消除對大型錶行數據的順序存取:
在 嵌套查詢中,對表的順序存取對查詢效率可能產生致命的影響。比如採用順序存取策略,一個嵌套3層的查詢,如果每層都查詢1000行,那麼這個查詢就要查詢 10億行數據。避免這種情況的主要方法就是對連接的列進行索引。例如,兩個表:學生表(學號、姓名、年齡??)和選課表(學號、課程號、成績)。如果兩個 表要做連接,就要在「學號」這個連接欄位上建立索引。
還可以使用並集來避免順序存取。盡管在所有的檢查列上都有索引,但某些形式的WHERE子句強迫優化器使用順序存取。下面的查詢將強迫對orders表執行順序操作:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
雖然在customer_num和order_num上建有索引,但是在上面的語句中優化器還是使用順序存取路徑掃描整個表。因為這個語句要檢索的是分離的行的集合,所以應該改為如下語句:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
這樣就能利用索引路徑處理查詢。

8 避免相關子查詢:
一個列的標簽同時在主查詢和WHERE子句中的查詢中出現,那麼很可能當主查詢中的列值改變之後,子查詢必須重新查詢一次。查詢嵌套層次越多,效率越低,因此應當盡量避免子查詢。如果子查詢不可避免,那麼要在子查詢中過濾掉盡可能多的行。

9 避免困難的正規表達式:
MATCHES和LIKE關鍵字支持通配符匹配,技術上叫正規表達式。但這種匹配特別耗費時間。例如:SELECT * FROM customer WHERE zipcode LIKE 「98_ _ _」
即使在zipcode欄位上建立了索引,在這種情況下也還是採用順序掃描的方式。如果把語句改為SELECT * FROM customer WHERE zipcode >「98000」,在執行查詢時就會利用索引來查詢,顯然會大大提高速度。
另外,還要避免非開始的子串。例如語句:SELECT * FROM customer WHERE zipcode[2,3] >「80」,在WHERE子句中採用了非開始子串,因而這個語句也不會使用索引。

10 不充份的連接條件:
例:表card有7896行,在card_no上有一個非聚集索引,表account有191122行,在account_no上有一個非聚集索引,試看在不同的表連接條件下,兩個SQL的執行情況:
SELECT sum(a.amount) FROM account a,card b WHERE a.card_no = b.card_no
(20秒)
將SQL改為:
SELECT sum(a.amount) FROM account a,card b WHERE a.card_no = b.card_no and a.account_no=b.account_no
(< 1秒)
分析:
在第一個連接條件下,最佳查詢方案是將account作外層表,card作內層表,利用card上的索引,其I/O次數可由以下公式估算為:
外層表account上的22541頁 (外層表account的191122行*內層表card上對應外層表第一行所要查找的3頁)=595907次I/O
在第二個連接條件下,最佳查詢方案是將card作外層表,account作內層表,利用account上的索引,其I/O次數可由以下公式估算為:
外層表card上的1944頁 (外層表card的7896行*內層表account上對應外層表每一行所要查找的4頁)= 33528次I/O
可見,只有充份的連接條件,真正的最佳方案才會被執行。
多表操作在被實際執行前,查詢優化器會根據連接條件,列出幾組可能的連接方案並從中找出系統開銷最小的最佳方案。連接條件要充份考慮帶有索引的表、行數多的表;內外表的選擇可由公式:外層表中的匹配行數*內層表中每一次查找的次數確定,乘積最小為最佳方案。
不可優化的WHERE子句
例1
下列SQL條件語句中的列都建有恰當的索引,但執行速度卻非常慢:
SELECT * FROM record WHERE substrINg(card_no,1,4)='5378'
(13秒)
SELECT * FROM record WHERE amount/30< 1000
(11秒)
SELECT * FROM record WHERE convert(char(10),date,112)='19991201'
(10秒)
分析:
WHERE子句中對列的任何操作結果都是在SQL運行時逐列計算得到的,因此它不得不進行表搜索,而沒有使用該列上面的索引;如果這些結果在查詢編譯時就能得到,那麼就可以被SQL優化器優化,使用索引,避免表搜索,因此將SQL重寫成下面這樣:
SELECT * FROM record WHERE card_no like '5378%'
(< 1秒)
SELECT * FROM record WHERE amount< 1000*30
(< 1秒)
SELECT * FROM record WHERE date= '1999/12/01'
(< 1秒)

11 存儲過程中,採用臨時表優化查詢:

1.從parven表中按vendor_num的次序讀數據:
SELECT part_num,vendor_num,price FROM parven ORDER BY vendor_num
INTO temp pv_by_vn
這個語句順序讀parven(50頁),寫一個臨時表(50頁),並排序。假定排序的開銷為200頁,總共是300頁。
2.把臨時表和vendor表連接,把結果輸出到一個臨時表,並按part_num排序:
SELECT pv_by_vn,* vendor.vendor_num FROM pv_by_vn,vendor
WHERE pv_by_vn.vendor_num=vendor.vendor_num
ORDER BY pv_by_vn.part_num
INTO TMP pvvn_by_pn
DROP TABLE pv_by_vn
這 個查詢讀取pv_by_vn(50頁),它通過索引存取vendor表1.5萬次,但由於按vendor_num次序排列,實際上只是通過索引順序地讀 vendor表(40+2=42頁),輸出的表每頁約95行,共160頁。寫並存取這些頁引發5*160=800次的讀寫,索引共讀寫892頁。
3.把輸出和part連接得到最後的結果:
SELECT pvvn_by_pn.*,part.part_desc FROM pvvn_by_pn,part
WHERE pvvn_by_pn.part_num=part.part_num
DROP TABLE pvvn_by_pn
這樣,查詢順序地讀pvvn_by_pn(160頁),通過索引讀part表1.5萬次,由於建有索引,所以實際上進行1772次磁碟讀寫,優化比例為30∶1。

Ⅷ 磁碟存儲器的結構原理

磁碟存儲器利用磁記錄技術在旋轉的圓盤介質上進行數據存儲的輔助存儲器。這是一種應用廣泛的直接存取存儲器。其容量較主存儲器大千百倍,在各種規模的計算機系統中,常用作存放操作系統、程序和數據,是對主存儲器的擴充。磁碟存儲器存入的數據可長期保存,與其他輔助存儲器比較,磁碟存儲器具有較大的存儲容量和較快的數據傳輸速率。典型的磁碟驅動器包括碟片主軸旋轉機構與驅動電機、頭臂與頭臂支架、頭臂驅動電機、凈化盤腔與空氣凈化機構、寫入讀出電路、伺服定位電路和控制邏輯電路等。
磁碟以恆定轉速旋轉。懸掛在頭臂上具有浮動面的頭塊(浮動磁頭),靠載入彈簧的力量壓向盤面,碟片表面帶動的氣流將頭塊浮起。頭塊與碟片間保持穩定的微小間隙。經濾塵器過濾的空氣不斷送入盤腔,保持碟片和頭塊處於高度凈化的環境內,以防頭塊與盤面劃傷。根據控制器送來的磁軌地址(即圓柱面地址)和尋道命令,定位電路驅動直線電機將頭臂移至目標磁軌上。伺服磁頭讀出伺服磁軌信號並反饋到定位電路,使頭臂跟隨伺服磁軌穩定在目標磁軌上。讀寫與選頭電路根據控制器送來的磁頭地址接通應選的磁頭,將控制器送來的數據以串列方式逐位記錄在目標磁軌上;或反之,從選定的磁軌讀出數據並送往控制器。頭臂裝在梳形架小車上,在尋道時所有頭臂一同移動。所有數據面上相同直徑的同心圓磁軌總稱圓柱面,即頭臂定位一次所能存取的全部磁軌。每個磁軌都按固定的格式記錄。在標志磁軌起始位置的索引之後,記錄該道的地址(圓柱面號和頭號)、磁軌的狀況和其他參考信息。在每一記錄段的尾部附記有該段的糾錯碼,對連續少數幾位的永久缺陷所造成的錯誤靠糾錯碼糾正,對有多位永久缺陷的磁軌須用備分磁軌代替。寫讀操作是以記錄段為單位進行的。記錄段的長度有固定段長和可變段長兩種。