欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
博客園 - First we try, then we trust - 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù)

在《數據庫原理》里面,對聚簇索引的解釋是:聚簇索引的順序就是數據的物理存儲順序,而對非聚簇索引的解釋是:索引順序與數據物理排列順序無(wú)關(guān)。正式因為如此,所以一個(gè)表最多只能有一個(gè)聚簇索引。

不過(guò)這個(gè)定義太抽象了。在SQL Server中,索引是通過(guò)二叉樹(shù)的數據結構來(lái)描述的,我們可以這么理解聚簇索引:索引的葉節點(diǎn)就是數據節點(diǎn)。而非聚簇索引的葉節點(diǎn)仍然是索引節點(diǎn),只不過(guò)有一個(gè)指針指向對應的數據塊。如下圖:


非聚簇索引

 


聚簇索引


聚簇索引與非聚簇索引的本質(zhì)區別到底是什么?什么時(shí)候用聚簇索引,什么時(shí)候用非聚簇索引?

這是一個(gè)很復雜的問(wèn)題,很難用三言?xún)烧Z(yǔ)說(shuō)清楚。我在這里從SQL Server索引優(yōu)化查詢(xún)的角度簡(jiǎn)單談?wù)?如果對這方面感興趣的話(huà),可以讀一讀微軟出版的《Microsoft SQL Server 2000數據庫編程》第3單元的數據結構引論以及第6、13、14單元)。


一、索引塊與數據塊的區別

大家都知道,索引可以提高檢索效率,因為它的二叉樹(shù)結構以及占用空間小,所以訪(fǎng)問(wèn)速度塊。讓我們來(lái)算一道數學(xué)題:如果表中的一條記錄在磁盤(pán)上占用1000字節的話(huà),我們對其中10字節的一個(gè)字段建立索引,那么該記錄對應的索引塊的大小只有10字節。我們知道,SQL Server的最小空間分配單元是“頁(yè)(Page)”,一個(gè)頁(yè)在磁盤(pán)上占用8K空間,那么這一個(gè)頁(yè)可以存儲上述記錄8條,但可以存儲索引800條?,F在我們要從一個(gè)有8000條記錄的表中檢索符合某個(gè)條件的記錄,如果沒(méi)有索引的話(huà),我們可能需要遍歷8000條×1000字節/8K字節=1000個(gè)頁(yè)面才能夠找到結果。如果在檢索字段上有上述索引的話(huà),那么我們可以在8000條×10字節/8K字節=10個(gè)頁(yè)面中就檢索到滿(mǎn)足條件的索引塊,然后根據索引塊上的指針逐一找到結果數據塊,這樣IO訪(fǎng)問(wèn)量要少的多。


二、索引優(yōu)化技術(shù)

是不是有索引就一定檢索的快呢?答案是否。有些時(shí)候用索引還不如不用索引快。比如說(shuō)我們要檢索上述表中的所有記錄,如果不用索引,需要訪(fǎng)問(wèn)8000條×1000字節/8K字節=1000個(gè)頁(yè)面,如果使用索引的話(huà),首先檢索索引,訪(fǎng)問(wèn)8000條×10字節/8K字節=10個(gè)頁(yè)面得到索引檢索結果,再根據索引檢索結果去對應數據頁(yè)面,由于是檢索所有數據,所以需要再訪(fǎng)問(wèn)8000條×1000字節/8K字節=1000個(gè)頁(yè)面將全部數據讀取出來(lái),一共訪(fǎng)問(wèn)了1010個(gè)頁(yè)面,這顯然不如不用索引快。

SQL Server內部有一套完整的數據檢索優(yōu)化技術(shù),在上述情況下,SQL Server的查詢(xún)計劃(Search Plan)會(huì )自動(dòng)使用表掃描的方式檢索數據而不會(huì )使用任何索引。那么SQL Server是怎么知道什么時(shí)候用索引,什么時(shí)候不用索引的呢?SQL Server除了日常維護數據信息外,還維護著(zhù)數據統計信息,下圖是數據庫屬性頁(yè)面的一個(gè)截圖:

