如何在大型SQL Server查询中使用多个内核?

时间:2010-05-26 13:07:22

标签: sql-server-2005

我有两个SQL Server,一个用于生产,一个用作存档。每天晚上,我们都有一个运行的SQL作业,并将生产数据复制到存档中。随着我们的成长,这个过程需要更长,更长,更长。当我在运行存档过程的存档服务器上观察利用率时,我发现它只使用单个核心。由于这个盒子有八个核心,这是一个巨大的资源浪费。这项工作在凌晨3点运行,因此可以免费获取它可以找到的任何和所有资源。

因此,如果弄清楚如何构建SQL Server作业以便他们可以利用多个核心,我需要做什么,但我找不到任何有关解决此问题的文献。我们正在运行SQL Server 2005,但如果2008年能解决这个问题,我当然可以推动升级。

5 个答案:

答案 0 :(得分:5)

您是否有自动维护计划来更新统计信息,重建索引等?如果没有,SQL Server可能仍在您较旧的较小表的统计信息上构建其查询计划。

如果满足某些条件,SQL Server会自动生成并行查询计划。来自article on MSDN

  

1.在具有多个微处理器的计算机上运行SQL Server   CPU,如对称的   多处理计算机(SMP)?只要   具有多个CPU的计算机可以   使用并行查询。

     

2. SQL Server上活动的并发用户数是多少   安装在这一刻? SQL   服务器监视CPU使用情况并进行调整   查询的并行度   启动时间。较低的度数   如果CPU使用率是,则选择并行性   高。

     

3.是否有足够的内存可用于并行查询执行?每   查询需要一定数量的   要执行的内存。执行一个   并行查询需要更多内存   而不是非并行查询。数量   执行a所需的内存   并行查询随着增加而增加   并行度。如果是记忆   对并行计划的要求   给定的并行度不可能   满意,SQL Server减少了   自动或并行度   彻底放弃了平行计划   用于给定工作负载中的查询   上下文并执行序列计划。

     

4.执行的查询类型是什么?查询耗费大量CPU周期   是并行的最佳候选者   查询。例如,连接大   表格,实质性汇总和   大型结果集的排序很好   候选人。通常是简单的查询   在事务处理中找到   应用程序,找到附加的   执行a所需的协调   并行查询超过了   潜在的性能提升。至   区分查询   从并行性和那些中受益   那不利于SQL Server   比较估计的成本   使用cost执行查询   并行度值的阈值。   虽然不推荐,但用户可以   使用更改默认值5   sp_configure的。

     

5.在给定的流中是否有足够的行处理?如果   查询优化器确定数量   流中的行太低了   不介绍交易所经营者   分发流。   因此,运营商就是这样   流连续执行。   在串口中执行运算符   计划避免了情景   启动,分发和   协调成本超过收益   由并行运算符实现   执行。

其他因素:

Is SQL Server configured to have affinity to a single processor?

Is the max degree of parallelism option is set to 1?

- 编辑 -

您是否尝试过分析此过程?看看SQL Server生成的查询计划会很有趣。

您是否有可以发布的示例代码?

如果您有自动夜间备份作业,是否可以将备份还原到存档?

答案 1 :(得分:2)

执行基本磁盘I / O操作需要非常非常少的CPU时间(在我运行Perfmon的任何盒子上最少)。如果你的CPU达到100%,那么你的归档过程可能是CPU密集型的。您是否正在执行一些复杂的查询,嵌入式函数调用或执行其他不仅仅需要读取/写入硬盘驱动器字节的内容? (也许你的数据库文件在压缩的硬盘上?或者其他一些类似的“后台”进程正在干扰?)

在CPU之间分配负载的一种可能方式(强调可能因为它完全取决于您的环境)是同时运行多个任务。这可以通过打破工作量来完成。对于通用存档并做出一些广泛的假设,它可能如下所示:

  • 第一步,确定要归档的数据范围。比如,从托管标识列的主表中选择的行和相关数据,其中要归档的数据范围从Id 10000到20000
  • 把它分成几块。想要使用四个CPU吗?尝试四个块,10000-12500,12501-15000,15001-17500,17501-20000。将这些记录在“待完成”表中。
  • 配置四个SQL代理作业,例如,凌晨3:00,3:01,3:02和3:03。当每个作业触发时,它会获得下一个“待完成”的数据集,并对其进行处理。
  • 您可以根据需要准备尽可能多的数据块。你可以拥有任意数量的工作。一个工作可以继续处理块,直到列表中没有更多。

请注意,如果您有两个或更多进程从同一驱动器读取数据并将其写入相同的驱动器,则最终将成为磁盘绑定。但是你可以获得更好的性能,或者至少我已经在某些系统上看到它......如果一个任务需要X时间来移动Y MBytes,两个任务可能需要不到2倍的时间来移动2Y MB的数据,这是如果在读取和写入之间要完成大量的CPU工作,则更有可能保留。但是要在你的系统上进行测试以确定。

要检查磁盘I / O,请使用Perfmon(性能监视器,系统监视器,“性能”或他们现在调用的任何内容)和“平均磁盘队列大小”计数器。如果那些一直超过2或3,那么你就是磁盘绑定。 (当然,这比这更复杂,但这将为你提供一个强有力的开端。)

答案 2 :(得分:1)

我不认为问题是CPU。移动大量数据时,瓶颈就是磁盘,无论你的CPU有多好或多少,你都只能写得这么快。

想象一下,你是世界上最聪明的人(有一个很棒的CPU),你需要用纸和笔复制一本大书(正在进行的工作)。你只会使用你脑力的一小部分,你不能比普通人快得多,因为这个任务更多地与你的写作速度有关,而不是你的智力。随着本书每天变得越来越长(这是一项正在进行的工作),任务将花费更长的时间,因为有更多的书需要复制。

提高速度的唯一方法是获得更快/更好的磁盘写入功能或减少要做的工作量,每天只复制新数据。

答案 3 :(得分:0)

您是否尝试过SQLBulkCopy或查看批量插入(http://msdn.microsoft.com/en-us/library/ms188365.aspx)?

答案 4 :(得分:0)

您确定作业不受I / O限制(并且不受CPU限制)吗?这可以解释为什么它只在一个处理器上运行。 Here's an articleanother article有关如何对此进行问题排查,以便您可以确定在假设与CPU相关的问题之前会降低速度。