2009-03-31 5 views
5

Hablando con un colega mío. Estaba caminando con un salto en su paso, en el camino a la máquina de café.¿Cuál fue la mejor optimización de SQL en una consulta de rendimiento lento?

Le pregunté "¿Qué pasa con la caminata 'enjambre'?", Dijo, "¡Acabo de reducir una consulta de dos horas de duración a 40 segundos! Se siente tan bien".

Alteró un procedimiento almacenado, que utilizaba cursores e introdujo una tabla temporal, que se refactivó a partir del conjunto de datos original; le enviaré un correo electrónico pronto para obtener más información sobre la implementación real.

Pero al final, él estaba zumbando.

La pregunta es, ¿qué SQL, que se te queda grabado y te hace vibrar, mientras optimizas las consultas de bajo rendimiento?

+0

Me encantaría ver esta consulta de dos horas de duración. – RavB

Respuesta

1

Disculpe, no suelo entusiasmarme con ese tipo de cosas, pero la mayoría de las situaciones han sido bastante básicas, supervisando el rendimiento de las consultas y agregando índices para acelerarlas.

Aumentando la velocidad del código "real" que he escrito al cambiar las estructuras de datos y los algoritmos dentro de la clase, es donde obtengo mi rumor (y la reputación como el mejor recurso para las soluciones de rendimiento en el trabajo).

+0

código "real" en lugar de sql? Qué cruel. – Learning

+0

relacionado con el zumbido, estoy de acuerdo, cuando lo ha estado haciendo durante mucho tiempo, la sensación se vuelve menos. – Ferdeen

+0

@Learning, no significaba desacreditar a SQL, es solo que se compone principalmente de consultas de una sola línea donde la optimización es bastante directa. Las grandes bases de código complicadas ("reales") me dan más sentido de logro. – paxdiablo

1

oye en el iPhone que utiliza SQLite, i enseguida redujo el tiempo de procesamiento de la base de datos de 40 segundos a 2 segundos con el uso de transacciones de escritura exclusivos ... Yo estaba muy feliz haciendo esto

ya que este era mi primera experiencia de sql en un dispositivo integrado: bastante diferente de las cosas habituales relacionadas con el servidor (índices, normalizaciones, etc.)

--- en lo que respecta a los servidores, los índices son una verdadera bendición. Además, si toma un poco de dolor y se deshace de tantos nulos como pueda en su tabla, se sorprenderá con las ganancias de rendimiento: no muchos desarrolladores se enfocan en nulos, generalmente van con índices y otras cosas documentadas

algunas otras formas menos explotadas: usar xml para procesar varias inserciones por lotes/actualizaciones/eliminaciones a 1 vez en lugar de hacer 1 inserción a la vez - en sql 2005 esto puede ser súper genial

6

Tengo que decir cuando aprendí cómo para crear y usar índices cubiertos. Ahora, ESO fue un refuerzo de rendimiento.

+0

+1 cuando se usan correctamente, pueden ofrecer increíbles mejoras en el rendimiento –

+0

No sabía acerca de los índices cubiertos. Acabo de leer un artículo sobre ellos y estoy ansioso por probar la técnica. (Soy el 'Colega con el salto en mi paso' en la pregunta original de Ferds ;-)) –

+0

Sí, son geniales, solo ten cuidado con las tablas grandes ya que pueden volverse bastante enormes y hacer más daño que bien si se usan incorrectamente. Como todo el rendimiento, debe probar una carga de trabajo representativa antes y después. –

3

Siempre es bueno tomar una consulta mal escrita, cargada de cursor y eliminar cursores, cortar el código a la mitad, y mejorar el rendimiento de muchas maneras.

Algunas de las mejores mejoras son en claridad (y a menudo dan como resultado buenos aumentos de rendimiento también).

+0

Sólo pensé en otra pregunta: ¿cuándo son útiles los cursores? todos parecen volver a factorizarlos en algo más óptimo. – Ferdeen

+0

encontró esto http://stackoverflow.com/questions/287445/why-do-people-hate-sql-cursors-so-much – Ferdeen

5

Uso de SQL BULKIMPORT para reducir varias horas de código INSERT heredado a menos de un minuto.

1

Todo se trata de índices. Y evitar cosas estúpidas que los hacen inútiles.

+0

¡el problema está entre el teclado y la silla! – Sam

0

Bueno, tuvimos una situación similar en la que tuvimos una consulta lenta en un sitio de Open Freeway.La respuesta no fue tanto optimizar la consulta, sino optimizar el servidor en el que estaba. Aumentamos el límite de caché y el tamaño de caché para que el servidor no ejecutara la consulta tan a menudo.

Esto ha aumentado enormemente la velocidad del sistema y finalmente ha hecho feliz al cliente! :)

No es del todo el calibre de las habilidades originales de optimización de mensajes, ¡pero definitivamente nos hizo vibrar!

0

Dividir un procedimiento almacenado ridículamente largo, que hizo una gran cantidad de "si es después de las 5 pm, devuelve este bit de sql" y que tardó más de 20 segundos en ejecutarse, en un conjunto de procedimientos almacenados que se llamaron por un control de sp, y redujo los tiempos a respuestas de subsegundo.

1

Cambiando el orden de condiciones dentro de la cláusula WHERE para que filtre la condición más discriminativa primero (mientras que al mismo tiempo se eliminan los índices de columnas no discriminatorias como el género).

