vad*_*han 4 sql query-performance
我有一个 SQL 查询
SELECT Column1, Column2, Column3, **ufn_HugeTimeProcessFunction**(Column1, Column2, @Param1) As Column4
From Table1
Run Code Online (Sandbox Code Playgroud)
这个ufn_HugeTimeProcessFunction函数针对大表(就行数而言)运行,并且后面有几个计算来返回值。
我是否能够强制 SQL 编译器在另一个线程(进程)中运行该函数?
编辑:基本上该函数从 3 个不同的数据库中获取数据。这就是为什么我打算“并行”运行它,而且不可能更改其他数据库上的索引
如果运行 SQL Server 的服务器计算机有多个 CPU,则 SQL Server 可以使用多个线程并行运行单个查询。除了在多个处理器上运行用户查询之外,SQL Server 还可以使用多个线程来构建索引。在检查文本或图形执行计划时,如果查询使用多个处理器,您会注意到交换运算符分发流、重新分区流和收集流。通常,大量使用 CPU 周期的查询很适合并行执行。例如,在将输出返回给用户之前连接几个大表并对输出进行排序的查询可能会受益于并行执行计划。
简而言之,SQL Server 本身就可以很好地判断一个查询是否可以在多个线程中运行。基本上查询优化器查看查询的部分是否可以并行运行并接受调用。
如果查询包含无法并行运行的标量运算符或关系运算符,则不会考虑并行执行。此外,如果要操作的行数相对较少,查询优化器不会考虑并行执行计划。
按照你的话来说,这个功能很耗时。所以外部选择和函数肯定会在不同的线程上运行。但是,如果没有 ufn_HugeTimeProcessFunction 的可见性,将很难提供优化并行运行函数的解决方案。如果没有,我建议您查看函数的执行计划,看看是否可以调整查询以减少标量和关系操作
引用来源:http : //www.toadworld.com/platforms/sql-server/w/wiki/9824.parallel-query-processing.aspx
有关在分析执行计划后使用并行性的更多信息,请访问https://www.simple-talk.com/sql/learn-sql-server/understanding-and-using-parallelism-in-sql-server/