2009-06-24 7 views
4

Wir haben eine Anwendung auf SQL Server 2005 gebaut, die wir nicht kontrollieren können. Wir haben kürzlich festgestellt, dass diese Anwendung sehr ineffiziente SELECT-Abfragen an SQL sendet, die schwerwiegende Kapazitätsprobleme in der Datenbank verursachen. Ich weiß, dass die richtige Lösung darin besteht, den Code für die Anwendung zu öffnen und die Abfragen zu ändern, aber aus Gründen, auf die ich nicht eingehen werde, wird das sehr lange dauern. Gibt es eine Möglichkeit, diese spezifische Abfrage auf dem SQL Server abzufangen und sie selektiv in etwas Optimaleres umzuwandeln?Abfragen abfangen und neu schreiben in SQL Server 2005

+0

Wenn dies möglich wäre, wäre es der schlimmste Hack, den ich bisher in diesem Jahr gesehen habe. Wenn Sie die Abfragen nicht reparieren können, müssen Sie mehr Hardware kaufen, um die Leistung der Abfragen zu verbessern. Die Kosten der zusätzlichen Hardware werden Ihnen zeigen, warum Sie in der Lage sein sollten, Fehler im Code zu beheben. –

+0

Ich schätze die Stimmung. Diese ganze Sache bringt mich zum Weinen, aber wir haben keine Kontrolle über die Anwendung, noch haben wir den Quellcode. Wenn ich alle Teile hier hätte oder irgendwelche Kontrolle über die ursprüngliche Architekturwahl hätte, wären wir nie in dieser Position gewesen, aber wie so oft in der Geschäftswelt erbt ich das Durcheinander von jemand anderem. –

+0

Was ist die Anwendung, die für diese Schwierigkeit verantwortlich ist, ist es eine C#/.Net App. oder kommt es aus C++ Land –

Antwort

2

Sie könnten diesen Ansatz verwenden. Es wirkt wie ein Zauber für mich :)

Anstatt abzufangen versucht und von die Anwendung Ursprung SQL-Aufrufe ändern, vielleicht können Sie stattdessen eine Abstraktionsschicht ohne Änderung der SQL Anwendung implementieren. Zum Beispiel, wenn Sie die DSN oder Login-Verbindungszeichenfolge für die Anwendung ändern können, dann die folgenden connsider. Nehmen wir an, die aktuelle Datenbank ist [A]. Erstellen Sie eine neue Datenbank [B], die Ansichten und Funktionen (aber nicht Tabellen) mit dem gleichen Namen wie enthält, was in [A] ist, dann ändern Sie sie zu Referenz die Tabellen in [A]. Add was auch immer zusätzliche Joins, Filterung, usw. sind erforderlich, um Ihre (was ich unterstellen) Zeile basierte Sicherheit. Ändern Sie dann die Anwendung DSN, um die Datenbank [B] anstelle von [A] zu verwenden.

link

1

Es hängt davon ab, was sie tun und was sind die Abfragen. Wenn sie sprocs oder UDFs verwenden, können Sie diese natürlich ersetzen, ohne die Anwendung zu ändern. Sie können auch einige Indizes hinzufügen, die für ihr fehlerhaftes SQL "optimiert" sind (dies kann jedoch legitime Benutzer der Datenbank betreffen). Sie können auch die Abfragen überprüfen, die sie gerade machen, und sehen, ob Sie die Tabellen, die sie treffen, durch eine effizientere Ansicht ersetzen können, aber dann ärgern Sie sich mit Ihrer DDL, nur um mit einem schlechten Apfel fertig zu werden. Ihre beste Wette ist wahrscheinlich, legitime Anwendungen von diesem bestimmten Server zu migrieren und den Täter allein zu lassen, um zu verrotten.

2

Sie könnten versuchen plan guides. Dadurch können Sie die Abfragen optimieren/optimieren, ohne den tatsächlichen Anruf zu ändern.

Von „Understanding Plan Guides

Dieses Verfahren kann verwendet werden, wenn Sie können nicht oder wollen nicht direkt den Text der Abfrage ändern. Plan Hilfslinien können nützlich sein, wenn eine kleine Teilmenge von Abfragen in einer Datenbank Anwendung von einem Drittanbieter implementiert nicht wie erwartet ausgeführt wird. Plan-Guides beeinflussen Optimierung von Abfragen, indem sie an sie Anfragehinweise anhängen.

sein Dies könnte auch nützlich, um die Abfrage wirklich läuft wie ein lahmer Hund zu machen, so dass die Entwickler für Ihre Hilfe kommen und fragen ...;-)

1

Haben Sie einen Ressourceneditor/Reflektor zu den ausführbaren Dateien genommen? Wenn Sie Glück haben und die SQL-Anweisungen statisch sind, können Sie sie möglicherweise ändern.

Ohne weitere Informationen über die App ist es schwierig festzustellen, ob dies möglich ist. Wenn das SQL dynamisch generiert wird, ist dies keine Option.