簡體   English   中英

繁忙的表,索引或不索引

[英]Busy table, to index or not to index

SQL 服務器,非常繁忙的表,隨時為大約 6-10K 用戶保存活動,並且每次點擊都有插入/更新/刪除。

我沒有在這張表上使用索引,因為寫入的任何數據都不會停留超過 10 分鍾。

但是在觀看活動監視器時,我注意到 SQL 服務器建議向該表添加索引。

我知道在表上保留索引有其成本,您認為我應該添加索引嗎?

更新細節: SQL 2008 R2

桌子

     [id] [bigint] IDENTITY(1,1) NOT NULL,
     [siteid] [int] NOT NULL,
     [last_seen] [datetime] NOT NULL,
     [ua] [varchar](250) NOT NULL,
     [ip] [varchar](15) NOT NULL,
     [t_id] [int] NOT NULL

建議索引

ON [dbo].[onlines] ([ua],[ip],[t_id])

擁有一個好的集群鍵實際上甚至可以加快您的插入速度(閱讀 Kimberly Tripp 的優秀博客文章The Clustered Index Debate Continues以獲得一個很好而徹底的解釋,為什么會這樣),並且從它的外觀來看。 你根本沒有聚類鍵。

所以我肯定會推薦在你的id列上添加一個主鍵/集群鍵 - 它非常適合一個好的集群鍵:窄,static,獨特,不斷增加:

CREATE UNIQUE CLUSTERED INDEX CIX_YourTableName
  ON dbo.YourTableName(ID)

這應該會加速一切——插入、更新、刪除和 select。

您是否需要其他索引(以及要索引的列)取決於您的 SELECT 查詢 - 因為您並沒有真正告訴我們有關這些的任何信息,我們只能猜測藍色.....

基本上,你需要做的:

  • 建立基線 - 衡量你的表現
  • 然后應用一個有意義的索引 - 包括 WHERE 子句和/或 ORDER BY 表達式中使用的列
  • 再次測量並比較

真的沒有什么神奇的公式可以決定你是否需要一個索引,它是什么,以及它對你的場景有多大幫助(或者它會對 INSERT 性能有多大影響)——你需要在你的數據庫、你的硬件上衡量自己, 你的環境。

在寫入表期間添加索引成本。 (插入、更新、刪除操作)。 它可以提高讀取性能(SELECT、UPDATE、DELETE 操作)。 因此,如果您的讀取次數多於寫入次數,那么可以,索引可以幫助您。 如果你讀的比寫的少,那么索引可以幫助你,因為你不必讀那么多(索引基本上是表的一個小子集,如果你的 select 只命中那個子集,那么你可以加快讀取速度在某些情況下相當)

我會添加索引並監控性能,如果它不適合你然后刪除索引。 最終,唯一確定的方法是嘗試並比較結果。

數據存在的時間並不能告訴您索引的需要。 但是更新率與讀取率確實如此。 沒有索引的插入是最快的。 更新和刪除可能不是,因為在搜索要更改的記錄時,它們可能會受益於索引。 選擇也受益於索引。

所以通常最好有索引,即使一個表有很多更新。 一般的例外是用於記錄的表,您通常只在其中寫入,除非您確實需要日志。

但可以肯定的是,您最好在其中放置一個索引並監控性能的影響或提升。

暫無
暫無

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

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