Каков наилучший способ вырезать литеральные значения из SQL для правильного определения рабочей нагрузки БД? - PullRequest
5 голосов
/ 19 октября 2008

Кто-нибудь знает о каком-либо коде или инструментах, которые могут вырезать буквальные значения из операторов SQL?

Причина, по которой я спрашиваю, состоит в том, что я хочу правильно оценить рабочую нагрузку SQL в нашей базе данных, и я боюсь, что могу пропустить неверные операторы, использование ресурсов которых маскируется, поскольку они отображаются как отдельные операторы. Когда на самом деле это одно и то же, за исключением того, что передаются разные идентификаторы.

Я бы предпочел независимое от базы данных решение, если таковое существует. Я думал, что для этого мог бы быть отличный модуль Perl, но я не нашел ни одного.

Спасибо за вашу помощь.

Ответы [ 6 ]

9 голосов
/ 19 октября 2008

SQL :: Statement , в частности модуль SQL :: Statement :: Structure , позволит вам анализировать и манипулировать операторами SQL. Подмножество синтаксиса SQL, которое он понимает , можно увидеть здесь .

В соответствующей заметке есть DBI :: Profile , который поможет вам с анализом производительности.

2 голосов
/ 19 октября 2008

Если вы используете JDBC или что-то вроде этого, ваш SQL не должен иметь никаких литералов, просто '?' маркировка, где они должны быть.

0 голосов
/ 17 июня 2009

Поисковая система исходного кода Semantic Designs сделает это тривиально, используя свой сканер SQL.

Поисковая система использует исходный код для создания лексем, в том числе именно те буквальные строки, которые вы после. Индексирует все лексемы и использует этот индекс, чтобы вы могли искать / просматривать ваш источник кодовая база (даже если она огромная) в интерактивном режиме.

Запрос поисковой системы: S (да, просто S) найдет все буквальные "S" trings в вашем тексте SQL. Все результаты запроса отображаются в окне поиска, и вы можете проложите свой путь напрямую, чтобы просмотреть соответствующий код с любого удар. Есть средство регистрации, которое будет записывать все хиты для последующего анализа.

http://www.semanticdesigns.com/Products/SearchEngine/index.html

0 голосов
/ 19 октября 2008

Я знаю, что вы хотели независимый от базы данных вариант, но если вы используете Microsoft SQL Server, бесплатные MS ReadTrace (для SQL 2005) и Read80Trace (для SQL 2000) делают именно это. Они берут файл трассировки и удаляют литералы. Я также не видел решения, независимого от БД (и работаю на Quest Software, автора инструментов, независимых от БД).

http://blogs.msdn.com/psssql/archive/2007/12/18/rml-utilities-for-microsoft-sql-server-released.aspx

0 голосов
/ 19 октября 2008

Я думаю, я бы использовал 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 ?
0 голосов
/ 19 октября 2008

Итак, вы говорите, что у вас могут быть некоторые плохо выполняющиеся запросы, которые похожи, потому что они построены динамически, и вы хотите, чтобы они были сгруппированы вместе, так как они поступают из одного и того же вызова, чтобы общее время, затраченное на выполнение поднимется на вершину в вашем профилировании?

Я думаю, вам придется справиться с этим с помощью регулярных выражений или чего-то еще. Возможно, вы можете пропустить операторы через префиксатор SQL, чтобы они сначала были согласованы, а затем очистить их - литеральные строки должны быть самыми простыми, потому что они все в '' (/'.*'/STRING_LITERAL/), а затем числовые литералы можно было бы выполнить, удалив /\d*/NUMERIC_LITERAL/ или аналогичный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...