我遇到这个问题,我需要在一些表上执行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上需要大约一个半小时。
答案 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