整理的一些SQL題,與討論

keeking發表於2009-08-06

1.what is the difference between Clustered Indexes and Non-Clustered Indexes? when to use?

2.what is the domain in database?

3.which tools is use to identify problematic transaction?

4.how to use SQL when more than 3G memory?

5.when to thinking about profermance transaction in a project development?

---------------
域應該是概念資料庫模型的概念吧,好像對應的就是屋裡資料庫中的自定義資料型別,不知道這樣說對不對
--------------------------
記得在王珊和撒斯軒的資料庫基礎書中提到,
domain就是相同型別的集合,在資料庫中也就是對應到表中的同列值等。
-----------------------------------

個人理解:
自定義資料型別,能規範資料庫的表結構資料型別

比如:基礎表 BaseTable( Code,Name,...)

如果這樣的表在資料庫中有幾十甚至幾百個,而且還有N個版本的升級,如果不是用Domain(User datatype)來管理,大家會發現,Code的型別和長度是不同的,Name 是長度也是不同的,資料型別和長度不同在專案開發和資料轉換時,能帶來多大的麻煩,有經歷的人就知道。

如果在設計時 先定自義Domain
比如定義:
TypeCode Char(8)
TypeLongCode Varchar(32)
TypeName Varchar(20)
TypeLongName Varchar(200)

這樣可以解決上述問題

---------------------------------
第一個問題:

聚集索引

當建立聚集索引時,表裡所有的記錄按照聚集索引鍵的順序儲存。由於記錄被索引鍵物理地排序,所以每個表只能有一個聚集索引。你可以認為聚集索引的結構類似於一個檔案櫃:資料頁就像資料夾一樣存在按字母表排序的抽屜裡,而資料行象存在資料夾裡的記錄一樣也按照順序排列。

你可以把索引樹的中間層看成是也按順序排列的抽屜一樣,這有助於你找到合適的資料夾。

聚集索引在進行範圍查詢或在有重複值的列上搜尋時是很有用的,因為這些在一個範圍內的記錄都物理地存在相同的頁裡或鄰近的頁裡。

表的資料頁也就是聚集索引的葉級。要找到所有聚集索引的鍵值,SQL Server最終必須掃描所有的資料頁。

當使用聚集索引搜尋一個值時SQL Server要執行下面的步驟:
1.        查詢系統目錄以找到索引的根頁的地址
2.        用搜尋的值與根頁裡儲存的鍵值進行比較
3.        找到頁裡小於或等於搜尋值的最大鍵值
4.        按照鍵裡儲存的頁指標去索引的下一層找到合適的頁
5.        繼續按照頁指標(即重複步驟3和4)進行查詢直到到達資料頁
6.        搜尋資料頁上的記錄來定位任何和搜尋值匹配的記錄。如果資料頁上沒有找到匹配的記錄,那麼表沒有包含匹配的值。

非聚集索引
非聚集索引是獨立的索引結構,它獨立於表裡資料記錄的物理排序順序。每個表最多隻能有249個非聚集索引。

非聚集索引類似於書後面的目錄。為了找到特定主題所在的頁,可以查詢目錄裡特定的主題,然後翻到目錄所指向的頁即可。這是一個有效的方式,只要主題僅在很少的頁上。如果主題在很多頁上,或者如果要讀很多的主題,那麼更有效的方式是讀整本書。

非聚集索引工作原理類似於書的目錄。從索引的觀點來看,資料行是隨機分部在整個表裡的。非聚集索引樹按排序順序包含了索引鍵值。索引的葉級為表的每個資料行儲存一條記錄。葉級的每一行包含一個資料行定位器去定位表裡實際的資料行。

如果給表建立一個非聚集索引,索引葉級的資料行定位器實際是指向資料頁和記錄在該頁裡所在行號的一個指標(見圖29.3)。

SQL Server 7.0以前的的版本里,為了分辨鍵值引用的資料行,非聚集索引裡僅僅存的是行定位器(即RowID)。如果表上定義了一個聚集索引,且一行或更多的行移到了另一頁(INSERT或UPDATE的結果),那麼非聚集索引裡的所有相應的行都不得不更改以反映新的行ID。這加大插入和修改的成本。

在SQL Server 7.0和以後的版本里,在有聚集索引的表上,非聚集索引不再把資料行ID作為索引的一部分。相反,非聚集索引的資料行定位器跟聚集索引的鍵值相關聯。當SQL Server到達非聚集索引葉級時,它使用聚集索引鍵來開始搜尋聚集索引以找到實際的資料行(見圖29.4)。這增加了搜尋的I/O,但好處是如果在有聚集索引的表上發生了頁拆分,或者移動了記錄(例如,由於更新的原因),非聚集索引仍然保持不變。只要聚集索引鍵沒有更改,在索引裡就沒有資料行定位器被更改。

SQL Server在使用非聚集索引搜尋一個值時執行下面的步驟:
1.        查詢系統目錄以確定索引的根頁的地址。
2.        用搜尋的值與根頁裡儲存的索引鍵值進行比較。
3.        找到頁裡小於或等於搜尋值的最大鍵值。
4.        按照下頁指標去非聚集索引樹的下一層。
5.        繼續按照頁指標(即重複步驟3和4)進行查詢直到到達非聚集索引的葉頁。
6.        搜尋葉頁上的索引鍵所在的行以定位匹配搜尋值的所有行。如果葉頁上沒有找到匹配的行,那麼表沒有包含匹配的值。
7.        如果在葉頁上找到匹配的行,SQL Server按照資料行定位器找到資料頁上的資料行。


第二個問題:
資料庫裡域指的是物件屬性的取值範圍

第三個問題:
事件探查器

第四個問題:
http://www.windbi.com/showtopic-24.aspx
檢視啟用AWE那一部分的內容

第五個問題:
併發的時候

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7899089/viewspace-611495/,如需轉載,請註明出處,否則將追究法律責任。

相關文章