2016-05-17 52 views
2

我聽說Sequence比Sql Server中的Identity更快。但是,我不認爲在實體框架中使用它是個好主意。因爲要在實體框架中使用序列,您應該額外撥打電話以獲取下一個序列。序列是否比實體框架中的標識更快?

int sequence = context.Database.SqlQuery<int>("SELECT NEXT VALUE FOR MySequenceName").FirstOrDefault(); 

因此,我認爲在實體框架中使用Sequence會比較慢。我對嗎?有人有什麼主意嗎?

+1

'SEQUENCE'本身並不比'IDENTITY'快。您可以控制緩存大小,在某些情況下可能會帶來很小的好處,但對於大型多行插入,序列確實較慢http://dba.stackexchange.com/a/31095/3690 –

+1

一般而言,您不應該更改你的代碼「因爲你聽說X比Y快」。你需要斷言的上下文(很少有這種情況,X總是勝過Y,並且是對Y的1-1替換 - 尤其是因爲如果它是真的,他們只會用X替換Y的實現)。你還需要考慮你是否真的有性能問題,以及它是否實際上是由'Y'引起的。 –

+0

謝謝大家的寶貴意見 –

回答

2

不一定(您需要多個db調用),您可以將EF與Stored Procs結合使用,並將序列中的ID檢索邏輯和插入到Sored Proc中。這可以簡化和抽象檢索和分配Ids,因此您不必將其編寫爲C#代碼的一部分。

如果你想保持簡單,只有在你認爲速度很關鍵並且不使用序列會影響Sql語句性能的地方使用Sequence。例如,在您希望執行大量批量插入的表上或想要預先確定ID以使插入多個表更加簡化。所有其他表格可以繼續使用Identity。

另請參閱此前的SO answer其中介紹瞭如何在EF代碼中使用Sequence,它幾乎與您的問題中已有的一樣,但包含其餘的c#代碼。

3

是的,序列比身份快,因爲你從內存中而不是從光盤中獲取。

他們可以在許多情況下使用,只要你想,但我認爲他們真正的力量是:

  • 使用一個唯一的密鑰在多個表的相同順序 前拿到鑰匙

如果你不需要這些點,那麼我只會使用身份,一個調用db,一個事務。 在實體框架中使用它,如你所說,你需要一個額外的電話來獲得密鑰,這並沒有使它真正有用。

1

我聽說Sequence比Sql Server中的Identity更快。

上次我檢查的時候,確實是相反的:Sequence and Identity Performance。當然,這種情況可能(也可能會)在下一個SQL Server版本中發生變化,但是現在 - 你聽錯了。

關於「額外通話」 - 你不認爲scope_identity()的結果出現在你的應用程序中純粹的magick,不是嗎?