Unsere große Anwendung (VB.Net, Framework 3.5) wurde mehr oder weniger von Anfang an entwickelt, um SQL Server und nur SQL Server zu verwenden. Natürlich hat es jemand eines Tages an einen Kunden verkauft, mit dem Versprechen, dass wir es mit Oracle (10g und höher) funktionieren lassen könnten, und jetzt, aber wir haben erhebliche Leistungsprobleme.Das Ausführen parametrisierter Abfragen mit SQL Server und Oracle
Dies rührt von der Tatsache, dass fast all SQL (in dem App-Code enthalten ist) ist in parametrisierten Abfragen der Form
SELECT Col1, Col2, Col3 FROM TableName WHERE IdCol = @EntityId
Diese dann in unsere Datenzugriffsschicht geleitet wird, mit einer Reihe von Parametern entlang Namen, ein Array von Typen und ein Array von Werten und wird dann mithilfe von Enterprise Library 5 ausgeführt, um die tatsächlichen Verbindungen usw. zu verwalten.
Wenn dieses Projekt begann, erkannte jemand, dass Oracle-Parameter in der Form, dass
:EntityId
und entschieden erfordert, anstatt jedes Bit der SQL (diese App allein hat etwa eine Million LOC zu finden und wieder schreiben versucht, und es gibt andere in der Suite) sie würden eine Funktion hinzufügen, die aufgerufen wird, kurz bevor die Abfrage ausgeführt wird, die @ durch Folgendes ersetzt: sowohl im Abfrage- als auch im Parameternamen-Array. Es entfernt auch "WITH NOLOCK", eckige Klammern und ersetzt Verkettungszeichen und andere solche Artefakte, die SQL Server verwendet, aber die Oracle nicht. Das Problem dabei ist natürlich, dass das Suchen und Ersetzen von Strings teuer ist und an einer Stelle in einer einfachen Aktion in der App mehr als 2000 einfache Abfragen nacheinander ausgeführt werden. Gegen SQL Server dauert dies keine Zeit, aber gegen eine Oracle-Plattform dauert es 20-30 Sekunden.
Idealerweise würde ich gerne riesige Mengen Code neu schreiben, um schlechten/ineffizienten Code und Design auszumerzen und fehlerhafte Architektur zu reparieren und das Los durch nHibernate oder Entity Framework zu ersetzen. Aber das wird dank des kommerziellen Drucks und der Größe der Aufgabe nicht so schnell passieren.
Da ich sehr unwahrscheinlich bin erlaubt zu werden so große grundlegende Veränderungen wie die Umstellung auf ein ORM oder Wieder Architecting große Mengen an Code zu machen, ist meine Frage recht einfach:
Gibt es eine Möglichkeit, entweder zu machen SQL Server oder Oracle verstehen die Parameterkennung für die andere oder eine sinnvolle, einfache Art, parametrisierte Abfragen generisch zu schreiben, ohne große Mengen an String-Ersetzungen oder IF ... Else-Anweisungen abhängig von der Zielplattform? Ich weiß, dass ich vielleicht noch fast jede SQL-Anweisung in der Anwendung bearbeiten muss, aber wenn das der Fall ist, dann sei es so, ich muss die Idee einfach an meine Chefs verkaufen.
Prost
Das macht Sinn. Wir benutzen bereits EL5, also werde ich mir den Caching-Anwendungsblock ansehen und zurückmelden, wenn es irgendwas hilft. Prost. –
Ich würde auch empfehlen, zuerst Ihre Anwendung zu profilieren, um sicherzustellen, dass die Abfragekonvertierung ein Leistungsengpass ist. Es ist immer besser mit Profiling zu beginnen, wenn es um Performance-Probleme geht. – Nikolay
Das haben wir schon getan - so wissen wir, dass dies das Problem ist !! In mancher Hinsicht ist dies gut, da es dazu beigetragen hat, einige der gravierenden Fehler in der Anwendung zu identifizieren (und auf das Management aufmerksam zu machen), damit sie es ernst nehmen, anstatt nur von Devs auszugehen, die etwas mit Cool machen wollen Technik'. –