首頁>Database>source

我有一个相對较大的表(對我来說),其中有4000万行,預計在两週內(競選期間)將增长到80至1.2亿行。

Tip
--------------
Id          int (clustered index)
UserId      int
TipIndex    smallint
Value       binary(8)
LastChanged datetime2(3)
  • every user has between 1 to 400 tips that will be inserted at random during this period
  • UserId + TipIndex is unique
  • I never query Tips directly on the Identity Key (Id)
  • 99% of the times I query on UserId
  • I need all columns
  • I often query on 1 UserId (per page view), sometimes on a batches of 10.000s for statistics
  • this is a high traffic site during this period and it should be able to handle 30.000 queries on UserId per minute
  • Id is at the moment my Clustered Index, because I read that it leads to the least fragmentation.

因此,我在SQL Azure上託管,Azure已建議添加包含列的索引。 我一直不愿使用UserId,TipIndex作為聚簇索引,因為技巧是隨機添加的.這意味着我担心出現巨大的碎片問题等。

我的問题:

  • Doesn't an Index with included columns have the exact same problem?
  • Is a table with included columns not just the same as a "shadow table" with the same fragmentation problems?
  • Should I migrate to use UserId, TipIndex as a ClusteredIndex instead of Id?
  • How to prevent fragmentation?

我最终知道答案总是"取決於",或者我應该衡量它.但是由於我是一个独立開發人員,並且没有很多資源,所以我希望有更多经驗的人對此有直覺,因此我的第一次尝試更有可能朝着正確的方向前进。

最新回復
  • 7月前
    1 #

    似乎您對碎片問题太在意了,只要您定期更新統計資訊,碎片碎片就不会影响您的效能.您可以在佈伦特·奥扎爾(Brent Ozar)先生分享的视频中阅讀有關此內容的更多详细資訊,也可以在此處查看其他頁面.让我尝試一个接一个地迴答您的問题:

    Doesn't an Index with included columns have the exact same problem?

    包含在包含列中或作為關键列的索引没有太大區別.關键列將成為B樹的一部分,而包含列則不是,但是当您執行任何插入/更新/删除操作時,這將花费相同的费用,因為這些列需要更新/插入/删除。

    Is a table with included columns not just the same as a "shadow table" with the same fragmentation problems?

    不太確定影子表的含義,如果這裏是基表的含義,那麼是的,就碎片而言,您將遇到相同的問题。

    Should I migrate to use UserId, TipIndex as a ClusteredIndex instead of Id?

    根据您的陳述-"我有99%的時間查詢UserId",這是主键集群列的不錯選擇.由於您不会经常使用Id列,因此在以UserId和TipIndex的形式使用複合主集群键時,我看不到任何問题.就索引的大小而言,它与Id(int->4个位元組)加上一列tinyint型別的附加列(1个位元組)一樣好。

    請理解,集群密钥不過是邏輯儲存的資料順序,与非集群密钥不同,它没有任何物理存在。

    How to prevent fragmentation?

    我要說的是,更新統計資料應比零碎資料優先考虑.您可以使用Ola Hallengren遍佈全球的许多DBA使用的維護指令碼.您可以根据需要每週或每两週安排一次。

    希望這会有所帮助。

  • 7月前
    2 #

    您的問题:

    包含列的索引是否存在完全相同的問题?

    是的

    包含列的表是否不仅与具有相同碎片問题的"影子表"相同?

    我應该遷移使用UserId,TipIndex作為ClusteredIndex而不是ID吗?

    我会的。

    如何防止碎片化?

    有几種不同型別的碎片需要考虑.一種是由於頁面拆分而仅使用部分頁面的情况.如果插入很多,就会發生這種情况.不要太強調.另一个是当您的頁面中的後續頁面處於不同程度時.同樣,我不会太担心.如果您的資料主要位於緩衝區快取中,則跨資料區移動並不重要。

    所以...不必太担心.但是,不要以您實際上不会查詢資料的方式来获取資料的完整副本。

  • 在Informix中將秒轉換為HH:MM:SS
  • sql server:為什麼表上的ALTER AUTHORIzATION会丢棄目標上的所有權限?