2012-09-28 40 views
2

我有3列的表格:在SQL Server串聯BIGINT值

  • PersonId uniqueidentifier - 關鍵
  • DeviceId uniqueidentifier - 關鍵
  • Counter bigint

counter進來遞增值但有時會有差距。計數器值的一個示例是(1,2,3,1000,10000,10001,10002,...)。計數器值一次保存一個。如果我爲每個計數器值插入一行,表格變得非常快。我必須保留最後的1000個計數器值,並且可以刪除早期值。

是否可以將計數器值連接成類型爲1或幾行的數據行,並在二進制文件開始時刪除早期值作爲插入操作的一部分?我希望能夠編寫這個查詢。我寧願不使用varchar,因爲每個字符佔用2個字節。有可能比我想像的更好。任何幫助表示讚賞!

+1

'varchar' does not NOT **每個字符需要2個字節 - 這將是'nvarchar'。 –

回答

0

你爲什麼要這麼做,而不是使用帶有PersonID,DeviceID,Counter的表,並且每個PersonID和DeviceID對只允許一定數量的計數器?

如果您的目標是節省空間,請記住varbinary(8000)將保留8000個字節,允許最大1000個bigint值,而不考慮您擁有多少個計數器。

的可能性有多大,大多數這些是PersonID和的DeviceID對將有1000個櫃檯?

最後,你只是讓自己變得更加複雜,更難以維護未來的員工,但是你真的在節省空間嗎?

你也將不得不增加一些交易過程中,這將帶走更多的服務器資源。

但嚴格回答你的問題:是的,這是可能的。我猜想一個觸發器或一個過程可以處理你正在嘗試做的事情。

+0

這個共識不是用varbinary做的。我認爲這是正確的答案。謝謝。 –

+0

「varbinary(8000)將保留8000字節」當然不是:它只佔用與二進制數據(8000)相比的數據空間。 – usr

0

也許你可以選擇一箇中間解決辦法:每行有bigint類型的10個左右的列。這會將行數減少10,並將每行開銷減少10倍。也許這對你已經足夠了。

+0

你的建議是一個更好的解決方案,但邏輯仍然複雜的多列計數器。謝謝。 –