0

ich mit dieser Abfrage eine Frage haben:Unterschiedliche Ausführungsplan aus derselben Abfrage in verschiedenen SQL Server

select distinct 
    Date_Int, 
    CodF, 
    Desc_Com, 
    DataDesc_Com, 
    CodC, 
    Function, 
    Tratt_Number, 
    Tratt_State 
from 
    tmp_SIC_Trattative_Stato_com_l2 

UNION 

SELECT DISTINCT 
    case 
     when (ts.Date_Int is not null) 
      then ts.Date_Int 
      else All_Day.Date_Int 
    end as Date_Int, 
    case 
     when (ts.CodF is not null) 
      then ts.CodF 
      else All_Day.CodF 
    end as CodF, 
    case 
     when (ts.Desc_Com is not null) 
      then ts.Desc_Com 
      else All_Day.Desc_Com 
    end as Desc_Com, 
    case 
     when (ts.DataDesc_Com is not null) 
      then ts.DataDesc_Com 
      else All_Day.DataDesc_Com 
    end as DataDesc_Com, 
    case 
     when (ts.CodC is not null) 
      then ts.CodC 
      else All_Day.CodC 
    end as CodC, 
    case when (ts.Function is not null) then ts.Function else All_Day.Function end as Function, 
    case when (ts.Tratt_Number is not null) then ts.Tratt_Number else All_Day.Tratt_Number end as Tratt_Number, 
    case when (ts.Tratt_State is not null) then ts.Tratt_State else All_Day.Tratt_State end as Tratt_State 
FROM 
    Commerciali_All_Day as All_Day 
LEFT OUTER JOIN 
    tmp_SIC_Trattative_Stato_com_l2 as ts ON ts.Date_Int = All_Day.Date_Int 
              AND ts.CodF = All_Day.CodF 
              AND ts.Desc_Com = All_Day.Desc_Com 
              AND ts.DataDesc_Com = All_Day.DataDesc_Com 
              AND ts.CodC = All_Day.CodC 
              AND ts.Function = All_Day.Function 
              AND ts.Tratt_State = All_Day.Tratt_State 
WHERE 
    ts.Date_Int IS NULL 

ich diese Abfrage in einer gespeicherten Prozedur ausführen, aber die Ausführungsplan ändert sich, wenn die gespeicherte Prozedur Produktion mit ausgeführt wird SQL Server oder mit Test SQL Server.

Dies ist der Testausführungsplan:

Test Execution Plan

Und dies ist die Produktion Ausführungsplan:

Production Execution Plan

Die Quelltabelle und die gespeicherte Prozedur die gleichen in Test und Produktion und ich verstehe nicht, weil der Ausführungsplan und die Zeit unterschiedlich sind.

In Test ist die Abfrage in 6 Minuten ausführen und in 15 Minuten in der Produktion.

Der Test und Produktion SQL Server sind Microsoft SQL Server 2014-Version 12.0.4100.1.

  • Der Produktionsserver verfügt über 24 GB RAM und 8 CPU 2GHz
  • Der Testserver verfügt über 16 GB RAM und und 4 CPU mit 2 GHz

Ich verstehe nicht, warum das Verfahren besser in Test durchführt, Umwelt und nicht in der Produktionsumgebung.

+2

Der Plan ist eigentlich der gleiche, die Kosten sind unterschiedlich. Wenn Sie die Pläne als XML bereitstellen könnten, können Sie bessere Antworten erhalten. Insbesondere, wenn Sie den Mauszeiger über die Sortier- und Hash-Übereinstimmung/Verknüpfung bewegen, werden die Felder (die wahrscheinlich gleich sind) sowie die Anzahl der beteiligten Datensätze eingeschlossen. –

+0

Es ist nicht nötig, 'SELECT DISTINCT' zu wählen, wenn' UNION', da 'UNION' alle Duplikate entfernt. ("UNION" ist eigentlich die Kurzform von "UNION DISTINCT".) – jarlh

+1

Sind die Inhalte der Tabellen in Test und Produktion identisch? Die Anzahl der Zeilen in einer Tabelle kann sich auf den Plan auswirken. – hatchet

Antwort

0

Der Titel der Frage ist nicht das, wonach Sie wirklich fragen. Sie haben den gleichen Abfrageplan zwischen Ihrem Prod- und Testserver. Was Sie wirklich fragen ist, warum der Prod-Server ist langsamer als der Test-Server mit der gleichen Abfrage.

In den Kommentaren beantwortet Sie, dass die Tabellen und deren Inhalt zwischen Test und prod identisch waren. Insbesondere erwähnen Sie, dass sie die gleiche Anzahl von Zeilen haben.

Der Prod-Plan zeigt, dass mehr Daten zurückgegeben werden als der Testplan. Der wichtigste Punkt von Interesse bei der Rückgabe von Daten ist der Tabellenscan auf Commercial_All_Day, der Ihre Build-Eingabe für die Hash-Tabelle ist. Im Test werden 725.858 Zeilen mit einer Gesamtgröße von 47 MB ​​zurückgegeben. In prod gibt es 728.941 Zeilen mit einer Gesamtgröße von 120MB. Das ist mehr als die doppelte Größe mit einem Unterschied von 3.083 Zeilen.

mit der Hash-build Eingabetabelle mehr zurückkehr als die Datenmenge verdoppelt es ist viel größer in prod als im Test. Im Test ist die Hash-Tabelle 19.897.066 Zeilen mit einer Größe von 2.713 MB. In Prod ist die Hash-Tabelle 20.006.362 Zeilen mit einer Größe von 4.732 MB. Prod knackt weitere 2 GB Daten.

Sie müssen zurück gehen und nehmen einen besseren Blick auf das, was der Unterschied zwischen den Daten in prod und Test. Keine Ihrer Tabellen gibt beim Vergleich von Prod- und Testplänen die gleiche Datenmenge zurück. Ihr wirklicher Schmerzpunkt mit dieser Frage spezifisch ist jedoch die Commerciali_All_Day Tabelle.

0

Ihre Bemerkung über den Titel der Frage ist richtig. Anfangs waren auch die Produktions- und Testausführungspläne unterschiedlich, aber die linke äußere Verbindung erklärend, erhielt ich den gleichen Ausführungsplan, aber mit unterschiedlicher Ausführungszeit.

Zwischen Produktion und Test gibt es eine andere Zeilennummer, da die Daten des Tests auf einen Tag früher aktualisiert werden und es keine 3.083 Zeilen gibt.

Ich überprüfte den Unterschied zwischen den zusätzlichen Daten in der Produktionsumgebung verarbeitet und ich fand eine temporäre Tabelle mit 2 Feldern mit dem Typ varchar (max), die in der Testumgebung varchar (25) sind. Ich habe die Typen dieser 2 Felder geändert und jetzt sind die Ausführungszeit und die verarbeiteten Daten identisch.

Vielen Dank für Ihre Hilfe.