從圖中我們可以看到,SQL Server自動(dòng)維護統計信息,這些統計信息包括數據密度信息以及數據分布信息,這些信息幫助SQL Server決定如何制定查詢(xún)計劃以及查詢(xún)是是否使用索引以及使用什么樣的索引(這里就不再解釋它們到底如何幫助SQL Server建立查詢(xún)計劃的了)。我們還是來(lái)做個(gè)實(shí)驗。建立一張表:tabTest(ID, unqValue,intValue),其中ID是整形自動(dòng)編號主索引,unqValue是uniqueidentifier類(lèi)型,在上面建立普通索引,intValue 是整形,不建立索引。之所以?huà)焐弦粋€(gè)沒(méi)有索引的intValue字段,就是防止SQL Server使用索引覆蓋查詢(xún)優(yōu)化技術(shù),這樣實(shí)驗就起不到作用了。向表中錄入10000條隨機記錄,代碼如下:

CREATE TABLE [dbo].[tabTest] (
 
[ID] [int] IDENTITY (11NOT NULL ,
 
[unqValue] [uniqueidentifier] NOT NULL ,
 
[intValue] [int] NOT NULL 
ON [PRIMARY]
GO

ALTER TABLE [dbo].[tabTest] WITH NOCHECK ADD 
 
CONSTRAINT [PK_tabTest] PRIMARY KEY  CLUSTERED 
 (
  
[ID]
 )  
ON [PRIMARY] 
GO

ALTER TABLE [dbo].[tabTest] ADD 
 
CONSTRAINT [DF_tabTest_unqValue] DEFAULT (newid()) FOR [unqValue]
GO

CREATE  INDEX [IX_tabTest_unqValue] ON [dbo].[tabTest]([unqValue]ON [PRIMARY]
GO

declare @i int
declare @v int

set @i=0
while @i<10000
begin
    
set @v=rand()*1000    
    
insert into tabTest ([intValue]values (@v)
    
set @i=@i+1
end

然后我們執行兩個(gè)查詢(xún)并查看執行計劃,如圖:(在查詢(xún)分析器的查詢(xún)菜單中可以打開(kāi)查詢(xún)計劃,同時(shí)圖上第一個(gè)查詢(xún)的GUID是我從數據庫中找的,大家做實(shí)驗的時(shí)候可以根據自己數據庫中的值來(lái)定):



從圖中可以看出,在第一個(gè)查詢(xún)中,SQL Server使用了IX_tabTest_unqValue索引,根據箭頭方向,計算機先在索引范圍內找,找到后,使用Bookmark Lookup將索引節點(diǎn)映射到數據節點(diǎn)上,最后給出SELECT結果。在第二個(gè)查詢(xún)中,系統直接遍歷表給出結果,不過(guò)它使用了聚簇索引,為什么呢?不要忘了,聚簇索引的頁(yè)節點(diǎn)就是數據節點(diǎn)!這樣使用聚簇索引會(huì )更快一些(不受數據刪除、更新留下的存儲空洞的影響,直接遍歷數據是要跳過(guò)這些空洞的)。

下面,我們在SQL Server中將ID字段的聚簇索引更改為非聚簇索引,然后再執行select * from tabTest,這回我們看到的執行計劃變成了:

SQL Server沒(méi)有使用任何索引,而是直接執行了Table Scan,因為只有這樣,檢索效率才是最高的。


三、聚簇索引與非聚簇索引的本質(zhì)區別

現在可以討論聚簇索引與非聚簇索引的本質(zhì)區別了。正如本文最前面的兩個(gè)圖所示,聚簇索引的葉節點(diǎn)就是數據節點(diǎn),而非聚簇索引的頁(yè)節點(diǎn)仍然是索引檢點(diǎn),并保留一個(gè)鏈接指向對應數據塊。

還是通過(guò)一道數學(xué)題來(lái)看看它們的區別吧:假設有一8000條記錄的表,表中每條記錄在磁盤(pán)上占用1000字節,如果在一個(gè)10字節長(cháng)的字段上建立非聚簇索引主鍵,需要二叉樹(shù)節點(diǎn)16000個(gè)(這16000個(gè)節點(diǎn)中有8000個(gè)葉節點(diǎn),每個(gè)頁(yè)節點(diǎn)都指向一個(gè)數據記錄),這樣數據將占用8000條×1000字節/8K字節=1000個(gè)頁(yè)面;索引將占用16000個(gè)節點(diǎn)×10字節/8K字節=20個(gè)頁(yè)面,共計1020個(gè)頁(yè)面。

同樣一張表,如果我們在對應字段上建立聚簇索引主鍵,由于聚簇索引的頁(yè)節點(diǎn)就是數據節點(diǎn),所以索引節點(diǎn)僅有8000個(gè),占用10個(gè)頁(yè)面,數據仍然占有1000個(gè)頁(yè)面。

下面我們看看在執行插入操作時(shí),非聚簇索引的主鍵為什么比聚簇索引主鍵要快。主鍵約束要求主鍵不能出現重復,那么SQL Server是怎么知道不出現重復的呢?唯一的方法就是檢索。對于非聚簇索引,只需要檢索20個(gè)頁(yè)面中的16000個(gè)節點(diǎn)就知道是否有重復,因為所有主鍵鍵值在這16000個(gè)索引節點(diǎn)中都包含了。但對于聚簇索引,索引節點(diǎn)僅僅包含了8000個(gè)中間節點(diǎn),至于會(huì )不會(huì )出現重復必須檢索另外1000個(gè)頁(yè)數據節點(diǎn)才知道,那么相當于檢索10+1000=1010個(gè)頁(yè)面才知道是否有重復。所以聚簇索引主鍵的插入速度要比非聚簇索引主鍵的插入速度慢很多。

讓我們再來(lái)看看數據檢索的效率,如果對上述兩表進(jìn)行檢索,在使用索引的情況下(有些時(shí)候SQL Server執行計劃會(huì )選擇不使用索引,不過(guò)我們這里姑且假設一定使用索引),對于聚簇索引檢索,我們可能會(huì )訪(fǎng)問(wèn)10個(gè)索引頁(yè)面外加1000個(gè)數據頁(yè)面得到結果(實(shí)際情況要比這個(gè)好),而對于非聚簇索引,系統會(huì )從20個(gè)頁(yè)面中找到符合條件的節點(diǎn),再映射到1000個(gè)數據頁(yè)面上(這也是最糟糕的情況),比較一下,一個(gè)訪(fǎng)問(wèn)了1010個(gè)頁(yè)面而另一個(gè)訪(fǎng)問(wèn)了1020個(gè)頁(yè)面,可見(jiàn)檢索效率差異并不是很大。所以不管非聚簇索引也好還是聚簇索引也好,都適合排序,聚簇索引僅僅比非聚簇索引快一點(diǎn)。


結語(yǔ)

好了,寫(xiě)了半天,手都累了。關(guān)于聚簇索引與非聚簇索引效率問(wèn)題的實(shí)驗就不做了,感興趣的話(huà)可以自己使用查詢(xún)分析器對查詢(xún)計劃進(jìn)行分析。SQL Server是一個(gè)很復雜的系統,尤其是索引以及查詢(xún)優(yōu)化技術(shù),Oracle就更復雜了。了解索引以及查詢(xún)背后的事情不是什么壞事,它可以幫助我們更為深刻的了解我們的系統。

posted on 2004-07-20 10:31 呂震宇 閱讀(4986) 評論(22)  編輯 收藏 收藏至365Key 所屬分類(lèi): 數據庫技術(shù)

評論

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2004-07-20 12:37 progame
非聚簇對于更新肯定是有優(yōu)勢的
而它在檢索的性能損失也不會(huì )太大

所以能不用聚簇當然是最好的了
但是如果使用\order by的話(huà) 
聚簇的優(yōu)勢也應該是很明顯的

樓主可以測試一下這方面的數據  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2004-07-20 12:41 progame
樓主的隨筆中第二條論述說(shuō)
非聚簇索引在排序上不輸給聚簇索引多少

可是我記得,在數據庫查詢(xún)優(yōu)化中有這樣一個(gè)原則:
盡量避免在sql語(yǔ)句中使用order by

那么對于聚簇索引的話(huà),我不需要order by,但我卻得到了已經(jīng)排序的結果,這其中的性能差異又有多大呢?  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2004-07-20 14:43 呂震宇
“對于聚簇索引的話(huà),我不需要order by,但我卻得到了已經(jīng)排序的結果”對于這句話(huà)我想未必。微軟從來(lái)沒(méi)有保證過(guò)使用聚簇索引的查詢(xún)一定按照聚簇索引的順序。不要忘了,SQL Server支持文件組,當一個(gè)數據庫表跨兩個(gè)文件甚至更多文件時(shí),你覺(jué)得結果會(huì )不會(huì )按聚簇索引順序輸出呢?
  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2004-07-20 15:28 呂震宇
還有一點(diǎn)在文中忘提到了,那就是復合查詢(xún)。比如SELECT * FROM tabTest WHERE ID<100 AND unqValue >=...,檢索條件涉及了ID與unqValue兩個(gè)字段,那么如何利用索引呢?先過(guò)濾unqValue還是先過(guò)濾ID?非聚簇索引能夠起到什么效果?所有這些就需要根據統計信息(數據密度、數據分布等)進(jìn)行估算了。到那個(gè)時(shí)候,有可能非聚簇索引帶來(lái)的效率提升比聚簇索引還要高。  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-01-27 13:34 hhh
關(guān)于: 三、聚簇索引與非聚簇索引的本質(zhì)區別
執行插入操作時(shí)
對于非聚簇索引,只需要檢索20個(gè)頁(yè)面中的16000個(gè)節點(diǎn)就知道是否有重復
但對于聚簇索引,索引節點(diǎn)僅僅包含了8000個(gè)中間節點(diǎn),至于會(huì )不會(huì )出現重復必須檢索另外8000個(gè)頁(yè)數據節點(diǎn)才知道,那么相當于檢索10+1000=1010個(gè)頁(yè)面才知道是否有重復。

這段不懂,前面不是說(shuō)“聚簇索引的葉節點(diǎn)就是數據節點(diǎn)”,怎么現在反倒聚簇索引還必須檢索另外8000個(gè)頁(yè)呢?  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-01-28 13:34 呂震宇
@hhh

對不起,我文章中的數字寫(xiě)錯了。應當是“至于會(huì )不會(huì )出現重復必須檢索另外1000個(gè)頁(yè)數據節點(diǎn)才知道”。因為聚簇索引的頁(yè)節點(diǎn)是數據節點(diǎn)。要想知道是否有重復,只有檢索頁(yè)節點(diǎn)才知道。所以聚簇索引的中間節點(diǎn)占10個(gè)頁(yè)面,數據節點(diǎn)占1000個(gè)頁(yè)面,共1010個(gè)頁(yè)面。  回復
  

# 其實(shí)我疑惑的倒不是1000或者8000個(gè)頁(yè)節點(diǎn) 2005-01-31 11:40 hhh
我想了解的是,為什么
"對于非聚簇索引,只需要檢索20個(gè)頁(yè)面中的16000個(gè)節點(diǎn)就知道是否有重復,因為所有主鍵鍵值在這16000個(gè)索引節點(diǎn)中都包含了。但對于聚簇索引,索引節點(diǎn)僅僅包含了8000個(gè)中間節點(diǎn),至于會(huì )不會(huì )出現重復必須檢索另外1000個(gè)頁(yè)數據節點(diǎn)才知道"

請問(wèn),聚簇索引不包含所有的主鍵鍵值嗎?包含8000個(gè)中間節點(diǎn)有什么意義呢  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-02-01 15:21 呂震宇
@hhh

其實(shí)要想實(shí)際計算出訪(fǎng)問(wèn)多少個(gè)頁(yè)面是很困難的事情,所以只能比喻一下。究竟訪(fǎng)問(wèn)多少個(gè)頁(yè)面是個(gè)未知數。

記得當時(shí)學(xué)FOXBASE時(shí),老師說(shuō),你可以將索引文件認為就是一張表,只是這張表中僅包含的索引關(guān)鍵字的值以及記錄號兩列。關(guān)于這點(diǎn),可以參考http://www2.cnblogs.com/zhenyulu/articles/28418.html,《從Visual FoxPro中的記錄號與邏輯刪除談起...》。比如說(shuō),我要找學(xué)號為100的記錄是否存在于表中,我們不必去訪(fǎng)問(wèn)表,僅僅訪(fǎng)問(wèn)一下索引文件就行了。磁盤(pán)IO將大大減少。SQL Server的索引道理是一樣的。

由于非聚簇索引中包含了所有主鍵的值(也叫做索引覆蓋查詢(xún)),所以當我們要找學(xué)號是100的人是否在表中,我們沒(méi)有必要去訪(fǎng)問(wèn)數據頁(yè)面,僅僅訪(fǎng)問(wèn)索引頁(yè)面就OK了。因為非聚簇索引的索引頁(yè)面包含了所有表中關(guān)鍵字段的值。

但對于聚簇索引就不一樣了,要想知道學(xué)號為100的學(xué)生是否在數據庫中,必須訪(fǎng)問(wèn)數據頁(yè)面才行,因為聚簇索引的葉節點(diǎn)是數據節點(diǎn)。這樣IO訪(fǎng)問(wèn)兩就增大了不少。

在本文開(kāi)始的兩張圖中,如果問(wèn)Ota這個(gè)人是否在數據庫中,你找找試試,看看哪個(gè)需要訪(fǎng)問(wèn)數據頁(yè)面,哪個(gè)不需要,再算一下哪個(gè)的IO訪(fǎng)問(wèn)量會(huì )大一些。  回復
  

# re: 我了解了 2005-02-02 08:21 hhh
忽然茅塞頓開(kāi),我明白了,樓主真強,了解的如此深入,而且對于我們這種初級問(wèn)題還回答這么細致,不頂不行啊:)  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-03-01 12:36 無(wú)情的雨
大家可以看看B-Tree,234Tree,理解后繼續發(fā)言[從數據結構了解本質(zhì)]  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-06-09 13:15 dragonpro
我一定要搞得清清楚楚

非聚集索引在定位數據時(shí)不會(huì )依靠主鍵吧  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-06-14 07:47 我只能向您說(shuō)聲謝謝
我只能向您說(shuō)聲謝謝!
以后能否多講些關(guān)于DAO.NET和SQL SERVER  回復
  

# 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-06-14 07:52 我只能向您說(shuō)聲謝謝
我只能向您說(shuō)聲謝謝!您真的好極了。
以后能否多講些關(guān)于A(yíng)DO.NET和SQL SERVER  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-06-19 04:27 wuw
完全不懂B+樹(shù),完全不懂聚簇索引為什么放在樹(shù)上。

比較中完全忽略了索引的基本結構——樹(shù),僅僅把他們當作兩個(gè)順序的集合,真是誤人子弟。  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-06-19 04:48 wuw
“現在我們要從一個(gè)有8000條記錄的表中檢索符合某個(gè)條件的記錄,如果沒(méi)有索引的話(huà),我們可能需要遍歷8000條×1000字節/8K字節=1000個(gè)頁(yè)面才能夠找到結果。如果在檢索字段上有上述索引的話(huà),那么我們可以在8000條×10字節/8K字節=10個(gè)頁(yè)面中就檢索到滿(mǎn)足條件的索引塊”

假設每100多個(gè)索引為一組,那么順著(zhù)B+樹(shù)搜索8000個(gè)記錄中的一個(gè)只需要兩次取得索引組,即使他們都在不同磁盤(pán)塊上也只需要兩次讀磁盤(pán)。而樓主竟計算出10次。由于樓主完全忽略b+樹(shù)結構,所以那些比較完全是胡亂解釋。  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-07-19 10:59 一個(gè)拙劣的程序員
對樓主的水平有很大的懷疑?。?!


記得當時(shí)學(xué)FOXBASE時(shí),老師說(shuō),你可以將索引文件認為就是一張表,只是這張表中僅包含的索引關(guān)鍵字的值以及記錄號兩列。關(guān)于這點(diǎn),可以參考http://www2.cnblogs.com/zhenyulu/articles/28418.html,《從Visual FoxPro中的記錄號與邏輯刪除談起...》。比如說(shuō),我要找學(xué)號為100的記錄是否存在于表中,我們不必去訪(fǎng)問(wèn)表,僅僅訪(fǎng)問(wèn)一下索引文件就行了。磁盤(pán)IO將大大減少。SQL Server的索引道理是一樣的。

由于非聚簇索引中包含了所有主鍵的值(也叫做索引覆蓋查詢(xún)),所以當我們要找學(xué)號是100的人是否在表中,我們沒(méi)有必要去訪(fǎng)問(wèn)數據頁(yè)面,僅僅訪(fǎng)問(wèn)索引頁(yè)面就OK了。因為非聚簇索引的索引頁(yè)面包含了所有表中關(guān)鍵字段的值。

但對于聚簇索引就不一樣了,要想知道學(xué)號為100的學(xué)生是否在數據庫中,必須訪(fǎng)問(wèn)數據頁(yè)面才行,因為聚簇索引的葉節點(diǎn)是數據節點(diǎn)。這樣IO訪(fǎng)問(wèn)兩就增大了不少。


1、如果對于聚簇索引,要想知道學(xué)號為100的學(xué)生是否在數據庫中,就必須要訪(fǎng)問(wèn)數據頁(yè)面才行的話(huà)。那么請問(wèn)聚簇索引中是否記錄著(zhù)學(xué)號“100”和這條對應記錄的地址呢?那么既然聚簇索引中都已經(jīng)記錄著(zhù)學(xué)號“100”了,那為什么還要去訪(fǎng)問(wèn)數據頁(yè)面才能知道是否有這個(gè)學(xué)生在數據庫中呢?真是亂彈琴!

2、“由于非聚簇索引中包含了所有主鍵的值(也叫做索引覆蓋查詢(xún))”!索引覆蓋查詢(xún)是這個(gè)意思嗎???嚴重吐血?。?!


  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-07-20 19:17 求索者
首先感謝樓主無(wú)私的把自己的見(jiàn)解寫(xiě)出來(lái),給后學(xué)者參考。
我感到困惑的內容其實(shí)與hhh提的內容差不多,只是他豁然開(kāi)朗了,我還沒(méi)明白。
假如利用聚簇索引檢索,每次還要到另外的1000個(gè)頁(yè)中去檢索一遍,那效率跟不建索引有什么區別啊,數據庫還辛辛苦苦將物理順序按照聚簇索引排序了一把,難道是數據庫設計者腦袋出了問(wèn)題。
我覺(jué)得“索引的葉節點(diǎn)就是數據節點(diǎn)。而非聚簇索引的葉節點(diǎn)仍然是索引節點(diǎn),只不過(guò)有一個(gè)指針指向對應的數據塊”這句話(huà)這樣理解是否更好一點(diǎn)啊。因為數據庫中的記錄已經(jīng)按聚簇索引排好了序,所以聚簇索引葉節點(diǎn)只需要記錄數據,至于它在數據庫中的實(shí)際位置,可以按記錄序號*記錄長(cháng)度+文件頭地址,就如你在《從Visual FoxPro中的記錄號與邏輯刪除談起...》中說(shuō)的那樣。而非聚簇索引就必須再加上數據對應地址才能真正確定位置。  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-07-23 18:01 呂震宇
@一個(gè)拙劣的程序員

關(guān)于你提出的第一個(gè)問(wèn)題,你可以從本文第二個(gè)圖中找找Ota是否在數據庫中就知道是否要訪(fǎng)問(wèn)數據頁(yè)面了。

關(guān)于你的第二個(gè)問(wèn)題,我想是我的筆誤,這可以我從后面的話(huà)推出“因為非聚簇索引的索引頁(yè)面包含了所有表中關(guān)鍵字段的值”。我這里將關(guān)鍵字段誤寫(xiě)成了主鍵,很?chē)乐氐腻e誤。這里的關(guān)鍵字(Key Words)指要查詢(xún)的字段。  回復
  

# 怎么樣對uniqueidentifier數據類(lèi)型的列進(jìn)行優(yōu)化呢? 2005-07-25 17:29 兩極狼
因為對uniqueidentifier來(lái)說(shuō),當數據量很大時(shí),對它的查詢(xún)將變得很慢,這時(shí)該如何實(shí)現對它的優(yōu)化呢???


望高手指點(diǎn)  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2005-12-01 03:52 三水
其實(shí)樓主解釋的很不錯了,簡(jiǎn)單易懂,如果大家學(xué)了數據結構很快就能理解大概意思,自己再加工就行了,不必對樓主的筆誤糾纏不休~  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2006-02-10 22:46 編程愛(ài)好者
嚴重支持呂老師~~
您寫(xiě)得‘相當‘之好啊:)
呵,套用了宋丹丹的‘相當‘
一詞  回復
  

# re: 聚簇索引與非聚簇索引的區別以及SQL Server查詢(xún)優(yōu)化技術(shù) 2006-03-23 03:52 素食
如果對于聚簇索引,要想知道學(xué)號為100的學(xué)生是否在數據庫中,就必須要訪(fǎng)問(wèn)數據頁(yè)面才行的話(huà)。那么請問(wèn)聚簇索引中是否記錄著(zhù)學(xué)號“100”和這條對應記錄的地址呢?那么既然聚簇索引中都已經(jīng)記錄著(zhù)學(xué)號“100”了,那為什么還要去訪(fǎng)問(wèn)數據頁(yè)面才能知道是否有這個(gè)學(xué)生在數據庫中呢?真是亂彈琴!

答: [記錄著(zhù)學(xué)號“100”]這句話(huà)要格外的留意 ,因為混淆了2個(gè)概念 ,其一fox溪流數據存儲方式中的行號對應于目前大型關(guān)系型數據庫的oid (這個(gè)東西在sql server里被微軟給藏起來(lái)了 也很少有人知道,但是其他很多尤其開(kāi)源的數據庫都有這個(gè)東西的)
[聚簇索引中都已經(jīng)記錄著(zhù)學(xué)號“100”]這句話(huà)重點(diǎn)是 ‘聚簇索引‘是文件 數據頁(yè)面 是runtime時(shí)候用于訪(fǎng)問(wèn)聚簇索引文件的數據部分當然了 這部分內容多的時(shí)候也會(huì )在內存和磁盤(pán)上同時(shí)存在

說(shuō)實(shí)話(huà) 我特別想和微軟說(shuō)的就是"把oid還給我好么" 因為10多年前我fox ,5年前我posetgres都有這東西啊,不過(guò)沒(méi)辦法估計他們不會(huì )滿(mǎn)足我這個(gè)過(guò)分的要求的 It‘s Unsafe 我替他們回答
  回復
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
sql索引碎片產(chǎn)生的原理 解決碎片的辦法(sql碎片整理)
MS SQL 索引(二)
《SQLServer2005數據庫案例教程》第6章索引和視圖
SQL Server索引 - 非聚集索引 <第七篇>
DCMS先鋒論壇-SQL Server 2005中的XML的最佳實(shí)踐
聚集索引結構
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久