2016-03-29 10 views
0

sqlを構成する特定のキーワード、サブクエリ、派生テーブル、関数などの出現回数を数えることによって、sqlの複雑さレベル(単純/中程度/複雑など)を判断する必要があります。さらに、私は構文的にSQLを検証する必要があります。複雑さのレベルを判断するためにSQLを解析する

ネット上で検索したところ、PerlにはSQL::StatementSQL::Parserという2つのクラスがあり、これを利用することができます。しかし、私は、これらのクラスにはいくつかの制限があることがわかりました(例えば、CASE WHENの構造体はサポートされていません)。

これまで述べてきたように、Lex/YaccやFlex/Bisonを使ってカスタムの簡潔なSQLパーサを構築する方が良いでしょうか?どちらのアプローチがより迅速かつ迅速でしょうか?

ご意見をお寄せください。また、誰もが同じことを議論するオンラインのリソースに私を指すことができます。

おかげ

+0

どのデータベースですか? Microsoft SQLServerは、この種の分析を行うためのツールをカスタマイズしています。 – mob

+0

@mob:データベースはTeradata –

答えて

2

Teradataのは、多くの非ANSIの特徴があり、あなたはそれのために再実装パーサを検討しています。

代わりにデータベースサーバーを使用し、ステートメントの前に「説明」を置き、結果を処理します。

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. 

これでSQLも検証されます。

関連する問題