Sql-Server

索引應用程序日誌表以便按日期順序快速插入和檢索的最佳選擇?

  • May 3, 2021

假設我有一個包含三列的應用程序跟踪日誌表:(id uniqueidentifier、message nvarchar(max) 和started datetime2)。

主鍵(集群)打開

$$ id $$. 我需要能夠盡快插入記錄,但我不確定這是否是最好的主鍵。這是有道理的,因為我使用的是 EntityFramework 並且這是預設設置,但是 uniquidentifier 類型對於每個插入都有相當隨機的值,因此當它聚集在 id 上時,它會在整個地方插入行。我認為這很好,因為它降低了頁面爭用(相對於始終將它們全部插入最後一個數據頁),但我不確定。同時,我需要一種按順序快速檢索行的方法$$ started $$. 我的問題是,最好是: 1. 將主鍵更改為複合 (started, id),使其成為唯一的索引,並且數據頁按日期排序,或者我應該 2. 保留主鍵

$$ id $$並在 (started, id) 上添加一個唯一的非聚集索引。 我在第二個選項中同時包含 (started,id) 的原因是,它可以是一個包含集群鍵的唯一索引(無論如何總是隱式包含)。我不想在索引中包含任何其他列,因為它會重複很多

$$ message $$數據是不必要的,當我真正感興趣的是一個索引,它可以加速按順序檢索行。或者,有沒有比我提到的更好的選擇?

我認為這很好,因為它降低了頁面爭用(相對於始終將它們全部插入最後一個數據頁),但我不確定。

在低於 10,000/秒的插入速率下,熱頁鎖存器爭用不是一個大問題,索引結尾插入的效率和局部性更可取。

  1. 將主鍵更改為複合 (started, id),使其成為唯一索引,並且數據頁按日期排序

是的。首選不需要兩個索引的解決方案。並在此處尋找解決方案,通過使用datetime2序列生成的值填充亞秒精度,將 a 作為表上唯一的唯一索引。

我會:將日期更改為聚集(非主)索引。

將 id 更改為非集群主鍵。

將聚集索引更改為日期(假設這些主要按照我假設日誌的順序發生)將加快插入過程。現在 id 鍵基本上是隨機的,這意味著您可能會在值的開頭插入一個新行,這意味著每個值都必須移動,因為它是集群的。這會減慢插入速度。由於您通常按日期而不是按 id 鍵查詢日誌表,因此在日期更改為聚集索引也會加快您的檢索速度,因此這是雙贏的。

因為不能保證您的日期是唯一的,所以您當然仍然需要 id。如果您願意,可以將其保留為主鍵,因為它是唯一的,但只需將其修改為非聚群(如果不存在其他聚群索引,則預設創建聚群索引,但這不是必需的)。通過將其保留為主鍵(非集群),如果您確實需要外鍵,您仍然有一個主要的參考點。

引用自:https://dba.stackexchange.com/questions/184840