如果我想合并位于不同驱动器上的多个表中的数据,SQL 会并行提取数据吗?有没有我应该知道的相关设置或提示?
3 回答
UNION 应该并行运行,至少从 SQL Server 2005 开始。
如果表位于不同的驱动器或相同的驱动器上,则没有区别。在现代世界中,磁盘可以是虚拟的,也可以具有多个读取头。一个驱动器和多个驱动器之间的区别越来越不相关。
如果您将 MAXDOP 设置为 1,那么将只有一个线程。
请注意,UNION 将比 UNION ALL 慢得多。
布兰登。. . 让我在这里回应。您似乎在考虑旧式架构。这些肯定还存在。但是,现代磁盘具有多个读取头和多个盘片。通常,返回数据的问题涉及控制器级别的带宽,而不是读取速度。您还具有多个级别的缓存和预读(有时在文件系统和数据库级别)。您通常最好让数据库引擎管理这种复杂性。
例如,我现在正在使用的机器实际上是一个虚拟机。我使用的磁盘是 EMC 盒子上的一个分区。处理器是一个大盒子中的一组处理器。
我对 SQL Server 中的多线程的理解是,我们应该把它留给查询优化器——查询将在优化时并行运行。
您可以通过使用提示来限制线程数(请参阅在 SQL Server 中使用 OPTION(MAXDOP 1) 的目的是什么?)。MAXDOP
默认行为是在可能和最佳情况下并行运行。
我不会指望仅根据您的联合查询的顺序以特定顺序返回的数据。
对我来说,当我必须做类似的事情时,我总是将整个查询包装为子选择,仅用于处理排序。像下面这样
select pk_id, value from (select pk_id, value from table1 union select pk_id, value from table2) order by PK_id, value
这样你就不会对你得到的东西感到惊讶。