2011-01-05 72 views
3

我剛剛爲Int PK加入Vs Guid PK做了一些測試。Int PK內連接Vs Guid PK內連接SQL Server。執行計劃

表結構和尋找這樣的記錄數:

alt text

使用EF4 CRUD操作的性能在兩種情況非常相似。

有衆所周知的是,在連接使用時,詮釋PK都有較好的表現,而不是字符串聲明。 與INNER所以SQL服務器執行計劃連接是完全不同的

下面是一個執行計劃:

alt text

按照我的理解與執行計劃,根據從上述詮釋加入具有更好的性能,因爲它少取聚集索引掃描的資源,它有兩種方式,對嗎?

可能是有人在更多的細節可以解釋這個執行計劃?

是這個例子足以說明,詮釋PK在加入更好的性能?

+0

這裏是我的相關問題什麼是更好的Int PK或Guid PK http://stackoverflow.com/questions/4593856/ef-4-0-guid-or-int-as-a-primary-key – Kuncevic 2011-01-05 04:51:56

+0

我不知道爲什麼它沒有使用Guid的合併連接。據推測,它必須有來自索引的2個排序輸入? – 2011-01-05 12:22:32

回答

2

我不能完全明白你正在嘗試如何實現或從本試驗發現,但這裏是突然出現在我的腦海裏,我看了你的問題,一些隨機throughts ...

1)在現實生活中使用的情況下,你很可能不會將兩個整個表在一起,但會有其他列等的過濾器,降低一個或兩個表要連接的紀錄。這將影響哪種類型的連接算法最適合/最有效。上述

的計劃是將兩個表連接在一起的結果,但如果你要過濾表中的一個或兩個上的一些列則優化可能會去一個完全不同的聯接類型。

2)加入GUID列時哪種類型的連接最好取決於如何生成GUID。如果你加入了許多完全隨機的GUID(例如用SQL Server的Ne​​wID()或CLR Guid.NewGuid()生成),那麼散列連接可能是最好的選擇。但是,如果您要加入一組較小的順序(newsequentialid()/ UuidCreateSequential()),或者甚至是相同的guid,那麼循環連接通常是最有效的選擇。

優化器使用索引統計信息,以確定哪些類型的連接使用的,但有時對於許多GUID複雜連接的查詢可能有必要強行與優化提示連接類型。


總之,如果你正在試圖做的是決定你是否應該使用GUID或INT的PK,然後一個更真實的測試是一個更好的選擇是什麼。創建與您的用例相匹配的表格,填充足夠多的有些逼真的示例數據,並執行一些您預計將要完成的查詢類型。將兩個虛擬表的全部內容連接在一起並沒有真正說明使用Guid鍵可能會對I/O造成的影響,或者執行計劃對於涉及int和guid鍵的其他查詢的外觀。

如果使用GUID項,考慮產生他們不同的選擇和記住,使用順序的GUID往往是避免過多的頁面的好辦法讀,如果你加入了很多紀錄......

+0

我只是想向自己證明Int PK在連接中有更好的表現,而不是GUID PK – Kuncevic 2011-01-05 05:13:53

+1

好的。答案是:「這取決於」。在某些情況下,使用Guid vs int的影響可以忽略不計。在其他情況下,隨機GUID可能會對I/O產生巨大影響。如果例如你有一個有數百萬條記錄的非常大的表格,你將要查找按順序生成的10000條記錄(例如[somedate]和[someotherdate]之間的順序),那麼隨機guid可能意味着每行至少查找一個頁面,位於數據文件的不同部分,而int(或連續guid)意味着您將獲得相鄰頁面(即讀取/ I/O少得多)。 – KristoferA 2011-01-05 05:21:49

+0

...添加到上面,加入兩個整個表意味着你正在讀取兩個表中的所有數據,所以唯一的I/O差異是由於guid字段佔用16個字節而不是4.連接部分表是如果您查找的記錄在整個索引/表格中相鄰或隨機分佈,您將看到區別。 – KristoferA 2011-01-05 05:24:02

3

金佰利特里普(在女王索引)的對話題的優秀博客文章:

Disk space is cheap.... that's not the point!

她很好地顯示「磁盤空間的說法是怎麼便宜 - 使用GUID而不是INT不痛「在很多方面完全是虛假的。

2

如果您在內部考慮如何比較計算機的值,則會變得很明顯。

  • 比較2個整數是一個快速的單個操作。
  • 比較2個16字節的GUID將需要幾條指令(或一個長度爲 之一) 。

此外,GUID使用4倍的空間,這將產生更多的分頁,更差的緩存使用率等等。

馬克提到的Kimberly Tripp的帖子證明了這一點。