什么是SQL Server中的“PARALLEL”等价物

时间:2015-04-24 09:32:24

标签: sql sql-server oracle

我遇到这个问题,我需要在一些表上执行COUNT(COLUMN_NAME)SUM(COLUMN_NAME)。问题是在SQL Server上永远花费的时间。

我需要执行这些操作的记录超过20亿条。

在Oracle中,我们可以使用PARALLEL提示强制执行单个查询/会话的并行执行。例如,对于简单的SELECT COUNT,我们可以执行

SELECT /*+ PARALLEL */ COUNT(1)  
FROM USER.TABLE_NAME;

我搜索了是否有可用于SQL Server的东西,我无法想出具体的内容,我可以为并行执行指定表提示。我相信,SQL Server会自行决定是否执行并行或顺序执行,具体取决于查询成本。

Oracle中使用并行提示的相同查询需要2-3分钟才能执行,而在SQL Server上需要大约一个半小时。

2 个答案:

答案 0 :(得分:2)

我正在阅读文章Forcing a Parallel Query Execution Plan。对我来说,看起来你可以用于测试目的强制并行执行。作者在结论中说:

  

结论

     

即使是具有数十年SQL Server经验和详细信息的专家   内部知识会要小心这个跟踪标志。一世   不建议您直接在生产中使用它,除非建议   微软,但您可能希望在测试系统上使用它作为极端   最后,也许是为了生成计划指南或USE PLAN提示使用   在生产中(仔细审查后)。

     

这是一个可以说是风险较低的策略,但请记住   不保证在此跟踪标志下生成的并行计划   优化器通常会考虑的。如果你能改进的话   提供给优化器的信息质量而不是获得   平行计划,那样:)

该文章引用了跟踪标志:

  

始终存在跟踪标记

     

与此同时,还有一个解决方法。它并不完美(而且最多   当然是最后的选择)但是没有证件   (并且不受支持)跟踪标志,有效降低成本   特定查询的阈值为零

到目前为止,我对本文的理解可以做到这样:

SELECT  
   COUNT(1)  
FROM 
   USER.TABLE_NAME
OPTION (RECOMPILE, QUERYTRACEON 8649)

答案 1 :(得分:-1)

在oracle中,如果在列上选择count(),那么sql将遵循索引。在下面的计划中,您可以看到" INDEX FAST FULL SCAN"这将使sql运行得更快。你可以在sqlserver中尝试相同,你的表有索引吗。您将尝试在计数的列上创建索引。但在oracle情况下,它将使用任何其他列索引。在下面的sql中有" count(DN)"但它使用其他一些列的索引。

SQL> set linesize 500
SQL> set autotrace traceonly
SQL> select count(DN) from My_TOPOLOGY;

Execution Plan
----------------------------------------------------------
Plan hash value: 2512292876

--------------------------------------------------------------------------------
| Id  | Operation             | Name           | Rows  | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                |     1 |   164  (64)| 00:00:01 |
|   1 |  SORT AGGREGATE       |                |     1 |            |          |
|   2 |   INDEX FAST FULL SCAN| FM_I2_TOPOLOGY | 90850 |   164  (64)| 00:00:01 |
--------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        180  consistent gets
        177  physical reads
          0  redo size
        529  bytes sent via SQL*Net to client
        524  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed