2008-10-18 3 views
5

Kennt jemand Code oder Tools, die Literalwerte aus SQL-Anweisungen entfernen können?Was ist der beste Weg, um Literalwerte aus SQL zu entfernen, um db-Workloads korrekt zu identifizieren?

Der Grund für die Frage ist, ich möchte die SQL-Arbeitslast in unserer Datenbank richtig beurteilen und ich mache mir Sorgen, dass ich schlechte Anweisungen verpassen könnte, deren Ressourcennutzung maskiert werden, weil sie als separate Anweisungen angezeigt werden. In Wirklichkeit sind sie ziemlich genau dasselbe, außer dass verschiedene IDs übergeben werden.

Ich würde eine datenbankunabhängige Lösung bevorzugen, wenn eine existiert. Ich hatte gedacht, dass es ein schickes Perl-Modul dafür geben könnte, aber ich habe keines gefunden.

Danke für Ihre Hilfe.

Antwort

9

SQL::Statement, insbesondere der SQL::Statement::Structure Modul, lassen Sie analysieren und SQL-Anweisungen manipulieren. Die Teilmenge der SQL-Syntax, die es versteht can be seen here.

In einem verwandten Hinweis gibt es DBI::Profile, um mit Ihrer Leistungsanalyse zu helfen.

+0

Danke Schwern. Das scheint genau das zu sein, was ich brauche. –

+0

Gern geschehen (ich wusste nicht, dass es existiert, bis Sie gefragt haben). – Schwern

2

Wenn Sie JDBC oder etwas ähnliches verwenden, sollte Ihr SQL keine Literale haben, nur '?' Markieren, wo sie sein sollten.

+0

Vielen Dank für Ihre Antwort. Leider bekommen wir manchmal SQL Statements mit Literalwerten anstatt Bind Variablen, und ich habe (noch) keine Möglichkeit, die Entwicklung zu reparieren, um die Abfragen zu beheben. –

+0

Nur teilweise zutreffend; Es ist ein gutes Ziel, aber in der Praxis wird es selten erreicht. –

0

Also, was Sie sagen, sind möglicherweise einige schlecht durchzuführende Abfragen, die ähnlich sind, weil sie dynamisch erstellt werden, und Sie möchten sie zusammen gruppiert werden, da sie von demselben Aufruf kommen, so dass die Gesamtzeit verbracht Ausführen wird in Ihrem Profiling an die Spitze steigen?

Ich denke, Sie müssen damit umgehen mit einer Regex oder etwas. Vielleicht können Sie die Anweisungen durch eine SQL Prettifier übergeben, so dass sie zuerst konsistent sind, dann bereinigen sie - Literal-Strings sollten am einfachsten sein, weil sie alle in '' (/'.*'/STRING_LITERAL/) sind, und dann die numerischen Literale möglicherweise durch Entfernen von /\d*/NUMERIC_LITERAL/ oder ähnlichem machbar sein.

+0

Ja, genau das suche ich. Du hast es viel besser gesagt als ich, denke ich! –

+0

Ich stimme zu, dass eine Regex benötigt wird, weshalb ich hoffte, dass es eine Perl-Lösung geben würde, aber ich kann bis jetzt noch keine sehen. –

+0

/-? \ B \ d + \ b/wäre besser für numerische (gut, ganze Zahl, jedenfalls) Literale – ysth

-1

Ich denke, ich würde sed verwenden, um dies zu lösen. So etwas wie dieses

$ cat sql.txt 
SELECT * FROM USER WHERE USERID = 123 OR USERNAME LIKE 'Name1%' 
SELECT * FROM USER WHERE USERID = 124 OR USERNAME LIKE 'Name2%' 
SELECT * FROM USER WHERE USERID = 125 OR USERNAME LIKE 'Name3%' 
SELECT * FROM USER WHERE USERID = 126 OR USERNAME LIKE 'Name4%' 

$ sed -e "s/\([0-9]\+\)\|\('[^']*'\)/?/g" sql.txt 
SELECT * FROM USER WHERE USERID = ? OR USERNAME LIKE ? 
SELECT * FROM USER WHERE USERID = ? OR USERNAME LIKE ? 
SELECT * FROM USER WHERE USERID = ? OR USERNAME LIKE ? 
SELECT * FROM USER WHERE USERID = ? OR USERNAME LIKE ? 
+0

p.s. Wenn irgendjemand kommentieren könnte, wie man all diese entmutigte Flucht vermeiden kann, würde es sehr geschätzt werden. –

+0

Danke John, es ist ein guter Ausgangspunkt! –

0

Ich weiß, Sie wollten eine datenbankunabhängige Option, aber wenn Sie Microsoft SQL Server verwenden, tun die kostenlose MS ReadTrace (für SQL 2005) und Read80Trace (für SQL 2000) genau dies. Sie nehmen eine Ablaufverfolgungsdatei und löschen die Literale. Ich habe auch keine db-unabhängige Lösung gesehen (und ich arbeite für Quest Software, ein Autor von db-unabhängigen Tools).

http://blogs.msdn.com/psssql/archive/2007/12/18/rml-utilities-for-microsoft-sql-server-released.aspx

0

Die Semantic Designs Quellcode-Suchmaschine wird diese triviale tun, seine SQL-Scanner.

Die Suchmaschine lexes Quellcode zum Erstellen von Lexemen, einschließlich genau diese wörtlichen Zeichenfolgen Sie nach. Es indexiert alle Lexeme und verwendet diesen Index, um Ihnen zu ermöglichen, Ihre Quellcode-Basis (auch wenn sie riesig ist) auf interaktive Weise zu durchsuchen/durchsuchen.

Die Suchmaschine Abfrage: S (ja, nur ein S) wird alle Literal "S" Trings in Ihrem SQL-Text finden. Alle Abfrageergebnisse werden in einem Trefferfenster angezeigt, und Sie können direkt auf Ihren Weg klicken, um den betreffenden Code von einem beliebigen Treffer aus anzuzeigen.Es gibt eine Protokollierungseinrichtung, die alle Treffer für eine spätere Analyse aufzeichnet .

http://www.semanticdesigns.com/Products/SearchEngine/index.html

Verwandte Themen