可以說我有一個這樣的會話表:用於經常插入和刪除的表的標識列的替代方法?
[Session]
-------
Id: int
UserId: int
試想一下,在一個非常高流量的網站使用,Sessions
是非常頻繁添加和刪除。如果我要將每個表的Id
列設置爲一個標識列,那麼我怎樣才能輕鬆維護Id的種子,以便它們不會達到int
數據類型的限制?有沒有其他方法可以確保我沒有想到的獨特ID?提前致謝。
可以說我有一個這樣的會話表:用於經常插入和刪除的表的標識列的替代方法?
[Session]
-------
Id: int
UserId: int
試想一下,在一個非常高流量的網站使用,Sessions
是非常頻繁添加和刪除。如果我要將每個表的Id
列設置爲一個標識列,那麼我怎樣才能輕鬆維護Id的種子,以便它們不會達到int
數據類型的限制?有沒有其他方法可以確保我沒有想到的獨特ID?提前致謝。
的不是int使其BIGINT,這將上升到9,223,372,036,854,775,807
當然你也可以在-9,223,372,036,854,775,808啓動以及
我意識到我可以做到這一點,但對我來說,在任何給定時間只有1000行的桌子都會有瘋狂的巨大身份號碼,所以我沒有必要爲它重新編號。也許這只是我的肛門,但我很好奇,如果有不同的方式。 – Ocelot20 2012-03-07 21:48:53
請參閱使ID的GUID,而不是爲int 。 你得到了獨特的會話ID,這是不可猜測的,並且很容易用Guid.NewGuid()實現。
如果您有一個網站維護期,您可以重新填寫標識列。只是簡單而已。
給定會話存在多久?如果任何會話持續時間不會超過X時間,並且您知道在任何給定時間您都不會有超過N次的會話出現,並且您知道添加新會話的最高比率,那麼您可以實現某種形式的循環隊列系統,循環使用一組最大的數字。
例如,如果您在任何給定的時間點在表格中的行數不超過1000行,則在任何給定的5分鐘內不會超過1000行,並且沒有行會持續超過2天(每晚清理程序?),那麼您每隔兩天就會經過1000 * 2 * 24 * 12 = 576,000個ID ...每兩天都會添加,使用和刪除系統中的每個ID。圍繞這個數字的一個大的安全係數(可能是5,000,000)建立循環隊列邏輯,你可以被覆蓋。
困難的部分當然是生成Id。我已經做了,在過去有一個排它的定義,並呼籲像這樣「nextid」,它表:
-- Create table
CREATE TABLE NextId
(NextId int not null)
-- Add the one row to the table
INSERT Nextid (Nextid) values (1)
可選,把一個INSERT /在這裏DELETE觸發器,以防止行的添加或刪除
此過程將用於獲取NextId的使用。單個事務當然是原子的,所以你不必擔心鎖定。我用10進行測試。你會最終得到一個Id值爲0,但它是一個代理鍵,所以實際使用的值應該沒有關係。
CREATE PROCEDURE GetNextId
@NextId int OUTPUT
AS
SET NOCOUNT on
UPDATE NextId
set
@NextId = NextId
,NextId = (NextId + 1) % 10 -- 5000000
RETURN
這裏的程序將如何叫:
DECLARE @NextId int
EXECUTE GetNextId @NextId output
PRINT @NextId
我不知道如何這會工作在過高的容量的情況下,但它確實在公平大小的工作負載運行良好。
除此之外,由於絕對**需要**使其自動運行,因此它成爲自動瓶頸,並且**不能並行化。它可能會表現良好,但如果可能的話,我會避免它。 – 2012-03-08 00:39:47
我認爲我們需要更多的信息 - 會話持續多久(可以使其基於時間)?複合鍵是一個選項嗎? – 2012-03-08 00:45:53