首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理sql服务器中的数十亿条记录?

如何处理sql服务器中的数十亿条记录?
EN

Stack Overflow用户
提问于 2011-02-09 17:02:41
回答 5查看 1.7K关注 0票数 2

我有一个sql server2008数据库,在它的一个主表中有30000000000条记录。现在,我们正在寻找查询的性能。我们已经完成了所有的索引。我发现我们可以将数据库表拆分为多个分区,这样数据将分布在多个文件中,这将提高查询的性能。

但不幸的是,该功能仅在sql server企业版中可用,这对我们来说是负担不起的。

有什么方法可以优化查询性能吗?例如,查询

代码语言:javascript
运行
复制
select * from mymajortable where date between '2000/10/10' and '2010/10/10'

检索大约10000条记录大约需要15分钟。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-09 17:07:28

SELECT *显然比使用覆盖索引的查询效率要低。

第一步:检查查询计划,查找和表扫描,以及执行最多工作的步骤(%)

如果您的‘date’列上还没有索引,那么您肯定需要一个索引(假设有足够的选择性)。尽量减少select列表中的列,如果列“足够”少,则将这些列作为included columns添加到索引中(这可以消除对聚集索引的书签查找并提高性能)。

您可以将数据拆分成单独的表(比如按日期范围),然后通过视图进行合并。

它还非常依赖于您的硬件(内核数量、RAM、I/O子系统速度、网络带宽)

建议您张贴您的表和索引定义。

票数 3
EN

Stack Overflow用户

发布于 2011-02-09 17:37:19

首先,一定要避免使用Select *,因为这会导致select获取所有列,并且如果有一个索引只包含您需要的列,那么您将获取大量不必要的数据。只使用需要检索的列可以让服务器更好地利用索引。

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

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

另一件需要检查的事情是服务器使用的执行计划,如果您在菜单中启用show Execution plan,您可以在management studio中看到这一点。它可以指出问题所在,您可以看到它试图使用哪些索引,有时它还会建议添加新的索引。

它还可以指示其他问题,表扫描或索引扫描是坏的,因为它指示它必须扫描整个表或索引,而索引查找是好的。

这是了解服务器如何工作的一个很好的来源。

票数 1
EN

Stack Overflow用户

发布于 2011-02-09 18:08:48

如果在日期添加索引,由于索引查找+键查找而不是聚集索引扫描,您可能会加快查询速度,但如果在日期上筛选将返回太多记录,则索引根本不会对您有任何帮助,因为键查找是针对索引查找的每个结果执行的。然后,SQL server将切换到聚集索引扫描。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4942915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档