2017-09-25 20 views
2

定期的に25レコードを更新しようとしています。この目的のために、私は定期的に手続きを実行する5つの仕事を持っています。プロシージャは、このような何かを行います。TOP Nレコードを同時に更新する方法

UPDATE 
    TOP 5 
    FooTable 
SET 
    col2 = 'taxi' 
OUTPUT 
    col1 
WHERE 
    col2 = 'uber' 

は、このストアドプロシージャ(SP)と呼ばれる5つのジョブ場合は、各SPは他のSPのためのデータをロックしているだろうし、トップ25のレコードは、最終的に更新されていたであろう。

2番目のジョブのSPは、前のSPの完了を待つのではなく、ロックの細かさやヒントを使って次のTOP 5行を取得できますか?

+0

は、なぜあなたは、このためのストアドプロシージャが必要なのでしょうか?あなたは簡単なクエリを実行することによってそれを完了することができます。特別な理由はありますか? –

+0

あなたが尋ねたことを行うことによって、ダーティリードにつながる可能性があります –

+0

@UsmanRana私はこの状態に私の元の問題をかなり単純化しました。私は、複数のインスタンスで実行されているジョブから呼び出されたSPを介して強制的にクエリを実行する状況にあります。 TOP 5レコードのこれらのUPDATEクエリが、以前のTOP 5レコードの他のUPDATEクエリを待っていることに気付きました。だから私は、待つのではなく、次のTOP 5レコードを直接読み込んで更新するようにSPを最適化できるかどうかを考えていました。 –

答えて

0

以下は動作します...

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData; 
GO 
CREATE TABLE #TestData (
    ID INT, 
    col2 INT 
    ); 
INSERT #TestData (ID, col2) 
SELECT 
    t.n, c.Col2 
FROM 
    dbo.tfn_Tally(200, 1) t 
    CROSS APPLY (VALUES (ABS(CHECKSUM(NEWID())) % 10 + 1)) c (Col2); 

--========================================================================================= 

-- before update values 
SELECT 
    td.ID, td.col2, 
    COUNT(1) OVER (PARTITION BY td.col2) 
FROM 
    #TestData td 
WHERE 
    td.col2 IN (3, 5); 

---------------------------------------------- 

WITH 
    cte_Top5 AS (
     SELECT TOP 5 
      td.Col2 
     FROM 
      #TestData td 
     WHERE 
      td.col2 = 5 
     ORDER BY 
      td.ID -- change this to determine which 5 are the top 5, or remove the ORDER BY all together if you don't care and save the sort expense. 
     ) 
UPDATE t5 SET 
    t5.Col2 = 3 
FROM 
    cte_Top5 t5; 

---------------------------------------------- 

-- after update values 
SELECT 
    td.ID, td.col2, 
    COUNT(1) OVER (PARTITION BY td.col2) 
FROM 
    #TestData td 
WHERE 
    td.col2 IN (3, 5); 
関連する問題