Announcement

Collapse
No announcement yet.

Umstellung MS SQL Job von 2005 auf 2008

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Umstellung MS SQL Job von 2005 auf 2008

    Hallo Zusammen,

    im Rahmen einer Datenbankmigration habe ich das Problem, dass in einem Job Tabellen gefüllt werden sollen (mit Hilfe eines Cursors)- siehe Code Beispiel vom MS SQL Servers 2005 auf den MS SQL Server 2008. dieser Job läuft auf dem alten System max. 20 min. Nach Übernahme auf den neuen Server dauert er länger als 12 Stunden. Trotzdem die Tabellen 1:1 übernommen wurden, sehen die Ablaufpläne unterschiedlich aus.

    Weiß hier jemand, wie man das anpassen/ändern kann ?

    Beste Grüße
    Code:
    DECLARE @V_CR_Number char(11);
    DECLARE @V_CR_Subnumber char(4);
    DECLARE @V_Count int;
    DECLARE @V_n Int -- Org_ID
    DECLARE @V_MP_Number char(6);
    
    -- CR
    DELETE OSW.[tbl_CR_Involvement_Analysis_Test]
    
    
    set @V_n = 0
    
    DECLARE curCR_OSW_Involvement CURSOR
    FORWARD_ONLY
    FOR select CR_Number, CR_Subnumber from DWH.tbl_CR ORDER BY CR_Number, CR_Subnumber;
    
    OPEN curCR_OSW_Involvement;
    FETCH NEXT FROM curCR_OSW_Involvement
    INTO @V_CR_Number, @V_CR_Subnumber;
    WHILE @@FETCH_STATUS = 0
    BEGIN
      set @V_n = 0
    
      WHILE @V_n < 120 -- zur Zeit Org_ID  1 bis 53
      BEGIN   
        set @V_n = @V_n + 1;
    
        SELECT @V_Count = COUNT(*) FROM OSW.[tbl_CR_Involvement_Analysis] WHERE
                      [CR_Number] = @V_CR_Number AND [CR_Subnumber] = @V_CR_Subnumber
                      AND [Org_ID] = @V_n;
        IF @V_Count = 0
        BEGIN
          INSERT INTO OSW.[tbl_CR_Involvement_Analysis_Test]
                   ([active]
                   ,[CR_Number]
                   ,[CR_Subnumber]
                   ,[Org_ID]
                   ,[Ins_Date]
                   ,[Ins_User])
          VALUES (1, @V_CR_Number, @V_CR_Subnumber, @V_n, GETDATE(), 'Script')
        END
      END 
    
      FETCH NEXT FROM curCR_OSW_Involvement
      INTO @V_CR_Number, @V_CR_Subnumber;
    END;
    DEALLOCATE curCR_OSW_Involvement;

  • #2
    Sind auch die Indexe, Constraints usw. 1:1 übernommen...
    Christian

    Comment


    • #3
      Originally posted by claudine99 View Post
      dieser Job läuft auf dem alten System max. 20 min. Nach Übernahme auf den neuen Server dauert er länger als 12 Stunden.
      Also auf den ersten Blick sieht das Konstrukt so aus, also ob es auch in 2 Sekunden laufen könne.
      Mglw. sogar ohne Indizes. Womit ich nicht sagen will, dass Indizes nicht da sein sollten.

      Warum wird in einer Schleife immer wieder der Count eines Select gebildet, obwohl die Prüfung auf Existenz eines Datensatzes reichen würde?
      Warum wird umständlich mit Cursor durchgestept?

      Vielleicht übersehe ich etwas, aber für mich sieht das nach einer simplen Anweisung aus:
      Insert .. into Zieltabelle
      Select .. from tabelle A join Tabelle B ,,

      Das wären dann ggF. 2 Fulltablescan und das Ergebnis in einem Rutsch als Insert.
      Gruß, defo

      Comment

      Working...
      X