并行查询其优势就是可以通过多个线程来处理查询作业从而提高查询的效率SQL Server数据库为具有多个CPU的数据库服务器提供并行查询的功能以优化查询作业的性能也就是说只要数据库服务器有多个CPU则数据库系统就可以使用多个操作系统进程并行执行查询操作来加速完成查询作业
一并行查询三步走
并行查询作业在数据库中主要经过三个步骤
首先数据库会判断是否需要进行并行查询在数据库中有一个查询优化器会对SQL语句进行优化然后数据库才会去执行查询语句而这个查询器在对SQL语句进行查询优化时其中一个动作就是判断是否需要对SQL语句进行查询优化也就是说并不是所有的SQL查询语句都可以从并行查询中获取收益如果查询优化器认为查询语句可以从并行查询中获取收益的话则就会将交换运算符插入到查询执行计划中为并行查询做准备故哪些语句需要采用并行查询哪些不需要这不用数据库管理员关心数据库查询优化器会帮管理员作出这个决定数据库管理员需要清楚的是在哪些情况下数据库SQL优化器会认为不宜采用并行查询通常情况下只要满足以下条件的任何一个则就不会执行并行查询一是对于特定的查询查询优化器认为串行查询执行计划要快于任何可能的并行执行计划;二是查询的串行执行成本并不高不需要进行并行查询;三是查询中包含无法并行运行的标量运算符或者关系运算符若从数据库管理员的角度讲第三个条件对我们具有最大的影响当数据库预计未来可能利用并行查询来提高数据库性能时则在数据库设计时就需要注意避免使用那些无法在并行查询功能中使用的运算符因为某些关系运算符或者逻辑运算符可能会要求查询计划一定要在串行模式中进行或者部分需要在串行模式下进行如此的话查询优化器就不会利用并行查询功能来提高查询语句的性能这是数据库管理员在数据库设计时必须要考虑到的一个细节问题
其次确定并行的进程数当查询优化器在查询语句中插入交叉运算符之后数据库就会执行并行查询并行查询在执行计划时可以使用多个线程此时就又遇到了一个问题数据库会把这个查询作业分成几个进程操作呢?此时数据库管理员就需要知道上什么叫做并行度其实在处理并行查询的时候数据需要知道最大可使用的进程与实际使用的进程而最大可使用的进程就叫做并行度这个并行度的值是在服务器级别中进行设置也可以通过系统存储过程来进行修改但是最大可使用进程数不一定等于实际是用进程数实际是用进程数是数据库在查询计划执行时初始化的时候确定的也就是说这不用数据库管理员去额外的设定数据库系统会自动根据计划的复杂程度来确定合理的进程数目当然其实际采用的进程数不能够超过并行度即最大可以使用的进程数
最后执行查询当以上内容确定好之后数据库就会执行具体的查询语句在这一步中需要注意一个问题数据库管理员还可以在查询语句中指定MAXDOP查询提示来修改这个进度值也就是说如果某个查询作业数据库管理员认为可能会耗时比较久就可以为这个查询作业设置比较大的进度值当利用MAXDOP查询提示设置这个并行进度值之后它会覆盖预先设置的默认值从而实现针对单个查询语句设置额外的进度值以提高某些特殊查询作业的性能
二并行查询中需要注意的内容
注意点一需要注意硬件方面的限制
并行查询是数据库提高查询性能的一个有力举措不过其往往受到比较大的约束如上面提高的一些基于成本考虑之外还有一些硬性的限制如通常情况下只有在数据库服务器有多个微处理器(CPU )的情况下数据库才会考虑执行并行查询也就是受只有具有多个CPU的计算机才能够使用并行查询这是一个硬性的限制条件另外在查询计划执行过程中数据库还会判断当时是否有足够多的线程可以使用每个查询操作都要求一定的线程数才能够执行;而且执行并行计划比执行串行计划需要更多的线程所需要的线程数也会随着并行度的提高而提高如果在并行计划执行的时候当时数据库服务器没有足够的线程让并行计划使用的话数据库引擎就会自动减少并行度甚至会放弃并行查询而改为串行计划所以说数据库是否能够执行并行查询要受到其硬件的限制为此如果企业真的需要通过并行查询来提高数据库性能的话则管理员就需要根据情况来调整硬件配置
注意点二不建议对所有查询都使用并行查询
通常情况下笔者认为最好只对大型表的连接查询大量数据的聚合操作大型结果集的重复排序等等操作才应用并行查询的功能如果在这些操作上执行并行查询的话那么其改善数据库性能的效果是非常明显的相反如果对于简单查询执行并行查询的话可能执行并行查询所需要的额外协调工作会大于其潜在的性能提升所以数据库管理员在确定是否需要执行并行查询功能的话需要慎重笔者的建议是在数据库服务器级别上最好不要设置并行查询即把并行度设置为或者一个比较小的值然后对于一些特殊的查询操作利用MAXDOP查询提示来设置最大的可使用进程数如此的话可能会更加的合理如果有时候数据库管理员不知道是否需要采用并行查询功能的话则可以通过数据库自带的统计功能进行判断为了区别并行查询计划到底有没有从并行查询中受益数据库引擎可以将执行查询的估计开销与并行查询的开销阀值进行比较并行计划只有对需时较长的查询通常更加有益;因为其性能优势将抵消初始化同步和终止并行计划所需的额外时间开销
注意点三数据库会根据查询所涉及到的行数来判断是否要并行查询
上面谈到最好对大型表的连接查询大量数据的聚合操作大型结果集的重复排序等等操作才应用并行查询的功能因为只有如此并行查询带来的收益才会超过其付出的代价但是并不是说连接查询聚合操作排序等作业都适合采用并行查询当数据库在考虑并行查询计划的时候查询优化器还会去确定所涉及到的行数如果所涉及到的行数台少则将不会考虑执行并行查询计划而会采用串行方式执行查询语句如此的话可以避免因为启动分发协调的开销大大超过并行执行作业所带来的收益这本来是一个不错的设计但是也会给数据库管理员带来一定的麻烦如现在数据库管理员想要测试并行查询到底可以在多大程度上影响查询操作就有点麻烦因为其有数据量的限制如果数据库管理员需要进行这个测试还不得不先在数据库系统中导入足够多的数据才行这就限制了数据库管理员的测试操作不过话说回来这个机制仍然是不错的因为数据库管理员不用去考虑当数据库规模到多大的时候采用并行查询
注意点四同一个操作在不同时候会采用不同的进程数
上面说到过并行查询到第采用多少进程数除了跟操作的复杂程度相关外还直接跟当时的服务器状态相关如是否有足够的进程数等等所以在不同的时间即使是相同的数据相同的操作其并行查询所用的进程数也可能不同其所需要的时间也就不同了因为只有在并行查询真正进行的时候数据库引擎才去收集当前系统的工作负荷如进程数和其他对一些配置信息然后数据库才确定最佳的并行进程数从查询开始到这个查询作业结束将一直采用这个进程数如果下次要继续查询则数据库引擎会继续收集这些信息此时如果系统工作负荷有所改善在数据库可能会采用更多的进程数来执行这个查询从而查询作业的性能会更加的高相反如果此时系统的负荷比前一次查询要重了则数据库就可能会采用比较少的进程来处理这个作业此时第二次查询的速度反而更慢了所以如果在数据库服务器中同时部署了其他应用则其他应用所占用系统资源的多少也会对并行执行产生难以估测的影响