我正在使用带有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交互的方式意味着群集应保留在主键上?
谢谢!
答案 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可能是有意义的。