Sql-Server

基數,MS-SQL的並行提示替代

  • April 1, 2021
UPDATE MARK M SET ARCHIVE_FLAG = 'N' WHERE EXISTS 
(SELECT /*+ cardinality(S1, 10) parallel(S1,8)*/ 1 FROM SHFASG S, SHIFT S1 
WHERE S.ID = S1.ID AND M.ID = S.MARKID AND ARCHIVE_FLAG <> 'Y');

這是我的 oracle 查詢,我想為我的 MS SQL DB 創建類似的查詢,請幫助

開箱即用,您不需要在 SQL Server中使用查詢提示,除非您需要,*甚至可能在您使用 Oracle 的情況下是正確的,從查詢的外觀來看。Oracle 中的基數提示適用於當您的謂詞對於 Oracle 的Cardinality Estimator*而言過於復雜但您的查詢看起來相當簡單時。

無論如何,SQL Server 中沒有與 Oracle 的基數提示完全相同的提示,並且關於並行查詢提示,您可以在 SQL Server 中使用如下MAXDOP提示指定它:

UPDATE M 
SET M.ARCHIVE_FLAG = 'N'
FROM MARK M
WHERE EXISTS 
(
   SELECT 1 
   FROM SHFASG S, SHIFT S1 
   WHERE S.ID = S1.ID AND M.ID = S.MARKID AND ARCHIVE_FLAG <> 'Y'
)
OPTION (MAXDOP 8);

但同樣,您應該先嘗試在沒有任何提示的情況下執行查詢,並且僅在必要時使用它們。指定並行提示只會限制查詢的性能,並可能使其執行速度變慢(以在執行時消耗伺服器資源較少為代價)。

引用自:https://dba.stackexchange.com/questions/289017