大型非规范化表优化

时间:2012-03-02 17:01:01

标签: sql sql-server-2008

我有一个大的非规范化表,它反映了每年加载的固定长度平面文件的组成。 112列和400,000条记录。我在3列上有一个唯一的聚簇索引,它构成了对该表运行最多的查询的where子句。 Index Frag是.01。查询的性能很好,次秒。但是,返回所有记录大约需要2分钟。执行计划显示100%的成本是在聚集索引扫描(不寻求)上。

没有需要加入的查询(由于denorm)。该表用于报告。所有字段都是nvarchar类型(数据文件中字段的长度)。

超越规范化表格。我还能做些什么来提高性能。

3 个答案:

答案 0 :(得分:0)

尝试对查询进行分页。您可以将结果拆分为100行的组。这样,您的用户将很快看到结果。此外,如果他们每次查看结果时都不需要查看所有数据,那么它将大大减少检索到的数据量。

除此之外,向过滤数据的查询添加参数将减少返回的数据量。

这篇文章是开始分页的好方法:SQL Pagination Query with order by

只需在答案中替换“50”和“100”即可使用页面变量,您就可以了。

答案 1 :(得分:0)

这是三个想法。首先,如果您不需要nvarchar,请将它们切换为varchar。这将使存储需求减半并且应该使事情变得更快。

其次,请确保字段的长度小于nvarchar(4000)/ varchar(8000)。任何更大的值都会导致值存储在单独的页面上,从而增加了检索时间。

第三,您没有说明如何检索数据。如果要将其重新引入其他工具(如Excel)或ODBC,则可能存在其他性能瓶颈。

但是,最后,您正在检索大量数据,因此您应该期望比检索少量行的时间长得多。

答案 2 :(得分:0)

当您要求所有行时,您将始终进行扫描。

400,000行X 112列X每列17个字节是761,600,000个字节。 (我凭空消失了17分。)用两分钟的时间将3/4的演出穿过网络也不错。这大致是我服务器的计划备份到磁盘的吞吐量。

你有钱购买更快的网络吗?