3

如果我想合并位于不同驱动器上的多个表中的数据,SQL 会并行提取数据吗?有没有我应该知道的相关设置或提示?

4

3 回答 3

7

UNION 应该并行运行,至少从 SQL Server 2005 开始。

如果表位于不同的驱动器或相同的驱动器上,则没有区别。在现代世界中,磁盘可以是虚拟的,也可以具有多个读取头。一个驱动器和多个驱动器之间的区别越来越不相关。

如果您将 MAXDOP 设置为 1,那么将只有一个线程。

请注意,UNION 将比 UNION ALL 慢得多。

布兰登。. . 让我在这里回应。您似乎在考虑旧式架构。这些肯定还存在。但是,现代磁盘具有多个读取头和多个盘片。通常,返回数据的问题涉及控制器级别的带宽,而不是读取速度。您还具有多个级别的缓存和预读(有时在文件系统和数据库级别)。您通常最好让数据库引擎管理这种复杂性。

例如,我现在正在使用的机器实际上是一个虚拟机。我使用的磁盘是 EMC 盒子上的一个分区。处理器是一个大盒子中的一组处理器。

于 2012-07-20T00:25:38.537 回答
2

我对 SQL Server 中的多线程的理解是,我们应该把它留给查询优化器——查询将在优化时并行运行。

您可以通过使用提示来限制线程数(请参阅在 SQL Server 中使用 OPTION(MAXDOP 1) 的目的是什么?)。MAXDOP

默认行为是在可能和最佳情况下并行运行。

于 2012-07-20T00:10:46.343 回答
1

我不会指望仅根据您的联合查询的顺序以特定顺序返回的数据。

对我来说,当我必须做类似的事情时,我总是将整个查询包装为子选择,仅用于处理排序。像下面这样

select pk_id, value from (select pk_id, value from table1 union select pk_id, value from table2) order by PK_id, value

这样你就不会对你得到的东西感到惊讶。

于 2012-07-20T00:19:15.330 回答