0

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

ネットで検索したところ、Perl には名前が付けられた 2 つのクラスがSQL::Statementあり、SQL::Parserそれらを利用して同じことを達成できることがわかりました。ただし、これらのクラスにはいくつかの制限があることがわかりました (CASE WHENコンストラクトがサポートされていないなど)。

そうは言っても、代わりに Lex/Yacc または Flex/Bison を使用してカスタムの簡潔な SQL パーサーを構築する方がよいでしょうか? どちらのアプローチがより優れていて迅速でしょうか?

これについてあなたの考えを共有してください。また、同じことについて議論しているオンラインのリソースを教えてください。

ありがとう

4

1 に答える 1

2

Teradata has many non ANSI features and you're considering re-implementing the parser for it.

Instead use the database server and put an 'explain' in front of your statements and process the result.

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.

This will also validate your SQL.

于 2016-03-29T23:30:08.763 に答える