簡體   English   中英

常規SQL Server查詢性能

[英]General SQL Server query performance

這可能很愚蠢,但是數據庫不是我的事:)想象以下情況。 用戶可以創建帖子,其他用戶可以回復他的帖子,從而形成話題。 一切都放在一個稱為Posts的表中。 構成線程的所有帖子都通過生成的稱為ThreadID的鍵相互連接。 這意味着,當用戶#1創建新帖子時,將生成一個ThreadID,並且隨后的每個答復都具有一個指向初始帖子的ThreadID(由用戶#1創建)。 我想做的是將答復數限制為每個線程20個。 我想知道以下哪種方法更快:

1

我在Posts中添加了一個新的整數列(例如Counter)。 用戶回復初始帖子后,我將更新初始帖子的“計數器”字段。 如果達到20,我將鎖定線程。

2

用戶回復初始帖子后,我選擇所有具有相同ThreadID的帖子。 如果該集合包含20多個項目,則我鎖定線程。

有關更多信息:我正在使用SQL Server數據庫和Linq-to-SQL實體模型。 如果您對兩種方法發表意見或分享另一種更快的方法,我將非常高興。

最好的祝福,

基里爾

到過那里,並做了兩種解決方案的變體。

我個人不喜歡解決方案1,因為計數器列對所有回復帖子都沒有任何意義。

我通常以

3

創建兩個表 ,一個用於Threads (線程啟動器),另一個用於Posts (線程回復)。

通常,您會發現Thread的字段多於post的字段。 例如,您可以將一列IsLocked添加到Threads表中。 這樣,您就不必記住魔術數字(20)即可知道線程是否已鎖定。

我通常也為該主題提供Title ,但沒有帖子。 有時是另一列,以了解線程是否為IsSticky 等等...

只要您在ThreadID上有一個索引,選項2就可以了。 選項1也可以(假設您在ThreadID上有一個索引),但是我認為代碼會更復雜。

我認為,此回復計數器不是帖子的一部分,也不是線程。 這是一個系統參數,適合另一個數據表。 為了這個示例,我們將其稱為SysParams。

CREATE TABLE SysParams (
    SpId int IDENTITY(1, 1) primary key
    , SpTableName nvarchar(20) NOT NULL -- To what table this parameter applies?
    , SpName nvarchar(10) NOT NULL  -- Parameter name
    , SpValue nvarchar(20) NOT NULL -- Value of the parameter
)

insert into SysParams (SpTableName, SpName, SpValue) values (N'Posts', N'MaxAnswersPerThread', N'20')
GO

然后,在加載帖子或主題時, SysParams表中加載一次此參數,並且在答案計數等於此參數值時鎖定。

為什么要為SpValue字段設置nvarchar(20)

因為這樣做,您可能還需要其他一些由字符串值組成的參數。

至於獲取這些值,您應該編寫一個GetParameterValue()函數,該函數將簡單地返回SpValue字段的值,具體取決於函數調用中指定的SpTableNameSpName 這樣,您可能還需要為同一表提供其他參數,以達到不同的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM