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:
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
es funktioniert mit einer Liste, aber nicht mit der gleichen Liste in umgekehrter Reihenfolge
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%Drei Dinge in der Reihenfolge ihrer Präferenz:
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 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:
WITH RECOMPILE
zu Ihrer gespeicherten proc / option (recompile)
zu Ihrer Abfrage optimize for unknown
/ option (optimize for...
zu Ihrer proc / query Tags und Links sql sql-server c# sql-server-2008 ado.net