使用Django进行聚簇索引选择

时间:2012-03-21 13:21:19

标签: sql-server django

我正在使用带有SQL Server后端的django。

我的一些桌子会非常大。举一个广义的例子:

CREATE TABLE [dbo].[Data](
    [id] [int] NOT NULL,
    [project_id] [int] NOT NULL,
    [timestamp] [datetime] NOT NULL,
    [value] [float])

[Data].[project_id][Project].[id]的外键。

我会在[Task].[id]上有一个PK索引,它也会自动增加,与django练习保持一致。

我还会在[Data].[project_id],[Data].[timestamp]上设置唯一索引以防止重复数据。

如果我的大多数查询都是在[Data].[project_id],[Data].[timestamp]上搜索,最好是将此索引设为聚簇索引,还是django与db交互的方式意味着群集应保留在主键上?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您在project_id,timestamp

上创建了唯一的聚簇索引
  • 您的大部分查询都将通过群集索引搜索
  • 来实现
  • 似乎不需要非聚集索引
  • 您已经计划将其编入索引

使用时间戳,如果您在特定日期前搜索,则project_id将是一个有效参数,但大多数人都会按范围查询日期。这将允许您寻找日期范围,但随后必须扫描该数据以找到您的project_id。 SQL Server将此作为搜索显示,其中时间戳为Seek Predicate,project_id为Predicate。你的目标是尽可能多地处理Seek Predicate。

然而,很难说这是一个完美的答案。您知道这是否正确的唯一方法是将其放置到位,等待几天,然后检查dm_db_index_usage_stats以查看实际上该表的大部分用途是否实际上都在project_id,timestamp上。如果django使用它们的方式与您期望的不同,那么将其更改为简单的ID可能是有意义的。