我正在构建一个流程,每天需要解析来自Oracle数据库的约1.5亿个查询。我在这里使用antlr的PlSql语法:https://github.com/antlr/grammars-v4/blob/master/plsql/PlSqlParser.g4
Antlr生成一个包含20k行的Lexer和一个包含100k行的解析器。你知道吗
下面是一个解析非常简单的select语句的示例
from antlr4 import *
from antlr4.tree.Tree import TerminalNode
from plsql import PlSqlLexer, PlSqlParserListener, PlSqlParser
import datetime
def handleTree(tree, lvl=0):
for child in tree.getChildren():
if isinstance(child, TerminalNode):
print(lvl*'│ ' + '└─', child)
else:
handleTree(child, lvl+1)
class KeyPrinter(PlSqlParserListener.PlSqlParserListener):
def enterSelect_statement(self, ctx):
handleTree(ctx, 0)
def main():
now = datetime.datetime.now()
i_stream = InputStream(str.upper("""SELECT col1 FROM table1"""))
lexer = PlSqlLexer.PlSqlLexer(i_stream)
t_stream = CommonTokenStream(lexer)
parser = PlSqlParser.PlSqlParser(t_stream)
tree = parser.sql_script()
printer = KeyPrinter()
walker = ParseTreeWalker()
walker.walk(printer, tree)
print(datetime.datetime.now()-now)
if __name__ == '__main__':
main()
输出:
│ │ │ └─ SELECT
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ COL1
│ │ │ │ └─ FROM
│ │ │ │ │ │ │ │ │ │ │ │ │ └─ TABLE1
0:00:36.104422
解析这个简单的查询需要36秒。我可以选择什么来提高性能?换一种语言更好吗?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