2016-03-29 7 views
0

Ich muss die Komplexitätsstufe (einfach/mittel/komplex usw.) eines SQL durch die Anzahl der Vorkommen von bestimmten Schlüsselwörtern, Unterabfragen, abgeleiteten Tabellen, Funktionen usw. bestimmen, die die SQL bilden. Zusätzlich muss ich den SQL syntaktisch validieren.Analysieren von SQL zur Bestimmung der Komplexitätsstufe

Ich suchte im Internet und fand heraus, dass Perl 2 Klassen mit den Namen SQL::Statement und SQL::Parser hat, die genutzt werden könnte, um das gleiche zu erreichen. Ich habe jedoch festgestellt, dass diese Klassen mehrere Einschränkungen haben (wie CASE WHEN Konstrukte nicht unterstützt usw.).

Wie schon gesagt, ist es besser, stattdessen einen benutzerdefinierten, präzisen SQL-Parser mit Lex/Yacc oder Flex/Bison zu erstellen? Welcher Ansatz wäre besser und schneller?

Bitte teilen Sie Ihre Gedanken dazu. Kann mich jemand auch auf irgendwelche Ressourcen verweisen, die das gleiche diskutieren.

Dank

+0

Welche Datenbank? Microsoft SQLServer verfügt zum Beispiel über angepasste Tools für diese Art der Analyse. – mob

+0

@mob: Die Datenbank ist Teradata –

Antwort

2

Teradata hat viele nicht ANSI-Funktionen und Sie erwägen, den Parser für sie neu zu implementieren.

Verwenden Sie stattdessen den Datenbankserver und legen Sie ein 'explain' vor Ihre Anweisungen und bearbeiten Sie das Ergebnis.

explain select * from dbc.dbcinfo; 

    1) First, we lock a distinct DBC."pseudo table" for read on a RowHash 
    to prevent global deadlock for DBC.DBCInfoTbl. 
    2) Next, we lock DBC.DBCInfoTbl in view dbcinfo for read. 
    3) We do an all-AMPs RETRIEVE step from DBC.DBCInfoTbl in view 
    dbcinfo by way of an all-rows scan with no residual conditions 
    into Spool 1 (group_amps), which is built locally on the AMPs. 
    The size of Spool 1 is estimated with low confidence to be 432 
    rows (2,374,272 bytes). The estimated time for this step is 0.01 
    seconds. 
    4) Finally, we send out an END TRANSACTION step to all AMPs involved 
    in processing the request. 
    -> The contents of Spool 1 are sent back to the user as the result of 
    statement 1. The total estimated time is 0.01 seconds. 

Dies wird auch Ihre SQL validieren.