+0

El optimizador de consultas debería hacer esto por usted ... ¿en qué motor estaba esto? – Brimstedt

+0

¿Qué DBMS estás usando? No debería necesitar reordenar manualmente DONDE condiciones si su optimizador está haciendo su trabajo correctamente. – LukeH

+1

MS SQL 2000. De todos modos, no veo cómo el motor puede optimizar esto. Si desea evaluar el circuito de alguna expresión que contenga AND, debe escribir el código que lo haga. Incluso cuando no está cortocircuitando, ¿cómo el servidor puede saber qué campo es más discriminatorio si los campos son del mismo tipo? – Dan

0

una palabra, consultas dinámicas

Si serching con un gran número de parámetros que puede descartarlos de la cadena SQL. Esto ha acelerado mis consultas dramáticamente y con facilidad.

Create PROCEDURE dbo.qryDynamic 
( 

@txtParameter1 nvarchar(255), 
@txtParameter2 nvarchar(255), 

AS 
SELECT  qry_DataFromAView.* 
FROM   qry_DataFromAView 
BEGIN 

    DECLARE @SQL nvarchar(2500) 
    DECLARE @txtJoin nvarchar(50) 

    Set @txtJoin = ' Where ' 

    SET @SQL = 'SELECT  qry_DataFromAView.* 
       FROM   qry_DataFromAView' 

    IF @txtParameter1 is not null 
    Begin 
     SET @[email protected] + @txtJoin + ' Field1 LIKE N''%'' + @dynParameter1 + N''%'') ' 
     Set @txtJoin = ' And ' 
    end 


    IF @txtParameter2 is not null 
    Begin 
     SET @[email protected] + @txtJoin + ' Field2 LIKE N''%'' + @dynParameter2 + N''%'') ' 
     Set @txtJoin = ' And ' 
    end 

    SET @[email protected] + ' ORDER BY Field2' 


    Exec sp_executesql @SQL, N'@dynParameter1 nvarchar(255), @dynParameter2 nvarchar(255)', @dynParameter1 = @txtParameter1 ,@dynParameter2 = @txtParameter2 

END 
GO 
1

vuelta en el día, he trabajado en un sistema/CICS DB2, escrito en COBOL. Muchas de nuestras consultas realizaban escaneos completos de tablas (y lentos) aunque teníamos todos los índices adecuados y las cláusulas WHERE.

Resultó (y puede tener esto al revés, ha sido 15 años) que el problema era que estábamos usando PIC S9(n) COMP en WORKING STORAGE de los parámetros de consulta, pero DB2 querido PIC S9(n) COMP-3. Al utilizar el tipo de datos incorrecto, DB2 tuvo que realizar un escaneo completo de la tabla para convertir los valores en la base de datos al valor que estábamos transfiriendo. Cambiamos nuestras definiciones de variables y las consultas pudieron usar los índices ahora, lo que drásticamente mejoró nuestro rendimiento

0

que tenían un brillo cálido después de haber sido capaz de utilizar una consulta Cruz Tab para el desguace de montones (término técnico) de procesamiento y operaciones de búsqueda ...

por lo general es cosas simples como la adición de índices o sólo para conseguir los datos que necesita , pero cuando encuentras un problema que se ajusta a una respuesta que has visto antes ... ¡buenos momentos!

0

(A mitad de camino del tema)

Reescribí un procedimiento almacenado en la línea 3000 LINQ2SQL/C#. El procedimiento almacenado hizo malabares con muchos datos entre un grupo de tablas temporales no indexadas. La versión de LINQ2SQL leyó los datos en un par de Dictionaries y ILookups y luego me uní a los datos manualmente con el código simple de C#.

El procedimiento almacenado tomó aproximadamente 20 segundos y la versión LINQ2SQL/C# tomó 0.2 segundos.

1

que tenía una consulta que fue escrito originalmente para SQL Server 6.5, que no apoyó la SQL 92 sintaxis de combinación, es decir

select foo.baz 
from foo 
    left outer join bar 
    on foo.a = bar.a 

en cambio se escribe como

select foo.baz 
from foo, bar 
where foo.a *= bar.a 

La consulta había sido durante un tiempo, y los datos relevantes se han acumulado para hacer que la consulta se ejecute demasiado lento, cerca de 90 segundos para completar.En el momento en que surgió este problema, nos habíamos actualizado a SQL Server 7.

Después de rebuscar con índices y otros Easter-egging, cambié la sintaxis de unión para que sea compatible con SQL 92. El tiempo de consulta se redujo a 3 segundos.

No creo que vuelva a sentir eso nunca más. Yo era un héroe f% $^ing.

+0

SQL Server 6.5 admitió la combinación externa izquierda. Según Ron Soukup (administrador de programa de SQL Server): "Antes de la versión 6.5, SQL Server tenía soporte externo limitado en la forma de operadores especiales * = y = *. Mucha gente ha asumido la sintaxis LEFT OUTER JOIN de SQL Server 6.5 es simplemente un sinónimo de * =, pero este no es el caso. LEFT OUTER JOIN es semánticamente diferente y superior a * =. " –

+0

Ahora que es un caso razonable para adoptar la sintaxis de SQL-92. ¡Finalmente! – Sam

Cuestiones relacionadas