2015-04-24 62 views
6

我有這個問題,我需要在幾個表上執行COUNT(COLUMN_NAME)SUM(COLUMN_NAME)。問題在於SQL Server上這麼做的時間到了。SQL Server中的「PARALLEL」相當於什麼

我們有超過20億條記錄需要執行這些操作。

在Oracle中,我們可以使用PARALLEL提示強制執行單個查詢/會話的並行執行。例如,對於一個簡單的SELECT COUNT,我們可以做

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

我搜索是否有可用的SQL Server的東西,我不能用具體的東西川方在那裏我可以並行執行指定表提示。我相信,SQL Server根據查詢成本決定是否執行並行或順序執行。

在Oracle中使用並行提示進行相同查詢需要2-3分鐘執行,而在SQL Server上需要大約一個半小時。

+0

你不能告訴我們查詢嗎? – jarlh

+0

如果您嘗試使用'COUNT_BIG(COLUMN NAME)'而不是'COUNT',該怎麼辦?也許這會有所幫助......不幸的是,AFAIK沒有選擇強制在sql server上執行parrarel查詢。 –

+0

其實是的,我正在做一個永遠需要的COUNT_BIG。當然,大桌子上的COUNT會拋出異常。我編輯了這個問題。 – Navyseal

回答

2

我正在閱讀文章Forcing a Parallel Query Execution Plan。對我來說,看起來你可以通過測試目的強制並行執行。作者說,在結論:

結論

擁有數十年的SQL Server的經驗和詳細 內部知識,即使專家將要小心使用此跟蹤標誌。我 不能建議您直接在生產中使用它,除非 微軟建議,但你可能會喜歡使用它在測試系統上作爲一個極端的 不得已而爲之,也許是爲了產生一個計劃指南或USE PLAN提示在生產中使用 (經過仔細審查)。

這是一個可以說是較低風險的策略,但請記住,在此跟蹤標記下生成的並行計劃不保證爲優化程序通常會考慮的 。如果你能提高 質量提供優化的信息,而不是獲得 並行計劃,走那條路:)

這篇文章是指的跟蹤標記:

總有一個跟蹤標記

與此同時,有一種解決方法。這不是完美的(也是最 肯定很迫不得已的選擇),但能有效地降低了成本 門檻爲零特定查詢

那麼遠的無證 (和不支持)跟蹤標誌我理解這篇文章,你可以做這樣的事情:

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

我想QUERYTRACEON需要提升權限。 – Navyseal

+0

它要求您是sysadmin角色的成員。 – Arion

+0

我的DBA不會給我sysadmin權限來計算SUM和標量計算被迫在SQL服務器上按順序執行。 – Navyseal

-1

在oracle中,如果做一列select count(),那麼sql將跟隨索引。在下面的計劃中,您可以看到「INDEX FAST FULL SCAN」,這將使SQL運行更快。你可以在sqlserver中試試,你的表有索引。您應該嘗試在您計算的列上創建索引。但在oracle情況下,它將使用任何其他列索引。在下面的SQL有「計數(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