1

可以說我有一個這樣的會話表:用於經常插入和刪除的表的標識列的替代方法?

[Session] 
------- 
Id: int 
UserId: int 

試想一下,在一個非常高流量的網站使用,Sessions非常頻繁添加和刪除。如果我要將每個表的Id列設置爲一個標識列,那麼我怎樣才能輕鬆維護Id的種子,以便它們不會達到int數據類型的限制?有沒有其他方法可以確保我沒有想到的獨特ID?提前致謝。

+0

我認爲我們需要更多的信息 - 會話持續多久(可以使其基於時間)?複合鍵是一個選項嗎? – 2012-03-08 00:45:53

回答

3

的不是int使其BIGINT,這將上升到9,223,372,036,854,775,807

當然你也可以在-9,223,372,036,854,775,808啓動以及

What To Do When Your Identity Column Maxes Out

+0

我意識到我可以做到這一點,但對我來說,在任何給定時間只有1000行的桌子都會有瘋狂的巨大身份號碼,所以我沒有必要爲它重新編號。也許這只是我的肛門,但我很好奇,如果有不同的方式。 – Ocelot20 2012-03-07 21:48:53

1

請參閱使ID的GUID,而不是爲int 。 你得到了獨特的會話ID,這是不可猜測的,並且很容易用Guid.NewGuid()實現。

1

如果您有一個網站維護期,您可以重新填寫標識列。只是簡單而已。

0

給定會話存在多久?如果任何會話持續時間不會超過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 

我不知道如何這會工作在過高的容量的情況下,但它確實在公平大小的工作負載運行良好。

+0

除此之外,由於絕對**需要**使其自動運行,因此它成爲自動瓶頸,並且**不能並行化。它可能會表現良好,但如果可能的話,我會避免它。 – 2012-03-08 00:39:47

相關問題