Ⅰ 衡量資料庫性能的重要指標
具體來說,本文包括以下內容:
事務
查詢性能
用戶和查詢沖突
容量
配置
Nosql 資料庫
- 圖1-基於基線評估當前事務響應時間
事務
事務可以觀察真實用戶的行為:能夠在應用交互時捕獲實時性能。眾所周知,測量事務的性能包括獲取整個事務的響應時間和組成事務的各個部分的響應時間。通常我們可以用這些響應時間與滿足事務需求的基線對比,來確定當前事務是否處於正常狀態。
如果你只想衡量應用的某個方面,那麼可以評估事務的行為。所以,盡管容器指標能夠提供更豐富的信息,並且幫助你決定何時對當前環境進行自動測量,但你的事務就足以確定應用性能。無需向應用程序伺服器獲取 CPU 的使用情況,你更應該關心用戶是否完成了事務,以及該事務是否得到了優化。
補充一個小知識點,事務是由入口點決定的,通過該入口點可以啟動事務與應用進行交互。
一旦定義了事務,會在整個應用生態系統中對其性能進行測量,並將每個事務與基線進行比對。例如,我們可能會決定當事務的響應時間與基線相比,一旦慢於平均響應時間的兩個標准差是否就應該判定為異常,如圖1所示。
用於評估事務的基線與正在進行的事務活動在時間上是一致的,但事務會由每個事務執行來完善。例如,當你選定一個基線,在當前事務結束之後,將事務與平均響應時間按每天的小時數和每周的天數進行對比,所有在那段時間內執行的事務都將會被納入下周的基線中。通過這種機制,應用程序可以隨時間而變化,而無需每次都重建原始基線;你可以將其看作是一個隨時間移動的窗口。
總之,事務最能反映用戶體驗的測量方法,所以也是衡量性能狀況最重要的指標。
查詢性能
最容易檢測到查詢性能是否正常的指標就是查詢本身。由查詢引起的問題可能會導致時間太長而無法識別所需數據或返回數據。所以不妨在查詢中排查以下問題。
1. 選擇過多冗餘數據
編寫查詢語句來返回適當的數據是遠遠不夠的,很可能你的查詢語句會返回太多列,從而導致選擇行和檢索數據變得異常緩慢。所以,最好是列出所需的列,而不是直接用 SELECT*。當需要在特定欄位中查詢時,該計劃可能會確定一個覆蓋索引從而加快結果返回。覆蓋索引通常會包含查詢中使用的所有欄位。這意味著資料庫可以僅從索引中產生結果,而不需要通過底層表來構建。
另外,列出結果中所需的列不僅可以減少傳輸的數據,還能進一步提高性能。
2. 表之間的低效聯接
聯接會導致資料庫將多組數據帶到內存中進行比較,這會產生多個資料庫讀取和大量 CPU。根據表的索引,聯接還可能需要掃描兩個表的所有行。如果寫不好兩個大型表之間的聯接,就需要對每個表進行完整掃描,這樣的計算量將會非常大。其他會拖慢聯接的因素包括聯接列之間存在不同的數據類型、需要轉換或加入包含 LIKE 的條件,這樣就會阻止使用索引。另外,還需注意避免使用全外聯接;在恰當的時候使用內部聯接只返回所需數據。
3. 索引過多或過少
如果查詢優化沒有可用的索引時,資料庫會重新掃描表來產生查詢結果,這個過程會生成大量的磁碟輸入/輸出(I/O)。適當的索引可以減少排序結果的需要。雖然非唯一值的索引在生成結果時,不能像唯一索引那樣方便。如果鍵越大,索引也會變大,並通過它們創建更多的磁碟 I/O。大多數索引是為了提高數據檢索的性能,但也需要明白索引本身也會影響數據的插入和更新,因為所有相關聯的指標都必須更新。
4. 太多的SQL導致爭用解析資源
任何 SQL 查詢在執行之前都必須被解析,在生成執行計劃之前需要對語法和許可權進行檢查。由於解析非常耗時,資料庫會保存已解析的 SQL 來重復利用,從而減少解析的耗時。因為 WHERE 語句不同,所以使用文本值的查詢語句不能被共享。這將導致每個查詢都會被解析並添加到共享池中,由於池的空間有限,一些已保存的查詢會被舍棄。當這些查詢再次出現時,則需要重新解析。
用戶和查詢沖突
資料庫支持多用戶,但多用戶活動也可能造成沖突。
1. 由慢查詢導致的頁/行鎖定
為了確保查詢產生精確的結果,資料庫必須鎖定表以防止在運行讀取查詢時再發生其他的插入和更新行為。如果報告或查詢相當緩慢,需要修改值的用戶可能需要等待至更新完成。鎖提示能幫助資料庫使用最小破壞性的鎖。從事務資料庫中分離報表也是一種可靠的解決方法。
2. 事務鎖和死鎖
當兩個事務被阻塞時會出現死鎖,因為每一個都需要使用被另一個佔用的資源。當出現一個普通鎖時,事務會被阻塞直到資源被釋放。但卻沒有解決死鎖的方案。資料庫會監控死鎖並選擇終止其中一個事務,釋放資源並允許該事務繼續進行,而另一個事務則回滾。
3. 批處理操作造成資源爭奪
批處理過程通常會執行批量操作,如大量的數據載入或生成復雜的分析報告。這些操作是資源密集型的,但可能影響在線用戶的訪問應用的性能。針對此問題最好的解決辦法是確保批處理在系統使用率較低時運行,比如晚上,或用單獨的資料庫進行事務處理和分析報告。
容量
並不是所有的資料庫性能問題都是資料庫問題。有些問題也是硬體不合適造成的。
1. CPU 不足或 CPU 速度太慢
更多 CPU 可以分擔伺服器負載,進一步提高性能。資料庫的性能不僅是資料庫的原因,還受到伺服器上運行其他進程的影響。因此,對資料庫負載及使用進行審查也是必不可少的。由於 CPU 的利用率時時在變,在低使用率、平均使用率和峰值使用率的時間段分別檢查該指標可以更好地評估增加額外的 CPU 資源是否有益。
2. IOPS 不足的慢磁碟
磁碟性能通常以每秒輸入/輸出操作(IOPS)來計。結合 I/O 大小,該指標可以衡量每秒的磁碟吞吐量是多少兆。同時,吞吐量也受磁碟的延遲影響,比如需要多久才能完成請求,這些指標主要是針對磁碟存儲技術而言。傳統的硬碟驅動器(HDD)有一個旋轉磁碟,通常比固態硬碟(SSD)或快閃記憶體更慢。直到近期,SSD 雖然仍比 HDD 貴,但成本已經降了下來,所以在市場上也更具競爭力。
3. 全部或錯誤配置的磁碟
眾所周知,資料庫會被大量磁碟訪問,所以不正確配置的磁碟可能帶來嚴重的性能缺陷。磁碟應該適當分區,將系統數據目錄和用戶數據日誌分開。高度活躍的表應該區分以避免爭用,通過在不同磁碟上存放資料庫和索引增加並行放置,但不要將操作系統和資料庫交換空間放置在同一磁碟上。
4. 內存不足
有限或不恰當的物理內存分配會影響資料庫性能。通常我們認為可用的內存更多,性能就越好。監控分頁和交換,在多個非繁忙磁碟中建立多頁面空間,進一步確保分頁空間分配足夠滿足資料庫要求;每個資料庫供應商也可以在這個問題上提供指導。
5. 網速慢
網路速度會影響到如何快速檢索數據並返回給終端用戶或調用過程。使用寬頻連接到遠程資料庫。在某些情況下,選擇 TCP/IP 協議而不是命名管道可顯著提高資料庫性能。
配置
每個資料庫都需設置大量的配置項。通常情況下,默認值可能不足以滿足資料庫所需的性能。所以,檢查所有的參數設置,包括以下問題。
1. 緩沖區緩存太小
通過將數據存儲在內核內存,緩沖區緩存可以進一步提高性能同時減少磁碟 I/O。當緩存太小時,緩存中的數據會更頻繁地刷新。如果它再次被請求,就必須從磁碟重讀。除了磁碟讀取緩慢之外,還給 I/O 設備增添了負擔從而成為瓶頸。除了給緩沖區緩存分配足夠的空間,調優 SQL 查詢可以幫助其更有效地利用緩沖區緩存。
2. 沒有查詢緩存
查詢緩存會存儲資料庫查詢和結果集。當執行相同的查詢時,數據會在緩存中被迅速檢索,而不需要再次執行查詢。數據會更新失效結果,所以查詢緩存是唯一有效的靜態數據。但在某些情況下,查詢緩存卻可能成為性能瓶頸。比如當鎖定為更新時,巨大的緩存可能導致爭用沖突。
3. 磁碟上臨時表創建導致的 I/O 爭用
在執行特定的查詢操作時,資料庫需要創建臨時表,如執行一個 GROUP BY 子句。如果可能,在內存中創建臨時表。但是,在某些情況下,在內存中創建臨時表並不可行,比如當數據包含 BLOB 或 TEXT 對象時。在這些情況下,會在磁碟上創建臨時表。大量的磁碟 I / O 都需要創建臨時表、填充記錄、從表中選擇所需數據並在查詢完成後舍棄。為了避免影響性能,臨時資料庫應該從主資料庫中分離出來。重寫查詢還可以通過創建派生表來減少對臨時表的需求。使用派生表直接從另一個 SELECT 語句的結果中選擇,允許將數據加到內存中而不是當前磁碟上。
NoSQL 資料庫
NoSQL 的優勢在於它處理大數據的能力非常迅速。但是在實際使用中,也應該綜合參考 NoSQL 的缺點,從而決定是否適合你的用例場景。這就是為什麼NoSQL通常被理解為 「不僅僅是 SQL」,說明了 NoSQL 並不總是正確的解決方案,也沒必要完全取代 SQL,以下分別列舉出五大主要原因。
1. 挑剔事務
難以保持 NoSQL 條目的一致性。當訪問結構化數據時,它並不能完全確保同一時間對不同表的更改都生效。如果某個過程發生崩潰,表可能會不一致。一致事務的典型代表是復式記賬法。相應的信貸必須平衡每個借方,反之亦然。如果雙方數據不一致則不能輸入。NoSQL 則可能無法保證「收支平衡」。
2. 復雜資料庫
NoSQL 的支持者往往以高效代碼、簡單性和 NoSQL 的速度為傲。當資料庫任務很簡單時,所有這些因素都是優勢。但當資料庫變得復雜,NoSQL 會開始分解。此時,SQL 則比 NoSQL 更好地處理復雜需求,因為 SQL 已經成熟,有符合行業標準的介面。而每個 NoSQL 設置都有一個唯一的介面。
3. 一致聯接
當執行 SQL 的聯接時,由於系統必須從不同的表中提取數據進行鍵對齊,所以有一個巨大的開銷。而 NoSQL 似乎是一個空想,因為缺乏聯接功能。所有的數據都在同一個表的一個地方。當檢索數據時,它會同時提取所有的鍵值對。問題在於這會創建同一數據的多個副本。這些副本也必須更新,而這種情況下,NoSQL 沒有功能來確保更新。
4. Schema設計的靈活性
由於 NoSQL 不需要 schema,所以在某些情況下也是獨一無二的。在以前的資料庫模型中,程序員必須考慮所有需要的列能夠擴展,能夠適應每行的數據條目。在 NoSQL 下,條目可以有多種字元串或者完全沒有。這種靈活性允許程序員迅速增加數據。但是,也可能存在問題,比如當有多個團體在同一項目上工作時,或者新的開發團隊接手一個項目時。開發人員能夠自由地修改資料庫,也可能會不斷實現各種各樣的密鑰對。
5. 資源密集型
NoSQL 資料庫通常比關系資料庫更加資源密集。他們需要更多的 CPU 儲備和 RAM 分配。出於這個原因,大多數共享主機公司都不提供 NoSQL。你必須注冊一個 VPS 或運行自己的專用伺服器。另一方面,SQL 主要是在伺服器上運行。初期的工作都很順利,但隨著資料庫需求的增加,硬體必須擴大。單個大型伺服器比多個小型伺服器昂貴得多,價格呈指數增長。所以在這種企業計算場景下,使用 NoSQL 更為劃算,例如那些由谷歌和 Facebook 使用的伺服器。
Ⅱ 誰知道資料庫優化設計方案有哪些
本文首先討論了基於第三範式的資料庫表的基本設計,著重論述了建立主鍵和索引的策略和方案,然後從資料庫表的擴展設計和庫表對象的放置等角度概述了資料庫管理系統的優化方案。
關鍵詞: 優化(Optimizing) 第三範式(3NF) 冗餘數據(Rendant Data) 索引(Index) 數據分割(Data Partitioning) 對象放置(Object Placement)
1 引言
資料庫優化的目標無非是避免磁碟I/O瓶頸、減少CPU利用率和減少資源競爭。為了便於讀者閱讀和理解,筆者參閱了Sybase、Informix和Oracle等大型資料庫系統參考資料,基於多年的工程實踐經驗,從基本表設計、擴展設計和資料庫表對象放置等角度進行討論,著重討論了如何避免磁碟I/O瓶頸和減少資源競爭,相信讀者會一目瞭然。
2 基於第三範式的基本表設計
在基於表驅動的信息管理系統(MIS)中,基本表的設計規范是第三範式(3NF)。第三範式的基本特徵是非主鍵屬性只依賴於主鍵屬性。基於第三範式的資料庫表設計具有很多優點:一是消除了冗餘數據,節省了磁碟存儲空間;二是有良好的數據完整性限制,即基於主外鍵的參照完整限制和基於主鍵的實體完整性限制,這使得數據容易維護,也容易移植和更新;三是數據的可逆性好,在做連接(Join)查詢或者合並表時不遺漏、也不重復;四是因消除了冗餘數據(冗餘列),在查詢(Select)時每個數據頁存的數據行就多,這樣就有效地減少了邏輯I/O,每個Cash存的頁面就多,也減少物理I/O;五是對大多數事務(Transaction)而言,運行性能好;六是物理設計(Physical Design)的機動性較大,能滿足日益增長的用戶需求。
在基本表設計中,表的主鍵、外鍵、索引設計佔有非常重要的地位,但系統設計人員往往只注重於滿足用戶要求,而沒有從系統優化的高度來認識和重視它們。實際上,它們與系統的運行性能密切相關。現在從系統資料庫優化角度討論這些基本概念及其重要意義:
(1)主鍵(Primary Key):主鍵被用於復雜的SQL語句時,頻繁地在數據訪問中被用到。一個表只有一個主鍵。主鍵應該有固定值(不能為Null或預設值,要有相對穩定性),不含代碼信息,易訪問。把常用(眾所周知)的列作為主鍵才有意義。短主鍵最佳(小於25bytes),主鍵的長短影響索引的大小,索引的大小影響索引頁的大小,從而影響磁碟I/O。主鍵分為自然主鍵和人為主鍵。自然主鍵由實體的屬性構成,自然主鍵可以是復合性的,在形成復合主鍵時,主鍵列不能太多,復合主鍵使得Join*作復雜化、也增加了外鍵表的大小。人為主鍵是,在沒有合適的自然屬性鍵、或自然屬性復雜或靈敏度高時,人為形成的。人為主鍵一般是整型值(滿足最小化要求),沒有實際意義,也略微增加了表的大小;但減少了把它作為外鍵的表的大小。
(2)外鍵(Foreign Key):外鍵的作用是建立關系型資料庫中表之間的關系(參照完整性),主鍵只能從獨立的實體遷移到非獨立的實體,成為後者的一個屬性,被稱為外鍵。
(3)索引(Index):利用索引優化系統性能是顯而易見的,對所有常用於查詢中的Where子句的列和所有用於排序的列創建索引,可以避免整表掃描或訪問,在不改變表的物理結構的情況下,直接訪問特定的數據列,這樣減少數據存取時間;利用索引可以優化或排除耗時的分類*作;把數據分散到不同的頁面上,就分散了插入的數據;主鍵自動建立了唯一索引,因此唯一索引也能確保數據的唯一性(即實體完整性);索引碼越小,定位就越直接;新建的索引效能最好,因此定期更新索引非常必要。索引也有代價:有空間開銷,建立它也要花費時間,在進行Insert、Delete和Update*作時,也有維護代價。索引有兩種:聚族索引和非聚族索引。一個表只能有一個聚族索引,可有多個非聚族索引。使用聚族索引查詢數據要比使用非聚族索引快。在建索引前,應利用資料庫系統函數估算索引的大小。
① 聚族索引(Clustered Index):聚族索引的數據頁按物理有序儲存,佔用空間小。選擇策略是,被用於Where子句的列:包括范圍查詢、模糊查詢或高度重復的列(連續磁碟掃描);被用於連接Join*作的列;被用於Order by和Group by子句的列。聚族索引不利於插入*作,另外沒有必要用主鍵建聚族索引。
② 非聚族索引(Nonclustered Index):與聚族索引相比,佔用空間大,而且效率低。選擇策略是,被用於Where子句的列:包括范圍查詢、模糊查詢(在沒有聚族索引時)、主鍵或外鍵列、點(指針類)或小范圍(返回的結果域小於整表數據的20%)查詢;被用於連接Join*作的列、主鍵列(范圍查詢);被用於Order by和Group by子句的列;需要被覆蓋的列。對只讀表建多個非聚族索引有利。索引也有其弊端,一是創建索引要耗費時間,二是索引要佔有大量磁碟空間,三是增加了維護代價(在修改帶索引的數據列時索引會減緩修改速度)。那麼,在哪種情況下不建索引呢?對於小表(數據小於5頁)、小到中表(不直接訪問單行數據或結果集不用排序)、單值域(返回值密集)、索引列值太長(大於20bitys)、容易變化的列、高度重復的列、Null值列,對沒有被用於Where子語句和Join查詢的列都不能建索引。另外,對主要用於數據錄入的,盡可能少建索引。當然,也要防止建立無效索引,當Where語句中多於5個條件時,維護索引的開銷大於索引的效益,這時,建立臨時表存儲有關數據更有效。
批量導入數據時的注意事項:在實際應用中,大批量的計算(如電信話單計費)用C語言程序做,這種基於主外鍵關系數據計算而得的批量數據(文本文件),可利用系統的自身功能函數(如Sybase的BCP命令)快速批量導入,在導入資料庫表時,可先刪除相應庫表的索引,這有利於加快導入速度,減少導入時間。在導入後再重建索引以便優化查詢。
(4)鎖:鎖是並行處理的重要機制,能保持數據並發的一致性,即按事務進行處理;系統利用鎖,保證數據完整性。因此,我們避免不了死鎖,但在設計時可以充分考慮如何避免長事務,減少排它鎖時間,減少在事務中與用戶的交互,杜絕讓用戶控制事務的長短;要避免批量數據同時執行,尤其是耗時並用到相同的數據表。鎖的徵用:一個表同時只能有一個排它鎖,一個用戶用時,其它用戶在等待。若用戶數增加,則Server的性能下降,出現「假死」現象。如何避免死鎖呢?從頁級鎖到行級鎖,減少了鎖徵用;給小表增加無效記錄,從頁級鎖到行級鎖沒有影響,若在同一頁內競爭有影響,可選擇合適的聚族索引把數據分配到不同的頁面;創建冗餘表;保持事務簡短;同一批處理應該沒有網路交互。
(5)查詢優化規則:在訪問資料庫表的數據(Access Data)時,要盡可能避免排序(Sort)、連接(Join)和相關子查詢*作。經驗告訴我們,在優化查詢時,必須做到:
① 盡可能少的行;
② 避免排序或為盡可能少的行排序,若要做大量數據排序,最好將相關數據放在臨時表中*作;用簡單的鍵(列)排序,如整型或短字元串排序;
③ 避免表內的相關子查詢;
④ 避免在Where子句中使用復雜的表達式或非起始的子字元串、用長字元串連接;
⑤ 在Where子句中多使用「與」(And)連接,少使用「或」(Or)連接;
⑥ 利用臨時資料庫。在查詢多表、有多個連接、查詢復雜、數據要過濾時,可以建臨時表(索引)以減少I/O。但缺點是增加了空間開銷。
除非每個列都有索引支持,否則在有連接的查詢時分別找出兩個動態索引,放在工作表中重新排序。
3 基本表擴展設計
基於第三範式設計的庫表雖然有其優越性(見本文第一部分),然而在實際應用中有時不利於系統運行性能的優化:如需要部分數據時而要掃描整表,許多過程同時競爭同一數據,反復用相同行計算相同的結果,過程從多表獲取數據時引發大量的連接*作,當數據來源於多表時的連接*作;這都消耗了磁碟I/O和CPU時間。
尤其在遇到下列情形時,我們要對基本表進行擴展設計:許多過程要頻繁訪問一個表、子集數據訪問、重復計算和冗餘數據,有時用戶要求一些過程優先或低的響應時間。
如何避免這些不利因素呢?根據訪問的頻繁程度對相關表進行分割處理、存儲冗餘數據、存儲衍生列、合並相關表處理,這些都是克服這些不利因素和優化系統運行的有效途徑。
3.1 分割表或儲存冗餘數據
分割表分為水平分割表和垂直分割表兩種。分割表增加了維護數據完整性的代價。
水平分割表:一種是當多個過程頻繁訪問數據表的不同行時,水平分割表,並消除新表中的冗餘數據列;若個別過程要訪問整個數據,則要用連接*作,這也無妨分割表;典型案例是電信話單按月分割存放。另一種是當主要過程要重復訪問部分行時,最好將被重復訪問的這些行單獨形成子集表(冗餘儲存),這在不考慮磁碟空間開銷時顯得十分重要;但在分割表以後,增加了維護難度,要用觸發器立即更新、或存儲過程或應用代碼批量更新,這也會增加額外的磁碟I/O開銷。
垂直分割表(不破壞第三範式),一種是當多個過程頻繁訪問表的不同列時,可將表垂直分成幾個表,減少磁碟I/O(每行的數據列少,每頁存的數據行就多,相應佔用的頁就少),更新時不必考慮鎖,沒有冗餘數據。缺點是要在插入或刪除數據時要考慮數據的完整性,用存儲過程維護。另一種是當主要過程反復訪問部分列時,最好將這部分被頻繁訪問的列數據單獨存為一個子集表(冗餘儲存),這在不考慮磁碟空間開銷時顯得十分重要;但這增加了重疊列的維護難度,要用觸發器立即更新、或存儲過程或應用代碼批量更新,這也會增加額外的磁碟I/O開銷。垂直分割表可以達到最大化利用Cache的目的。
總之,為主要過程分割表的方法適用於:各個過程需要表的不聯結的子集,各個過程需要表的子集,訪問頻率高的主要過程不需要整表。在主要的、頻繁訪問的主表需要表的子集而其它主要頻繁訪問的過程需要整表時則產生冗餘子集表。
注意,在分割表以後,要考慮重新建立索引。
3.2 存儲衍生數據
對一些要做大量重復性計算的過程而言,若重復計算過程得到的結果相同(源列數據穩定,因此計算結果也不變),或計算牽扯多行數據需額外的磁碟I/O開銷,或計算復雜需要大量的CPU時間,就考慮存儲計算結果(冗餘儲存)。現予以分類說明:
若在一行內重復計算,就在表內增加列存儲結果。但若參與計算的列被更新時,必須要用觸發器更新這個新列。
若對表按類進行重復計算,就增加新表(一般而言,存放類和結果兩列就可以了)存儲相關結果。但若參與計算的列被更新時,就必須要用觸發器立即更新、或存儲過程或應用代碼批量更新這個新表。
若對多行進行重復性計算(如排名次),就在表內增加列存儲結果。但若參與計算的列被更新時,必須要用觸發器或存儲過程更新這個新列。
總之,存儲冗餘數據有利於加快訪問速度;但違反了第三範式,這會增加維護數據完整性的代價,必須用觸發器立即更新、或存儲過程或應用代碼批量更新,以維護數據的完整性。
3.3 消除昂貴結合
對於頻繁同時訪問多表的一些主要過程,考慮在主表內存儲冗餘數據,即存儲冗餘列或衍生列(它不依賴於主鍵),但破壞了第三範式,也增加了維護難度。在源表的相關列發生變化時,必須要用觸發器或存儲過程更新這個冗餘列。當主要過程總同時訪問兩個表時可以合並表,這樣可以減少磁碟I/O*作,但破壞了第三範式,也增加了維護難度。對父子表和1:1關系表合並方法不同:合並父子表後,產生冗餘表;合並1:1關系表後,在表內產生冗餘數據。
4 資料庫對象的放置策略
資料庫對象的放置策略是均勻地把數據分布在系統的磁碟中,平衡I/O訪問,避免I/O瓶頸。
⑴ 訪問分散到不同的磁碟,即使用戶數據盡可能跨越多個設備,多個I/O運轉,避免I/O競爭,克服訪問瓶頸;分別放置隨機訪問和連續訪問數據。
⑵ 分離系統資料庫I/O和應用資料庫I/O。把系統審計表和臨時庫表放在不忙的磁碟上。
⑶ 把事務日誌放在單獨的磁碟上,減少磁碟I/O開銷,這還有利於在障礙後恢復,提高了系統的安全性。
⑷ 把頻繁訪問的「活性」表放在不同的磁碟上;把頻繁用的表、頻繁做Join*作的表分別放在單獨的磁碟上,甚至把把頻繁訪問的表的欄位放在不同的磁碟上,把訪問分散到不同的磁碟上,避免I/O爭奪;
⑸ 利用段分離頻繁訪問的表及其索引(非聚族的)、分離文本和圖像數據。段的目的是平衡I/O,避免瓶頸,增加吞吐量,實現並行掃描,提高並發度,最大化磁碟的吞吐量。利用邏輯段功能,分別放置「活性」表及其非聚族索引以平衡I/O。當然最好利用系統的默認段。另外,利用段可以使備份和恢復數據更加靈活,使系統授權更加靈活。
Ⅲ 數據依賴左部是什麼意思
資料庫系統概論(一)關系數據理論--數據依賴的公理系統和模式分解
Armstrong公理系統
對R(U,F)有:
1.自反律:若Y⊆X⊆U,則F蘊含X→Y
2.增廣律:若X→Y,且 Z⊆U,則F蘊含XZ→YZ
3.傳遞律:若F蘊含X→Y,Y→Z,則有X→Z
由以上定律可以推出以下規則
1.合並規則:若X→Y,X→Z,則有X→YZ
2.偽傳遞規則:X→Y,WY→Z,則有WX→Z
3.分解規則:X→Y,Z⊆Y,則有X→Z
閉包
閉包F+:在關系模式R(U,F)中由F推導出的全部函數依賴稱F+
X關於F的閉包XF+:由X能在F中推導出的所有函數依賴合集
若F=F+,則稱F為完備集
判定X→Y能否由F推導出的問題,轉化為求出XF+,判定Y是否為XF+子集
Armstrong公理系統的有效性與完備性
有效性:由F出發根據基檔Armstrong公理系統推導出的每一個函數依賴都存在於F+中
完備性:F+中每一個函數依賴,必定可以由F出發根據Armstrong公理系統推導出
最小函數依賴集
如果函數依賴集F滿足以下條件,則稱F為一個極小函數依賴集。也稱為最小依賴集或最小覆蓋。
(1)F中任一函數依賴的右部僅含有一個屬性。
(2)F中不存在這樣的函數依賴X→A,使得F與F-{X→A}等價(任一函數依賴不能由其他函數依賴推導出,線性無關)
(3)F中不存在這樣的函數依賴X→A,X有真子集Z使得(F-{X→A}) U {Z→A}與F等價。(F中各函數依賴左邊都是最小屬性集,無冗餘屬性)
最小依賴集並不唯一
求最小依賴集
① 用分解的法則,使F中的任何一個函數依賴的右部僅含有一個屬性;
② 去掉多餘的函數依賴:從第一個函數依賴X→Y開始將其從F中去掉,然後在剩下的函數依賴中求X的閉包X+,看X+是否包含Y,若是,則去掉X→Y;否則不能去掉,依次做下去。直到找不到冗餘的函數依賴;
③ 去掉各依賴左部多餘的屬性。一個一個地檢查函數依賴左部非單個屬性的依賴。例如XY→A,若要判Y為多餘的,則以X→A代替XY→A是否等價?若A屬於(X)+,則Y是多餘屬性,可以去掉。(以上步驟中,求出關系依賴集F,此時,再F的基礎上,求出X或者Y的閉包,是否包含A)
例1:關系模式R(U,F)中,U=ABCDEG,F={B->D,DG->C,BD->E,AG->B,ADG->BC};求F的最小函數依賴集
步驟:
(1)用分解的法則,使F中的任何一顫嘩個函數依賴的右部僅含有一個屬性;得到:F={B->D,DG->C,BD->E,AG->B,ADG->B,ADG->C};
(2)去掉多餘的函數依賴:從第一個函數依賴X→Y開始將其從F中去掉,然後在剩下的函數依賴中求X的閉包X+,依次做下去。直到找不到冗餘的函數依賴;
① 去掉B->D,此時F={DG->C,BD->E,AG->B,ADG->B,ADG->C},此條件下得出B的閉包 B+ = B;B+不包含D,所以B->D保留。
②去掉DG->C,此時F={B->D,BD->E,AG->B,ADG->B,ADG->C},此時DG閉包DG+ = DG,不包含C,所以不能去掉DG->C.
③ 去掉BD->E,此時F={B->D,DG->C,AG->B,ADG->B,ADG->C},此時閉包BD+ = BD,不包含E,所以不能去掉BD->E,繼續保留。
④去掉AG->B,此時F={B->D,DG->C,BD->E,ADG->B,ADG->C};此時AG+ = AG,不包含B,所以不能去掉AG->B,繼續保留。
⑤去掉ADG->B,此時F={B->D,DG->C,BD->E,AG->B,ADG->C},此時ADG+ = ADGCBE,包含了B,所以刪除ADG->B,不保留。
⑥去掉ADG->C,此時F={B->D,DG->C,BD->E,AG->B},此時ADG+ = ADGCBD,包含了C,所以刪除ADG->C,不保留。
綜上所得,此時得到F={B->D,DG->C,BD->E,AG->B};
(3)去掉各依賴左部多餘的屬性。一個一個地檢查函數依賴左部非單個屬性的依賴。
此時函數依賴左邊非單個屬性有:DG->C,BD->E,AG->B;所以做如下操作:
①先來看DG->C,首先去掉D,搏洞亂則此時G的閉包G+ = G,不包含C,保留D。再次去掉G,此時D+ = D,不包含C,所以G也不能去掉;
②再來看BD->E,首先去掉B,得到此時D的閉包D+ = D,不含E,保留B。然後去掉D,此時B+ = BDE,包含了E,所以去掉D,即得出:B->E;
③最後再來看AG->B,去掉A,G+ = G,不包含B,不能去掉A。去掉G的時候,A的閉包A+ =A,不含B,不能去掉A,還是AG->B ;
所以最後得出:F的最小函數依賴集是:F={B->D,DG->C,B->E,AG->B};
模式分解
要保證分解後的模式與原模式等價,則要滿足以下兩個性質
無損連接性:數據內容的等價
保持函數依賴性:數據約束的等價1.無損連接分解的檢測方法(判斷一個分解是否無損連接):
方法一:
演算法:
(1)案例:
方法二:無損連接定理(更易於使用):
案例(1):
關系模式R(SAIP),F={S—>A,SI—>P}; ρ={R1(SA),R2(SIP)}檢測分解是否為無損連接?
因為:R1∩R2 = S ;R1—R2 = A; R2—R1 = IP;所以得出:S —>A;或者S —>IP; 而 S —>A 在F={S—>A,SI—>P}中,所以此分解是無損連接。
舉例(2):已知R<U,F>,U={A,B,C},F={A→B},如下的兩個分解:
① ρ1={AB,BC};
② ρ2={AB,AC};
因為:AB∩BC = B;AB—BC = A;BC—AB = C;得出;B→A,或者 B→A,兩個都不包含在F={A→B}中,所以 ρ1 分解是有損的。
因為:AB∩AC = A;AB—AC = B;AC—AB = C;得出:A→B,或者A→C,而A→B包含在F={A→B}中,所以 ρ2 分解是無損的。
2.保持依賴分解的檢測方法(判斷一個分解是否保持依賴):
演算法:
如果F上的每一個函數依賴都在其分解後的某一個關繫上成立,則這個分解是保持依賴的(這是一個充分條件)。
如果上述判斷失敗,並不能斷言分解不是保持依賴的,還要使用下面的通用方法來做進一步判斷。
該方法的表述如下:
演算法二:
對F上的每一個α→β使用下面的過程:
result:=α;
while(result發生變化)do
for each 分解後的Ri //將每個分解後的結構Ri逐個帶入
t=(result∩Ri)+ ∩Ri //這里的意思是取result與Ri的交集的閉包值,之後再與Ri取交集
result=result∪t
這里的屬性閉包是在函數依賴集F下計算出來的。如果result中包含了β的所有屬性,則函數依賴α→β。分解是保持依賴的當且僅當上述過程中F的所有依賴都被保持。
Ⅳ 有沒有人懂最小函數依賴集到底是個啥,資料庫基礎的,不懂怎麼得到最小函數依賴集,概念也看起來也很抽象
最小函數依賴集就是把函數依賴集依據化簡規則消除不必要的/重復的函數依賴。
求最小函數依賴集分三步:
1.將F中的所有依賴右邊化為單一元素
此題fd={abd->e,ab->g,b->f,c->j,cj->i,g->h};已經滿足
2.去掉F中的所有依賴左邊的冗餘屬性.
作法是屬性中去掉其中的一個,看看是否依然可以推導
此題:abd->e,去掉a,則(bd)+不含e,故不能去掉,同理b,d都不是冗餘屬性
ab->g,也沒有
cj->i,因為c+={c,j,i}其中包含i所以j是冗餘的.cj->i將成為c->i
F={abd->e,ab->g,b->f,c->j,c->i,g->h};
3.去掉F中所有冗餘依賴關系.
做法為從F中去掉某關系,如去掉(X->Y),然後在F中求X+,如果Y在X+中,則表明x->是多餘的.需要去掉.
此題如果F去掉abd->e,F將等於{ab->g,b->f,c->j,c->i,g->h},而(abd)+={a,d,b,f,g,h},其中不包含e.所有不是多餘的.
同理(ab)+={a,b,f}也不包含g,故不是多餘的.
b+={b}不多餘,c+={c,i}不多餘
c->i,g->h多不能去掉.
所以所求最小函數依賴集為 F={abd->e,ab->g,b->f,c->j,c->i,g->h};
最小函數依賴集
定義:如果函數依賴集F滿足下列條件,則稱F為最小函數依賴集或最小覆蓋。
① F中的任何一個函數依賴的右部僅含有一個屬性;
② F中不存在這樣一個函數依賴X→A,使得F與F-{X→A}等價;
③ F中不存在這樣一個函數依賴X→A,X有真子集Z使得F-{X→A}∪{Z→A}與F等價。
演算法:計算最小函數依賴集。
輸入 一個函數依賴集
輸出 F的一個等價的最小函數依賴集G
步驟:① 用分解的法則,使F中的任何一個函數依賴的右部僅含有一個屬性;
② 去掉多餘的函數依賴:從第一個函數依賴X→Y開始將其從F中去掉,然後在剩下的函數依賴中求X的閉包X+,看X+是否包含Y,若是,則去掉X→Y;否則不能去掉,依次做下去。直到找不到冗餘的函數依賴;
③ 去掉各依賴左部多餘的屬性。一個一個地檢查函數依賴左部非單個屬性的依賴。例如XY→A,若要判Y為多餘的,則以X→A代替XY→A是否等價?若A屬於(X)+,則Y是多餘屬性,可以去掉。
舉例:已知關系模式R,U={A,B,C,D,E,G},F={AB→C,D→EG,C→A,BE→C,BC→D,CG→BD,ACD→B,CE→AG},求F的最小函數依賴集。
解1:利用演算法求解,使得其滿足三個條件
① 利用分解規則,將所有的函數依賴變成右邊都是單個屬性的函數依賴,得F為:F={AB→C,D→E,D→G,C→A,BE→C,BC→D,CG→B,CG→D,ACD→B,CE→A,CE→G}
② 去掉F中多餘的函數依賴
A.設AB→C為冗餘的函數依賴,則去掉AB→C,得:F1={D→E,D→G,C→A,BE→C,BC→D,CG→B,CG→D,ACD→B,CE→A,CE→G}
計算(AB)F1+:設X(0)=AB
計算X(1):掃描F1中各個函數依賴,找到左部為AB或AB子集的函數依賴,因為找不到這樣的函數依賴。故有X(1)=X(0)=AB,演算法終止。
(AB)F1+= AB不包含C,故AB→C不是冗餘的函數依賴,不能從F1中去掉。
B.設CG→B為冗餘的函數依賴,則去掉CG→B,得:F2={AB→C,D→E,D→G,C→A,BE→C,BC→D,CG→D,ACD→B,CE→A,CE→G}
計算(CG)F2+:設X(0)=CG
計算X(1):掃描F2中的各個函數依賴,找到左部為CG或CG子集的函數依賴,得到一個C→A函數依賴。故有X(1)=X(0)∪A=CGA=ACG。
計算X(2):掃描F2中的各個函數依賴,找到左部為ACG或ACG子集的函數依賴,得到一個CG→D函數依賴。故有X(2)=X(1)∪D=ACDG。
計算X(3):掃描F2中的各個函數依賴,找到左部為ACDG或ACDG子集的函數依賴,得到兩個ACD→B和D→E函數依賴。故有X(3)=X(2)∪BE=ABCDEG,因為X(3)=U,演算法終止。
(CG)F2+=ABCDEG包含B,故CG→B是冗餘的函數依賴,從F2中去掉。
C.設CG→D為冗餘的函數依賴,則去掉CG→D,得:F3={AB→C,D→E,D→G,C→A,BE→C,BC→D,ACD→B,CE→A,CE→G}
計算(CG)F3+:設X(0)=CG
計算X(1):掃描F3中的各個函數依賴,找到左部為CG或CG子集的函數依賴,得到一個C→A函數依賴。故有X(1)=X(0)∪A=CGA=ACG。
計算X(2):掃描F3中的各個函數依賴,找到左部為ACG或ACG子集的函數依賴,因為找不到這樣的函數依賴。故有X(2)=X(1),演算法終止。(CG)F3+=ACG。
(CG)F3+=ACG不包含D,故CG→D不是冗餘的函數依賴,不能從F3中去掉。
D.設CE→A為冗餘的函數依賴,則去掉CE→A,得:F4={AB→C,D→E,D→G,C→A,BE→C,BC→D,CG→D,ACD→B,CE→G}
計算(CG)F4+:設X(0)=CE
計算X(1):掃描F4中的各個函數依賴,找到左部為CE或CE子集的函數依賴,得到一個C→A函數依賴。故有X(1)=X(0)∪A=CEA=ACE。
計算X(2):掃描F4中的各個函數依賴,找到左部為ACE或ACE子集的函數依賴,得到一個CE→G函數依賴。故有X(2)=X(1)∪G=ACEG。
計算X(3):掃描F4中的各個函數依賴,找到左部為ACEG或ACEG子集的函數依賴,得到一個CG→D函數依賴。故有X(3)=X(2)∪D=ACDEG。
計算X(4):掃描F4中的各個函數依賴,找到左部為ACDEG或ACDEG子集的函數依賴,得到一個ACD→B函數依賴。故有X(4)=X(3)∪B=ABCDEG。因為X(4)=U,演算法終止。
(CE)F4+=ABCDEG包含A,故CE→A是冗餘的函數依賴,從F4中去掉。
③ 去掉F4中各函數依賴左邊多餘的屬性(只檢查左部不是單個屬性的函數依賴)由於C→A,函數依賴ACD→B中的屬性A是多餘的,去掉A得CD→B。
故最小函數依賴集為:F={AB→C,D→E,D→G,C→A,BE→C,BC→D,CG→D,CD→B,CE→G}
Ⅳ 資料庫 求解最小覆蓋
資料庫:求F={A→B,B→A,B→C,A→C,C→A},最小(極小)函數依賴集合要解答此問題我們手租先來了解一下概念:如果搭豎函數依賴集F滿足以下條件,則稱F為一個極知薯大小函數依賴集。也稱為最小依賴集或最小覆蓋。(1)F中任一函數依賴的右部僅含有一個屬性。(2)
Ⅵ 資料庫實驗總結
資料庫實驗總結【一】
試驗內容
春茄消1、 數據表的建立
基本表《簡單的》帶有主鍵
帶有外碼約束的(外碼來自其他表或者本表)
2、 數據表的修改
添加刪除列
修改列屬性類型
添加刪除約束(約束名)
元組的添加,修改,刪除
刪除數據表
試驗過程
1、create table student
(
sno char(9) primary key , /*sno是主碼 列級完整性約束條件*/
sname char(20) unique, /*sname取唯一值*/
ssex char(2),
sage smallint, /*類型為smallint*/
sdept char(20) /*所在系*/
);
扒知create table course
(
cno char(4) primary key, /*列級完整性約束條件,cno是主碼*/
cname char(40),
cpno char(4), /*cpno的含義是先行課*/
ccredit smallint,
foreign key (cpno) references course(cno)
/*表級完整性約束條件,cpno是外碼,被參照表是course,被參照列是cno*/
);
create table sc
(
sno char(9),
cno char(4),
grade smallint,
primary key (sno,cno),
/*主碼有兩個屬性構成,必須作為表級完整性進行定義*/
foreign key (sno) references student(sno),
/*表級完整性約束條件,sno是外碼,被參照表是student*/
foreign key (cno) references course(cno),
/*表級完整性約束納彎條件,cno是外碼,被參照表示course*/
);
例1、create table s
(
cno varchar(3), /*變長的字元串,輸入2個字元就是兩個字元不會補空格*/
sname varchar(20),
status int,
city varchar(20),
constraint pk_sno primary key(sno), /*約束條件的名字為pk_sno*/
);
create table p
(
pno varchar(3),
pname varchar(20),
color varchar(3),
weight int,
constraint pk_pno primary key (pno), /*約束條件的名字是pk_pno*/
);
create table j
(
jno varchar(3),
jname varchar(20),
city varchar(20),
constraint pk_jno primary key(jno) /*約束條件的名字為pk_jno*/
);
例2、create table spj
(
sno varchar(3), /*第一個表中的主碼*/
pno varchar(3),
jno varchar(3),
qty int, /*數量*/
constraint pk_spj primary key(sno,pno,jno), /*主碼由3個屬性組成*/
foreign key(sno) references s(sno),
/*表級完整性約束條件,sno是外碼,被參照表是s*/
foreign key(pno) references p(pno),
/*表級完整性約束條件,pno是外碼,被參照表是p*/
foreign key(jno) references j(jno),
/*表級完整性約束條件,jno是外碼,被參照表是j*/
);
2、數據表的更改
在s表中添加一個concat 列
alter table s add concat varchar(20)
在s表中刪除concat 列
alter table s drop column concat
更改s表 concat列的屬性 把長度由20改為30
alter table s alter column concat varchar(30)
聯系方式 名字為concat 修改屬性為唯一的 屬性名為con_concat
alter table s add constraint con_concat unique(concat)
刪除約束關系con_concat
alter table s drop constraint con_concat
/*插入一個元組*/
insert into s valus(‘s1’,’精益’,20,’天津’) /*20不能寫成’20’*/
試驗中的問題的排除與總結:
1、在創建spj時
有三個實體所以從3個實體中取主碼,還有一個數量屬性也要寫上
主碼由那3個主碼確定
2、更改一個資料庫中數據表時一定要先使該資料庫處於正在使用狀態
3、constraint
是可選關鍵字,表示 primary key、not null、unique、foreign key 或 check 約束定義的開始。約束是特殊屬性,用於強制數據完整性並可以為表及其列創建索引。
4、--go可以不加但是要注意順序 註:go --注釋 提示錯誤
5、注意添加一個空元素用 null
附 sql備份
--創建一個資料庫 student
create database student
go
--在資料庫student中創建表student course sc 注意順序
use student
----------------------------------------------------------------
create table student
(
sno char(9) primary key, /*sno是主碼 列級完整性約束條件*/
sname char(10) unique, /*sname取唯一值*/
ssex char(2),
sage smallint, /*類型為smallint*/
sdept char(20) /*所在系*/
); /*;要加*/
-----------
資料庫實驗總結【二】
我在sql server 索引基礎知識系列中,第一篇就講了記錄數據的基本格式。那裡主要講解的是,資料庫的最小讀存單元:數據頁。一個數據頁是8k大小。
對於資料庫來說,它不會每次有一個數據頁變化後,就存到硬碟。而是變化達到一定數量級後才會作這個操作。 這時候,資料庫並不是以數據頁來作為操作單元,而是以64k的數據(8個數據頁,一個區)作為操作單元。
區是管理空間的基本單位。一個區是八個物理上連續的頁(即 64 kb)。這意味著 sql server 資料庫中每 mb 有 16 個區。
為了使空間分配更有效,sql server 不會將所有區分配給包含少量數據的表。sql server 有兩種類型的區:
統一區,由單個對象所有。區中的所有 8 頁只能由所屬對象使用。
混合區,最多可由八個對象共享。區中八頁的每頁可由不同的對象所有。
通常從混合區向新表或索引分配頁。當表或索引增長到 8 頁時,將變成使用統一區進行後續分配。如果對現有表創建索引,並且該表包含的行足以在索引中生成 8 頁,則對該索引的所有分配都使用統一區進行。
為何會這樣呢?
其實很簡單:
讀或寫 8kb 的時間與讀或寫 64 kb的時間幾乎相同。
在 8 kb 到 64 kb 范圍之內,單個磁碟 i/o 傳輸操作所花的時間主要是磁碟取數臂和讀/寫磁頭運動的時間。
因此,從數學上來講,當需要傳輸 64 kb 以上的 sql 數據時,
盡可能地執行 64 kb 磁碟傳輸是有益的,即分成數個64k的操作。
因為 64 kb 傳輸基本上與 8 kb 傳輸一樣快,而每次傳輸的 sql server 數據是 8 kb 傳輸的 8 倍。
我們通過一個實例來看 有and 操作符時候的最常見的一種情況。我們有下面一個表,
create table [dbo].[member]( [member_no] [dbo].[numeric_id] identity(1,1) not null, [lastname] [dbo].[shortstring] not null, [firstname] [dbo].[shortstring] not null, [middleinitial] [dbo].[letter] null, [street] [dbo].[shortstring] not null, [city] [dbo].[shortstring] not null, [state_prov] [dbo].[statecode] not null, [country] [dbo].[countrycode] not null, [mail_code] [dbo].[mailcode] not null, [phone_no] [dbo].[phonenumber] null, [photograph] [image] null, [issue_dt] [datetime] not null default (getdate()), [expr_dt] [datetime] not null default (dateadd(year,1,getdate())), [region_no] [dbo].[numeric_id] not null, [corp_no] [dbo].[numeric_id] null, [prev_balance] [money] null default (0), [curr_balance] [money] null default (0), [member_code] [dbo].[status_code] not null default (' '))
這個表具備下面的四個索引:
索引名 細節 索引的列
member_corporation_link nonclustered located on primary corp_no
member_ident clustered, unique, primary key located on primary member_no
member_region_link nonclustered located on primary region_no
memberfirstname nonclustered located on primary firstname
當我們執行下面的sql查詢時候,
select m.member_no, m.firstname, m.region_nofrom dbo.member as mwhere m.firstname like 'k%' and m.region_no > 6 and m.member_no < 5000go
sql server 會根據索引方式,優化成下面方式來執行。
select a.member_no,a.firstname,b.region_nofrom(select m.member_no, m.firstname from dbo.member as m where m.firstname like 'k%' and m.member_no < 5000) a , -- 這個查詢可以直接使用 memberfirstname 非聚集索引,而且這個非聚集索引覆蓋了所有查詢列-- 實際執行時,只需要 邏輯讀取 3 次
(select m.member_no, m.region_no from dbo.member as mwhere m.region_no > 6) b
-- 這個查詢可以直接使用 member_region_link 非聚集索引,而且這個非聚集索引覆蓋了所有查詢列-- 實際執行時,只需要 邏輯讀取 10 次
where a.member_no = b.member_no
不信,你可以看這兩個sql 的執行計劃,以及邏輯讀信息,都是一樣的。
其實上面的sql,如果優化成下面的方式,實際的邏輯讀消耗也是一樣的。為何sql server 不會優化成下面的方式。是因為 and 操作符優化的另外一個原則。
1/26 的數據和 1/6 的數據找交集的速度要比 1/52 的數據和 1/3 的數據找交集速度要慢。
select a.member_no,a.firstname,b.region_nofrom(select m.member_no, m.firstname from dbo.member as mwhere m.firstname like 'k%' -- 1/26 數據) a,
(select m.member_no, m.region_no from dbo.member as mwhere m.region_no > 6 and m.member_no < 5000-- 1/3 * 1/ 2 數據) bwhere a.member_no = b.member_no
當然,我們要學習sql 如何優化的話,就會用到查詢語句中的一個功能,指定查詢使用哪個索引來進行。
比如下面的查詢語句
select m.member_no, m.firstname, m.region_nofrom dbo.member as m with (index (0))where m.firstname like 'k%' and m.region_no > 6 and m.member_no < 5000go
select m.member_no, m.firstname, m.region_nofrom dbo.member as m with (index (1))where m.firstname like 'k%' and m.region_no > 6 and m.member_no < 5000goselect m.member_no, m.firstname, m.region_nofrom dbo.member as m with (index (membercovering3))where m.firstname like 'k%' and m.region_no > 6 and m.member_no < 5000goselect m.member_no, m.firstname, m.region_nofrom dbo.member as m with (index (memberfirstname, member_region_link))where m.firstname like 'k%' and m.region_no > 6 and m.member_no < 5000go
這里 index 計算符可以是 0 ,1, 指定的一個或者多個索引名字。對於 0 ,1 的意義如下:
如果存在聚集索引,則 index(0) 強制執行聚集索引掃描,index(1) 強制執行聚集索引掃描或查找(使用性能最高的一種)。
如果不存在聚集索引,則 index(0) 強制執行表掃描,index(1) 被解釋為錯誤。
總結知識點:
簡單來說,我們可以這么理解:sql server 對於每一條查詢語句。會根據實際索引情況(sysindexes 系統表中存儲這些信息),分析每種組合可能的成本。然後選擇它認為成本最小的一種。作為它實際執行的計劃。
成本代價計算的一個主要組成部分是邏輯i/o的數量,特別是對於單表的查詢。
and 操作要滿足所有條件,這樣,經常會要求對幾個數據集作交集。數據集越小,數據集的交集計算越節省成本。
的項目中,竟然出現了濫用聚集索引的問題。看來沒有培訓最最基礎的索引的意義,代價,使用場景,是一個非常大的失誤。這篇博客就是從這個角度來羅列索引的基礎知識。
使用索引的意義
索引在資料庫中的作用類似於目錄在書籍中的作用,用來提高查找信息的速度。
使用索引查找數據,無需對整表進行掃描,可以快速找到所需數據。
使用索引的代價
索引需要佔用數據表以外的物理存儲空間。
創建索引和維護索引要花費一定的時間。
當對表進行更新操作時,索引需要被重建,這樣降低了數據的維護速度。
創建索引的列
主鍵
外鍵或在表聯接操作中經常用到的列
在經常查詢的欄位上最好建立索引
不創建索引的列
很少在查詢中被引用
包含較少的惟一值
定義為 text、ntext 或者 image 數據類型的列
heaps是staging data的很好選擇,當它沒有任何index時
excellent for high performance data loading (parallel bulk load and parallel index creation after load)
excellent as a partition to a partitioned view or a partitioned table
聚集索引提高性能的方法,在前面幾篇博客中分別提到過,下面只是一個簡單的大綱,細節請參看前面幾篇博客。
何時創建聚集索引?
clustered index會提高大多數table的性能,尤其是當它滿足以下條件時:
獨特, 狹窄, 靜止: 最重要的條件
持續增長的,最好是只向上增加。例如:
identity
date, identity
guid (only when using newsequentialid() function)
聚集索引唯一性(獨特型的問題)
由於聚集索引的b+樹結構的葉子節點必須指向具體數據。如果你要建立聚集索引的列不唯一,並且你指定的創建的聚集索引是非唯一的聚集索引,則會有以下情況:
如果未使用 unique 屬性創建聚集索引,資料庫引擎 將向表自動添加一個四位元組 uniqueifier 列。必要時,資料庫引擎 將向行自動添加一個 uniqueifier 值,使每個鍵唯一。此列和列值供內部使用,用戶不能查看或訪問。
Ⅶ 高手進!access資料庫變大,通過修復資料庫壓縮沒效果
這里提供我的一些經驗給你,相信能幫到你。
ACCESS資料庫
經過一段時間添加、更改和刪除
資料庫對象
後會產生很多代碼及資料庫對象碎片和垃圾,對於這些東西常規的壓縮
修復資料庫
的辦法是無法清除的。這也是為什麼你的ACCESS
數據壓縮
後,大小不變的原因所在。怎麼辦呢?可以這樣做:先建立一個同名空白資料庫,放在另一個文件夾下,接著打開該空白資料庫,導入原資料庫全部有用的對象(包括:表、窗體、查詢、模塊、頁、宏,無用的不要導入)
ACCESS2003
導入對象舉例:
文件——獲取外部數據——導入
,打開「導入」對話框選擇需要縮小的資料庫後,點擊導入按鈕,打開「導入對象」對話框
選擇全部有用的資料庫對象,例如表、窗體、查詢等等後點擊「確定」按鈕
完成導入全部資料庫對象。經過上述過程後,所有的資料庫垃圾都會被徹底清除掉。再對其進行一次壓縮操作,你的ACCESS資料庫將會處在理論上最小狀態,需要設置工作組安全機制的需要從新設置安全機制。
跟著將這個沒有垃圾的新資料庫覆蓋原有的資料庫就好了。
****注意實施這些操作之前,務必將原有
資料庫備份
好放在安全的地方,以免誤操作導致數據丟失,造成無法挽回的損失!!!!
Ⅷ 資料庫:求F={A→B,B→A,B→C,A→C,C→A},最小(極小)函數依賴集合
利用分解規則,將所有的函數依賴變成右邊都是單個屬性的函數依賴。從題目來看,F中的任何一個函數依賴的右部僅含有一個屬性:{A→B,B→A,B→C,A→C,C→A}
第二步去冗餘的的順序不同,產生結果也會不同,故最小函數依賴集合不止一個,還可發現另一個最小(極小)函數依賴集合為:{A→B,B→A,A→C,C→A}
給定一個數集A,假設其中的元素為x。現對A中的元素x施加對應法則f,記作f(x),得到另一數集B。假設B中的元素為y。則y與x之間的等量關系可以用y=f(x)表示。函數概念含有三個要素:定義域A、值域C和對應法則f。其中核心是對應法則f,它是函數關系的本質特徵。
(8)資料庫最小覆蓋擴展閱讀:
函數的對應法則通常用解析式表示,但大量的函數關系是無法用解析式表示的,可以用圖像、表格及其他形式表示。
函數與不等式和方程存在聯系(初等函數)。令函數值等於零,從幾何角度看,對應的自變數的值就是圖像與X軸的交點的橫坐標;從代數角度看,對應的自變數是方程的解。
另外,把函數的表達式(無表達式的函數除外)中的「=」換成「<」或「>」,再把「Y」換成其它代數式,函數就變成了不等式,可以求自變數的范圍。
Ⅸ 元資料庫
元數據是「關於數據的數據」,存在於電子信息環境中,用於描述資源的屬性,呈現其關系,支持資源發現、管理與有效利用(徐筱紅,2006),是對所採集到的數據的說明。一般來說,它有兩方面的用途:首先,元數據能提供基於用戶的信息,如記錄數據項的業務描述信息的元數據能幫助用戶使用數據;其次,元數據能支持系統對數據的管理和維護,如關於數據項存儲方法的元數據能支持系統以最有效的方式訪問數據。具體來說,在塔里木河流域生態環境動態監測及輔助決策支持系統綜合資料庫系統中,元數據機制主要支持以下幾類系統管理功能:①描述哪些數據在綜合資料庫中;②定義要進入資料庫中的數據和從資料庫中產生的數據;③記錄並檢測系統數據一致性的要求和執行情況;④衡量數據質量。
(一)元數據分級與特徵
1.元數據分級
基本元數據:提供地理數據源基本文檔所需要的最少的元數據元素集。
完全元數據:提供完整的地理數據源(單獨的數據集、數據集系列、各種地理要素)文檔所需要的必選的和可選的元數據元素集。它完整地定義全部元數據,以便標識、評價、摘錄、使用和管理地理信息。
2.元數據特徵
(1)名稱:賦給元數據實體或元素的標記。
(2)標識碼:計算機中使用的定義每個元數據實體和元素的唯一代碼。代碼結構為:XXXXXX
前2位為元數據子集,2位數字碼;中間2位為元數據實體/獨立元素,2位數字碼;後2位為元數據實體包含的元素,2位數字碼。
(3)定義:對元數據實體和元素的說明。
(4)性質:說明元數據實體或元素是否總是出現,或有時出現的描述符。描述符分別為:M-必選;C-一定條件下必選;O-可選。
(5)條件:說明何種條件下元數據子集、實體或元素是必選的。如果對所說明的條件成立,那麼該子集、實體或元素就是必選的。
(6)最大出現次數:指定元數據實體或元素在實際使用時,可能重復出現的最大次數。只出現一次的表示為「1」,重復出現的表示為「N」。
(7)數據類型:表示元數據元素的一組不同的值,例如,「文本」、「整型」、「短語」、「坐標串」、「實型」和「日期」。
(8)值域:指定每個元數據元素的取值范圍。「任意長文本」表示所述內容不受限制,實型數和基於代碼的整型數等只能使用一個限定的(閉合的)值域內的值。
(二)元資料庫主要內容
塔里木河流域生態環境動態監測系統的元數據包括數字影像圖、數字柵格圖、數字高程模型、數字線劃圖等。大部分數據都有相應的國家或行業元數據標准規范,有國家或行業標準的按照標准規范採集;沒有規范的,按照元數據的分級特徵進行定義。主要包括有關數據源、數據分層、成果歸屬、空間參照系、數據質量(包含數據精度和數據評價)、數據更新、圖幅接邊等方面的信息(周騁等,2006)。其主要內容描述如下:
(1)標識信息:是唯一標識數據集的元數據信息。包括數據集名稱、發布時間、版本、語種、摘要、現狀、空間范圍(地理范圍、時間范圍)、表示方式、空間解析度、信息類別。
(2)數據質量信息:是數據集質量的總體評價。包括數據集內容完整性說明、數據集在概念、值域、格式和拓撲關系等方面的一致性程度、位置精度(空間位置絕對精度和相對精度)、時間精度(表示時間的精確程度、現勢性、有效性)、屬性精度(數據集屬性分類正確性、屬性值的精度和正確性)、數據質量保證措施。
(3)數據字典信息:包含數據集應用、數據源及生產數據集時所用工藝方法等信息。
(4)空間參照系信息:數據集使用的空間參照系統的說明。包括基於地理標識的空間參照系統、基於坐標的空間參照系統。
(5)內容信息:描述數據集的主要內容。包括主要要素類型名稱及相應的屬性名稱、影像數據集內容概述(波長、波段、灰階等級、合成處理方式)、柵格數據集內容概述(格網尺寸、格網尺寸單位、格網行列數、格網起始點坐標)。
(6)元數據參考信息:包括元數據發布或更新的時間,以及建立元數據單位的聯系信息。
以上6類由兩個公共數據類型聯系,公共數據類型包括:
(1)覆蓋范圍信息:數據集的空間范圍(經緯度坐標、地理標識符)、時間范圍(起始時間、終止時間)、垂向范圍(最小垂向坐標值、最大垂向坐標值、計量單位)。
(2)負責單位聯系信息:與數據集有關的單位標識(負責單位名稱、聯系人、職責)和聯系信息(電話、傳真、通信地址、郵政編碼、電子信箱地址、網址)。
(三)元數據入庫
元數據信息是一個純文本文件,在生產時採集了多項數據,它是與圖形數據、屬性數據緊密聯系在一起的,按照每幅圖一個文本文件存儲。為了實現資料庫系統中元數據與數據體的集成化管理,以及元數據與數據體的一體化相互檢索查詢,需將元數據信息空間化。採取的技術方法就是將元數據文件與圖幅結合表聯系起來,將每一幅圖形的區域作為一個目標對象,所採集的多項元數據信息作為其屬性項,構成一個以圖幅結合表為基礎的矢量格式元數據集。同圖形數據坐標系統一樣,元數據採用地理坐標系統,整個流域則以Coverage格式整體存儲,數據處理完成後全部導入到Oracle9i資料庫中。
Ⅹ 資料庫包括哪些
問題一:資料庫系統包括什麼? 通常由軟體、資料庫和數據管理員組成。
問題二:請問資料庫有哪些種類呢? 根據存儲模型劃分,資料庫類型主要可分為:網狀資料庫(Network Database)、關系資料庫(Relational Database)、樹狀資料庫(Hierarchical Database)、面向對象資料庫(Object-oriented Database)等。商業應用中主要是關系資料庫,比如Oracle、DB2、Sybase、MS SQL Server、Informax、MySQL等。全部羅列出來是沒有意義的,資料庫太多了,你不說你的工作是涉及哪方面,恐怕很難提供更適合你的資料庫。
初級應用一般是ACCESS 配合的腳本程序一般是 ASP ASP.NET JSPMICROSOFT SQL 比較復雜點 不過功能強大很多 配合的腳本和ACCESS的一樣MYSQL和PHP的組合是比較完美的如果你需要處理1000W條數據以上級別的數據,那以上的都不合適,一般用的比較多的是ORACLE 這個入門難度非常大如果想學的話就先學MICROSOFT SQL吧,這個網上教學比較多,ASP.NET 2.0,應用的是非常廣泛的。
問題三:sql數據類型有哪些 一、 整數數據類型
整數數據類型是最常用的數據類型之一。
1、INT (INTEGER)
INT (或INTEGER)數據類型存儲從-2的31次方 (-2 ,147 ,483 ,648) 到2的31次方-1 (2 ,147 ,483,647) 之間的所有正負整數。每個INT 類型的數據按4 個位元組存儲,其中1 位表示整數值的正負號,其它31 位表示整數值的長度和大小。
2、SMALLINT
SMALLINT 數據類型存儲從-2的15次方( -32, 768) 到2的15次方-1( 32 ,767 )之間的所有正負整數。每個SMALLINT 類型的數據佔用2 個位元組的存儲空間,其中1 位表示整數值的正負號,其它15 位表示整數值的長度和大小。
3、TINYINT
TINYINT數據類型存儲從0 到255 之間的所有正整數。每個TINYINT類型的數據佔用1 個位元組的存儲空間。
4、BIGINT
BIGINT 數據類型存儲從-2^63 (-9 ,223, 372, 036, 854, 775, 807) 到2^63-1( 9, 223, 372, 036 ,854 ,775, 807) 之間的所有正負整數。每個BIGINT 類型的數據佔用8個位元組的存儲空間。
二、 浮點數據類型
浮點數據類型用於存儲十進制小數。浮點數值的數據在SQL Server 中採用上舍入(Round up 或稱為只入不舍)方式進行存儲。所謂上舍入是指,當(且僅當)要舍入的數是一個非零數時,對其保留數字部分的最低有效位上的數值加1 ,並進行必要的進位擾腔清。若一個數是上舍入數,其絕對值不會減少。如:對3.14159265358979 分別進行2 位和12位舍入,結果為3.15 和3.141592653590。
1、REAL 數據類型
REAL數據類型可精確到第7 位小數,其范圍為從-3.40E -38 到3.40E +38。 每個REAL類型的數據佔用4 個位元組的存儲空間。
2、FLOAT
FLOAT數據類型可精確到第15 位小數,其范圍為從-1.79E -308 到1.79E +308。 每個FLOAT 類型的數據佔用8 個位元組的存儲空間。 FLOAT數據類型可寫為FLOAT[ n ]的形式。n 指定FLOAT 數據的精度。n 為1到15 之間的整數值。當n 取1 到7 時,實際上是定義了一個REAL 類型的數據,系統用4 個位元組存儲它圓慎;當n 取8 到15 時,系統認為其是FLOAT 類型,用8 個位元組存儲它。
3、DECIMAL
DECIMAL數據類型可以提供小數所需要的實際存儲空間,但也有一定的限制,您可以用2 到17 個位元組來存儲從-10的38次方-1 到10的38次方-1 之間的數值。可將其寫為DECIMAL[ p [s] ]的形式,p 和s 確定了精確的比例和數位。其中p 表示可供存儲的值緩前的總位數(不包括小數點),預設值為18; s 表示小數點後的位數,預設值為0。 例如:decimal (15 5),表示共有15 位數,其中整數10 位,小數5。 位表4-3 列出了各精確度所需的位元組數之間的關系。
4、NUMERIC
NUMERIC數據類型與DECIMAL數據類型完全相同。
注意:SQL Server 為了和前端的開發工具配合,其所支持的數據精度默認最大為28位。
三、 二進制數據類型
1、BINARY
BINARY 數據類型用於存儲二進制數據。其定義形式為BINARY( n), n 表示數據的長度,取值為1 到......>>
問題四:常用資料庫有哪些? 1. IBM 的DB2
作為關系資料庫領域的開拓者和領航人,IBM在1997年完成了System R系統的原型,1980年開始提供集成的資料庫伺服器―― System/38,隨後是SQL/DSforVSE和VM,其初始版本與SystemR研究原型密切相關。DB2 forMVSV1 在1983年推出。該版本的目標是提供這一新方案所承諾的簡單性,數據不相關性和用戶生產率。1988年DB2 for MVS 提供了強大的在線事務處理(OLTP)支持,1989 年和1993 年分別以遠程工作單元和分布式工作單元實現了分布式資料庫支持。最近推出的DB2 Universal Database 6.1則是通用資料庫的典範,是第一個具備網上功能的多媒體關系資料庫管理系統,支持包括Linux在內的一系列平台。
2. Oracle
Oracle 前身叫SDL,由Larry Ellison 和另兩個編程人員在1977創辦,他們開發了自己的拳頭產品,在市場上大量銷售,1979 年,Oracle公司引入了第一個商用SQL 關系資料庫管理系統。Oracle公司是最早開發關系資料庫的廠商之一,其產品支持最廣泛的操作系統平台。目前Oracle關系資料庫產品的市場佔有率名列前茅。
3. Informix
Informix在1980年成立,目的是為Unix等開放操作系統提供專業的關系型資料庫產品。公司的名稱Informix便是取自Information 和Unix的結合。Informix第一個真正支持SQL語言的關系資料庫產品是Informix SE(StandardEngine)。InformixSE是在當時的微機Unix環境下主要的資料庫產品。它也是第一個被移植到Linux上的商業資料庫產品。
4. Sybase
Sybase公司成立於1984年,公司名稱「Sybase」取自「system」和 「database」 相結合的含義。Sybase公司的創始人之一Bob Epstein 是Ingres 大學版(與System/R同時期的關系資料庫模型產品)的主要設計人員。公司的第一個關系資料庫產品是1987年5月推出的Sybase SQLServer1.0。Sybase首先提出Client/Server 資料庫體系結構的思想,並率先在Sybase SQLServer 中實現。
5. SQL Server
1987 年,微軟和 IBM合作開發完成OS/2,IBM 在其銷售的OS/2 ExtendedEdition 系統中綁定了OS/2Database Manager,而微軟產品線中尚缺少資料庫產品。為此,微軟將目光投向Sybase,同Sybase 簽訂了合作協議,使用Sybase的技術開發基於OS/2平台的關系型資料庫。1989年,微軟發布了SQL Server 1.0 版。
6. PostgreSQL
PostgreSQL 是一種特性非常齊全的自由軟體的對象――關系性資料庫管理系統(ORDBMS),它的很多特性是當今許多商業資料庫的前身。PostgreSQL最早開始於BSD的Ingres項目。PostgreSQL 的特性覆蓋了SQL-2/SQL-92和SQL-3。首先,它包括了可以說是目前世界上最豐富的數據類型的支持;其次,目前PostgreSQL 是唯一支持事務、子查詢、多版本並行控制系統、數據完整性檢查等特性的唯一的一種自由軟體的資料庫管理系統.
......>>
問題五:資料庫的對象有哪些 Funciton:函數
Procere:存儲過程
Package:代碼包,一個包裡面,定義多個存儲過程、函數、類型、常量等
Type:自定義數據類型
Trigger:觸發器
Job:資料庫作業 (定期執行的)
Table:表
Index:索引
Constraint:約束,限制各數據項應滿足哪些限閥條件
View:視圖
Materialized View:物化視圖
Sequence:序列
User:叫 用戶
Synonym:同義詞
Database link:資料庫鏈接(ORACLE有,別的資料庫不熟,想必也應該有,可能不叫這個名字)
TableSpace:表空間(ORACLE叫這個名字,別的資料庫不熟)
CURSOR:游標
常用的大致這些,可能會有遺漏,但也應該不會差太多。
問題六:常用資料庫有哪些?他們有什麼區別 開源的Mysql頂;PostgreSQL即開放源碼的
商業的Oracle/SQL Server/DB2即收費的
問題七:查看資料庫中有哪些表空間 可以用S罰L語句 SELECT ** FROM v$tablespace
也可以用oracle enterprise manger console 直接在可視化窗口上查看
問題八:常見的資料庫應用系統有哪些? 現在極大多的企業級軟體都是基於資料庫的。
比如:
ERP: 企業資源管理計劃
CRM: 客戶關系管理
OA: 辦公自動化。
12306鐵道部的網上訂票系統。
。。。
問題九:如何看mysql都有哪些資料庫 第一步:首先是查看mysql資料庫的埠號,使用命令show
第二步:查看有哪些資料庫,
第三步:查看mysql資料庫所有用戶,
第四步:查看某個資料庫中所有的表
問題十:資料庫系統包括什麼? 通常由軟體、資料庫和數據管理員組成。