我将填充每加仑英里数 (MPG) 表。它来自里程表源。
目前是这样设置的:
id (primary_key)
, truck_num
, start_date
, end_date
, start_miles
, end_miles
, start_fuel
, end_fuel
, miles
, gals
, mpg
似乎有一些冗余。是miles
, (end_miles - start_miles)
同上gals
。
我们是否应该预先计算这些列miles
并gals
存储在数据库中?它肯定会使查询更容易,但会以空间为代价。计算的问题相同mpg
。计算列会减慢速度,不是吗?
什么索引最有效?每周大约有 3000 辆卡车(记录)分批插入。
我正在使用 SQL Server 2008 R2。
编辑:我将使用的示例查询
-- find average mpg for since ytd
select m.truck_num, avg(mpg)
from mpg m
join truck t on t.truck_num = m.truck_num
where start_date >= @begin_of_year and end_date <= @today
group by truck_num
CHECK
约束。这是一个伪模式定义:
至于索引表,这就是我的想法:
start_date ASC
。这将满足您的WHERE
条款。您总是通过增加来插入数据start_date
,这意味着在此集群方案下您的写入将始终是顺序的。您也总是在查询,start_date
因此您也可以满足您最大的查询模式。(每周 3,000 次插入不算什么。因为您的插入量如此之低,您甚至可以聚集在start_date ASC, end_date ASC
.)truck_num
在和上创建非聚集索引INCLUDE mpg
。这应该满足您的SELECT
,JOIN
和GROUP BY
子句。如果你愿意ORDER BY mpg
,那么在之后创建mpg
索引键的一部分,truck_num
而不是仅仅INCLUDE
-ing 它。完成后,按如下方式测试您的设置:
我喜欢尼克的回答,所以不会重复他关于计算列和约束的信息。
我会以不同的方式处理索引:
(startdate, enddate, trucknum)
必须是唯一的(同一辆卡车不能进行相同的旅程)。因此,使其具有集群性和独特性:使用自然键的经典 PK