如何处理sql server中的数十亿数据?

时间:2011-02-09 09:02:41

标签: sql-server

我很高兴我有一个sql server 2008数据库以及一个主要表中的30000000000条记录。现在我们正在寻找查询的性能。我们已经完成了所有索引。我发现我们可以将数据库表拆分为多个分区,以便将数据分布在多个文件中,从而提高查询的性能。  但不幸的是,这种功能仅在sql server企业版中可用。这对我们来说无济于事。

你们可以建议任何其他方式来维护和查询性能。

eg. select * from mymajortable where date between '2000/10/10' and '2010/10/10'

此查询大约需要15分钟来检索大约10000条记录。

5 个答案:

答案 0 :(得分:3)

与使用覆盖索引的查询相比,SELECT *显然效率较低。

第一步:检查查询计划并查找和表扫描以及最省力的步骤(%)

如果您的'日期'列上还没有索引,那么您当然需要一个(假设有足够的选择性)。尝试减少选择列表中的列,如果“足够”,请将这些列添加到索引included columns(这可以消除对聚簇索引的书签查找并提高性能)。

您可以将数据分成不同的表(例如按日期范围),然后通过视图进行组合。

它也非常依赖于您的硬件(#核心,RAM,I / O子系统速度,网络带宽)

建议您发布表和索引定义。

答案 1 :(得分:1)

首先总是避免使用Select *因为这将导致select获取所有列,如果只有一个索引只需要你需要的列,那么你将获取大量不必要的数据。仅使用您需要检索的确切列,可以让服务器更好地使用索引。

其次,查看索引的包含列,这样可以将经常请求的数据包含在索引中,以避免必须获取行。

第三,您可能会尝试使用int列作为日期并将日期转换为int。 Ints在范围搜索中通常比日期更有效,特别是如果您有时间信息,并且如果您可以跳过时间信息,则索引会更小。

要检查的另一件事是服务器使用的执行计划,如果在菜单中启用show execution plan,您可以在管理工作室中看到这一点。它可以指出问题所在,您可以看到它尝试使用哪些索引,有时它会建议添加新索引。

它还可以指示其他问题,表扫描或索引扫描很糟糕,因为它表明它必须在索引搜索良好时扫描整个表或索引。

了解服务器的工作原理是一个很好的资源。

答案 2 :(得分:0)

如果您在日期添加索引,由于索引搜索+键查找而不是聚簇索引扫描,您可能会加快查询速度,但如果日期过滤器返回太多记录,索引将无法帮助您完全因为为索引搜索的每个结果执行了键查找。然后,SQL服务器将切换到聚簇索引扫描。

要获得创建覆盖索引所需的最佳性能,即在索引的“包含列”部分中包含您需要的所有列,但如果您使用select *

select *方法的另一个问题是您无法以有效的方式使用缓存或执行计划。如果您确实需要所有列,请确保指定所有列而不是*。

您还应该完全确定对象名称,以确保您的计划可以重复使用

答案 3 :(得分:0)

您可以考虑创建一个存档数据库,然后将10到20年后的任何内容移动到存档数据库中。这应该会大大加快您的主要生产数据库,但会保留所有历史数据以满足报告需求。

答案 4 :(得分:0)

我们在谈论什么类型的查询?

这是生产表吗?如果是的话,请进一步规范化,看看你是否能够进一步规范数据库。

如果这是针对报告的,包括大量的Ad Hoc报告查询,则会尖叫数据仓库。

我会创建一个带有单独预处理报告的DW,其中包括您可以预期的所有计算和聚合。

我有点担心商业模式涉及处理大数据,但没有产生足够的收入,甚至没有吸引足够的风险投资来升级到企业。