什么';从SQL中去掉文本值以正确识别db工作负载的最佳方法是什么?

什么';从SQL中去掉文本值以正确识别db工作负载的最佳方法是什么?,sql,database,perl,parsing,Sql,Database,Perl,Parsing,有人知道有什么代码或工具可以从SQL语句中去除文字值吗 问这个问题的原因是我想正确判断数据库中的SQL工作负载,我担心我可能会错过错误的语句,这些语句的资源使用会被掩盖,因为它们显示为单独的语句。实际上,除了传入不同的ID之外,它们几乎是一样的 如果有的话,我更喜欢独立于数据库的解决方案。我原以为有一个漂亮的Perl模块可以实现这一点,但我没有找到任何模块 谢谢您的帮助。如果您使用JDBC或类似的东西,您的SQL不应该有任何文本,只需要“?”标记它们应该在哪里。因此,您要说的是,您可能会遇到一些

有人知道有什么代码或工具可以从SQL语句中去除文字值吗

问这个问题的原因是我想正确判断数据库中的SQL工作负载,我担心我可能会错过错误的语句,这些语句的资源使用会被掩盖,因为它们显示为单独的语句。实际上,除了传入不同的ID之外,它们几乎是一样的

如果有的话,我更喜欢独立于数据库的解决方案。我原以为有一个漂亮的Perl模块可以实现这一点,但我没有找到任何模块


谢谢您的帮助。

如果您使用JDBC或类似的东西,您的SQL不应该有任何文本,只需要“?”标记它们应该在哪里。

因此,您要说的是,您可能会遇到一些性能很差的查询,它们是类似的,因为它们是动态构建的,您希望将它们分组在一起,因为它们来自同一个调用,所以执行所花费的总时间将在您的评测中上升到顶部


我想你得用正则表达式之类的东西来处理。也许您可以通过一个
SQL
prettifier传递语句,使它们首先保持一致,然后对它们进行清理-文字字符串应该是最简单的,因为它们都在
''(/'.*/STRING\u literal/)
,然后,可以通过删除
/\d*/numeric\u LITERAL/
或类似内容来实现数字文本。

我想我应该使用
sed
来解决这个问题。像这样的

$ 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 ?
,特别是模块,将允许您解析和操作SQL语句。它所理解的SQL语法的子集


在一个相关的说明中,有一些方法可以帮助您进行性能分析。

我知道您想要一个独立于数据库的选项,但是如果您使用的是Microsoft SQL Server,免费的MS ReadTrace(适用于SQL 2005)和Read80Trace(适用于SQL 2000)正好可以做到这一点。它们获取一个跟踪输出文件并去掉文本。我也没有见过独立于db的解决方案(我为Quest Software工作,他是独立于db的工具的作者)


语义设计源代码搜索引擎将很容易做到这一点, 使用它的SQL扫描程序

搜索引擎对源代码进行词法分析以生成词素,包括 正是您要查找的文本字符串。它索引了所有的词素 并使用该索引使您能够搜索/浏览源 以交互方式编写代码库(即使它很大)

搜索引擎查询: s (是的,只有一个S)将定位SQL文本中的所有文本“S”字符串。 所有查询结果都显示在命中窗口中,您可以 直接单击您的方式从任何位置查看有问题的代码 打有一个记录设备,可以记录所有 这些点击将用于以后的分析


谢谢您的回复。不幸的是,我们有时会收到带有文本值而不是绑定变量的sql语句,我(目前)还没有办法让开发人员修复查询;这是一个很好的目标,但在实践中很少实现。是的,这正是我想要的。我想你说的比我好得多!我同意需要一个正则表达式,这就是为什么我希望有一个perl解决方案,但我目前还看不到一个解决方案。/-?\b\d+\b/对于数值型(无论如何,整数型)literalsp.s会更好。如果有人能就如何避免所有这些被砍的人逃跑发表评论,那将是非常感谢的。谢谢施沃恩。这看起来正是我需要的。