SET ROWCOUNT 1 performancesproblem

Ich habe ein Problem mit SQL server 2008 R2. Wenn ich die folgende statement ausführe, dauert es weniger als 1 Sekunde.

SELECT A.REFERENCE_DATE AS REFERENCE_DATE ,A.MIS_BANK_ID AS BANK_ID ,'Unknown credit line' AS QUERY_LOG ,'STG_MIS_CREDIT_LINES_VALUE' AS [TABLE] ,'MIS_CREDIT_LINE_BRANCH_ID - MIS_CREDIT_LINE_ID' AS FIELD ,( 'MIS_CREDIT_LINE_BRANCH_ID: ' + A.MIS_CREDIT_LINE_BRANCH_ID + ' # MIS_CREDIT_LINE_ID: ' + A.MIS_CREDIT_LINE_ID ) AS [KEY] ,( A.MIS_CREDIT_LINE_BRANCH_ID + ' - ' + A.MIS_CREDIT_LINE_ID ) AS RESULT_1 ,NULL AS RESULT_2 ,NULL AS OUTSTANDING FROM STG_MIS_CREDIT_LINES_VALUE A LEFT JOIN STG_MIS_REG_CREDIT_LINES B ON A.REFERENCE_DATE = B.REFERENCE_DATE AND A.MIS_BANK_ID = B.MIS_BANK_ID AND A.MIS_CREDIT_LINE_BRANCH_ID = B.MIS_CREDIT_LINE_BRANCH_ID AND A.MIS_CREDIT_LINE_ID = B.MIS_CREDIT_LINE_ID WHERE B.MIS_CREDIT_LINE_ID IS NULL AND A.REFERENCE_DATE = '20131231' 

Während, wenn ich eine "SET ROWCOUNT 1" statement an der Spitze addiere, dauert es mehr als 20 Minuten, um auszuführen!

 SET ROWCOUNT 1 SELECT A.REFERENCE_DATE AS REFERENCE_DATE ,A.MIS_BANK_ID AS BANK_ID ,'Unknown credit line' AS QUERY_LOG ,'STG_MIS_CREDIT_LINES_VALUE' AS [TABLE] ,'MIS_CREDIT_LINE_BRANCH_ID - MIS_CREDIT_LINE_ID' AS FIELD ,( 'MIS_CREDIT_LINE_BRANCH_ID: ' + A.MIS_CREDIT_LINE_BRANCH_ID + ' # MIS_CREDIT_LINE_ID: ' + A.MIS_CREDIT_LINE_ID ) AS [KEY] ,( A.MIS_CREDIT_LINE_BRANCH_ID + ' - ' + A.MIS_CREDIT_LINE_ID ) AS RESULT_1 ,NULL AS RESULT_2 ,NULL AS OUTSTANDING FROM STG_MIS_CREDIT_LINES_VALUE A LEFT JOIN STG_MIS_REG_CREDIT_LINES B ON A.REFERENCE_DATE = B.REFERENCE_DATE AND A.MIS_BANK_ID = B.MIS_BANK_ID AND A.MIS_CREDIT_LINE_BRANCH_ID = B.MIS_CREDIT_LINE_BRANCH_ID AND A.MIS_CREDIT_LINE_ID = B.MIS_CREDIT_LINE_ID WHERE B.MIS_CREDIT_LINE_ID IS NULL AND A.REFERENCE_DATE = '20131231' 

Wenn ich den ROWCOUNT Parameter auf 2 oder 0 oder 100 oder irgendetwas anderes ROWCOUNT , läuft die Abfrage schnell wieder (weniger als 1 Sek.).

HINWEIS 1: Die Abfrage gibt tatsächlich 0 Zeilen zurück (und das ist für mich ok).

HINWEIS 2: Ich kann die Abfrage nicht ändern, indem ich eine TOP 1-statement hinzufüge, weil meine eine ETL-Software ist und Abfragen von einem festen SET ROWCOUNT 1 (das aus technischen Gründen SET ROWCOUNT 1 ist) und einer kostenlosen Abfrage von Firmenbenutzern "komponiert" sind. etwas wie

 SET ROWCOUNT 1 ... SQL statement written by user ... 

Danke im Voraus.

Nicola

[BEARBEITEN]

Ausführungsplan (mit ROWCOUNT 1) http://pastebin.com/RambD7Aj

Ausführungsplan (mit ROWCOUNT 2) http://pastebin.com/cG4ngE4h

Kann nicht sicher sagen, ohne auf Ausführungspläne zu schauen, aber es klingt wie das, wenn du zum ersten Mal SET ROWCOUNT 1 , versucht es, einen neuen Ausführungsplan zu erstellen, der keine Indizes verwendet, wenn man ihn erneut ausführt, verwendet er den korrekten Ausführungsplan.

Hier sind paar Dinge zu versuchen.

  • füge OPTION (RECOMPILE) zu deiner Abfrage hinzu.
  • Versuchen Sie, SET ROWCOUNT 1 mit SELECT TOP 1 replace
  • Blick auf Ausführungspläne für beide Abfragen.
  • ROW_NUMBER() und wende deine Abfrage in abgeleitete Tabelle mit where-Klausel mit rn = 1