我正在使用MS-sql 2005服务器.我会尝试描述它如何使用,如果有人有任何建议,我将非常感激.
该表约400GB,每天有1亿行和100万行插入.
该表有8列,1列数据col和7列用于查找/排序.
k1 k2 k3 k4 k5 k6 k7 d1
哪里
k1: varchar(3),primary key - clustered index,10 possible values k2: bigint,total rows/10 possible values k3: int,10 possible values k4: money,100 possible values k5: bool k6: bool k7: DateTime
只运行一个选择查询,如下所示:
SELECT TOP(g) d1 FROM table WITH(NOLOCK) WHERE k1 = a AND k3 = c AND k4 = d AND k5 = e AND k6 = f ORDER BY k7
其中g =大约100万
这个查询我们每天运行大约10次(经常在插件发生时),大约需要5-30分钟.
所以我目前在两个主键列上只有一个聚簇索引.我的问题是:我应该添加什么索引来改善这个查询的性能?
将每个列分开的索引是一个不错的选择?我认为一个索引将占用大约5-8GB. DB服务器总共有8GB RAM.
请不要说最好的事情是试验.这类似于“我不知道,工作出来你自己”:)
任何提示非常感谢!
由doofledorfer编辑 –
您在这里引发了过早优化的爆发,如果不是彻底的建议,“最好的事情是实验”.如果您需要有用的帮助,您需要澄清一些问题.
– doofledorfer
编辑:至于现在的帖子的评论现在在下面和查询计划一起发布
– 弗利堡先生
You are probably I/O bound
是的,它不是cpu限制.磁盘访问高.所有可用的RAM似乎都被使用.是否明智地使用还有待观察.
You say you can’t split the data because all the data is used: IMPOSSIBLE
我的意思是所有数据在某个时候被使用 – 并不是所有的数据都被每个用户在每个查询中使用.
我可以分解数据,但到目前为止,我不明白为什么分区表比使用聚簇索引更好.
Why did you choose these types
VARCHAR probably should have been INT as it can only be a few values. The rest are sensible enough,Money represents a money value in real life and bigint is an ID,and the bools are onny,offy type things