Die SQL-Abfrage wird bei der Ausführung von C # in SQL Server Management Studio schnell ausgeführt

8

Ich habe ein C # -Programm, das eine SQL-Abfrage mit dem unten aufgeführten Code ausführt. Ich habe diesen Code für eine Weile ohne Probleme bis vor kurzem verwendet.

Ich übergebe eine Abfrage-Zeichenfolge an SQL, die eine Liste von Zeichenfolgen enthält, die Stamm-IDs sind. Vor ein paar Tagen habe ich es ausgeführt und die Abfrage abgelaufen, und wird mehr als eine Stunde laufen, wenn ich es lassen. Ich habe die letzten paar Tage damit verbracht, das zu debuggen. In meiner ursprünglichen Abfrage gab es ungefähr 900 Kennungen.

Ich habe versucht, alles zu ändern, was mir einfällt, und Ergebnisse, die ich nicht erklären kann.

Zum Beispiel:

  1. Die Abfrage funktioniert mit einer Liste von Aktien, aber nicht mit einer anderen Liste gleicher Länge in Bezug auf die Anzahl der Zeichenfolge und Gesamtlänge

  2. es funktioniert mit einer Liste, aber nicht mit der gleichen Liste in umgekehrter Reihenfolge

  3. mit einer Liste, es funktioniert, wenn es genau 900 Bezeichner gibt, aber nicht, wenn es 899 oder 901 gibt, und ich kann verschiedene Bezeichner einschließen oder ausschließen und die gleichen Ergebnisse erhalten, also ist es nicht etwas funky mit einem der Identifikatoren.

In jedem dieser Fälle habe ich die Abfragezeichenfolge erfasst, die von meinem Programm übergeben und in SQL Server Management Studio kopiert wurde. In jedem Fall wird die Abfrage in 1 Sekunde ausgeführt.

Ich habe in diesem und anderen Foren alles über Abfragen gelesen, die in SQL Server Management Studio funktionieren, aber bei der Ausführung aus einem Programm eine Zeitüberschreitung haben. Dies scheint jedoch anders zu sein, da ich Fälle finden kann, in denen es fehlschlägt und ähnliche Fälle funktioniert nicht.

Ich würde mich über Vorschläge freuen, wo ich nachsehen könnte, was da vorgeht.

%Vor%

Hier ist meine Abfrage. In dieser Version habe ich 65 Aktien und es funktioniert nicht (& lt; = 64 funktioniert).

%Vor%     
freckles 31.03.2015, 18:32
quelle

2 Antworten

6

Drei Dinge in der Reihenfolge ihrer Präferenz:

  1. Vermeiden Sie die Verwendung der Funktion AddWithValue() , da dies zu katastrophalen Auswirkungen auf die Leistung führen kann, wenn ADO.Net einen Spaltentyp falsch berechnet. Tun Sie, was Sie tun müssen, um für jeden Parameter
  2. einen expliziten DB-Typ festlegen zu können
  3. Sehen Sie sich OPTION RECOMPILE an.
  4. Sehen Sie in OPTIMIERUNG FÜR UNBEKANNTE . Tun Sie dies nur, nachdem die anderen fehlgeschlagen sind.
Joel Coehoorn 31.03.2015, 19:04
quelle
1

Sie haben Ihre Abfrage nicht gepostet, aber nur basierend darauf, wie sie mit der dynamischen Liste von Parametern und der schieren Anzahl von Parametern erstellt wird, werde ich eine Vermutung machen und sagen, dass sie etwas mit Parameter-Sniffing zu tun hat - Siehe:

Ссылка

Ссылка

Die Grundidee des Problems besteht darin, dass ein optimaler Abfrageausführungsplan für einen bestimmten Parametersatz erstellt wird, der für einen anderen Satz sehr suboptimal ist.

Es gibt mehrere Möglichkeiten, um Parameter-Sniffing-Probleme zu umgehen (glücklicherweise wurden viele davon in SQL Server 2008 geöffnet).

Sie könnten:

  1. refactor Ihre Abfrage
  2. Fügen Sie WITH RECOMPILE zu Ihrer gespeicherten proc / option (recompile) zu Ihrer Abfrage
  3. hinzu
  4. optimize for unknown / option (optimize for... zu Ihrer proc / query
  5. andere?
Kritner 31.03.2015 18:44
quelle