2008-10-18 8 views
5

¿Alguien sabe de algún código o herramienta que pueda quitar valores literales de las declaraciones de SQL?¿Cuál es la mejor manera de quitar valores literales de SQL para identificar correctamente la carga de trabajo db?

La razón para preguntar es que quiero juzgar correctamente la carga de trabajo de SQL en nuestra base de datos y me preocupa que pueda perder declaraciones erróneas cuyo uso de recursos se enmascara porque se muestran como declaraciones separadas. Cuando, en realidad, son prácticamente lo mismo, excepto por los diferentes ID que se pasan.

Preferiría una solución independiente de base de datos, si existe alguna. Pensé que podría haber un ingenioso módulo de Perl para esto, pero no encontré ninguno.

Gracias por su ayuda.

Respuesta

9

SQL::Statement, en particular, el módulo SQL::Statement::Structure, le permitirá analizar y manipular sentencias SQL. El subconjunto de la sintaxis de SQL comprende can be seen here.

En una nota relacionada, hay DBI::Profile para ayudar con su análisis de rendimiento.

+0

Gracias Schwern. Esto parece ser exactamente lo que necesito. –

+0

De nada (no sabía que existía hasta que me lo preguntó). – Schwern

2

Si usa JDBC o algo así como que su SQL no debe tener ningún literal, solo '?' marcando donde deberían estar.

+0

Gracias por su respuesta. Lamentablemente, a veces recibimos sentencias SQL enviadas con valores literales en lugar de variables de enlace, y no tengo forma (todavía) de obtener desarrollo para arreglar las consultas. –

+0

Solo parcialmente cierto; es un buen objetivo, pero rara vez se alcanza en la práctica. –

0

Así que, lo que está diciendo es que puede tener algunas consultas de rendimiento incorrecto porque están compiladas dinámicamente, y quiere que se agrupen ya que provienen de la misma llamada para que el tiempo total transcurra la ejecución se elevará a la cima en su perfil?

Creo que tendrás que manejar esto con una expresión regular o algo así. Tal vez pueda pasar las instrucciones a través de un prettificador SQL para que sean consistentes primero, luego desinféctelas: las cadenas literales deberían ser las más fáciles porque están todas en '' (/'.*'/STRING_LITERAL/), y luego los literales numéricos podrían ser factibles al eliminar /\d*/NUMERIC_LITERAL/ o similar.

+0

Sí, eso es exactamente lo que estoy buscando. ¡Lo has puesto mucho mejor que yo, creo! –

+0

Acepto que se necesita una expresión regular y por eso tenía la esperanza de que hubiera una solución Perl, pero no puedo ver una hasta ahora. –

+0

/-? \ B \ d + \ b/sería mejor para literales numéricos (bueno, enteros, de todos modos) – ysth

-1

Creo que usaría sed para resolver esto. Algo como esto

$ 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

p.s. Si alguien pudiera comentar sobre cómo evitar todos aquellos que escapen de espaldas, sería muy apreciado. –

+0

¡Gracias John, es un buen punto de partida! –

0

Sé que quería una opción independiente de la base de datos, pero si está utilizando Microsoft SQL Server, el MS ReadTrace gratuito (para SQL 2005) y Read80Trace (para SQL 2000) hacen exactamente esto. Toman un archivo de salida de rastreo y eliminan los literales. Tampoco he visto una solución independiente de db (y trabajo para Quest Software, un autor de herramientas independientes de db).

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

0

La fuente diseños de motores de búsqueda de código semántico harán esto trivialmente, usando su escáner SQL.

El motor de búsqueda lee el código fuente para producir lexemas, incluyendo exactamente las cadenas literales que después. Indexa todos los lexemas y usa ese índice para permitirle buscar/explorar su base de código fuente (aunque sea enorme) de manera interactiva.

La consulta del motor de búsqueda: S (sí, solo una S) localizará todos los trings "S" literales en su texto SQL. Todos los resultados de la consulta se muestran en una ventana de hit, y puede hacer clic directamente en su ruta para ver el código en cuestión desde cualquier hit.Hay una función de registro que registrará todos los los hits para su posterior análisis.

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

Cuestiones relacionadas