Cuestión : Declaración simple del parte movible muy lenta

Hola la gente,

I tiene una declaración muy simple del parte movible, como sigue

Insert en el
select 0,
select 1,
select 2,
select 3,
select 4,
select 5,
select 6,
select 7,
select 8,
select 9,
select 10,
select de MyTable (StringID, StringText) de la UNIÓN del Br/> de N'123452.46093750'< de la UNIÓN del Br/> de N'468330.90625000'< de la UNIÓN del Br/> de N'152484.99609375'< de la UNIÓN del Br/> de N'476937.99609375'< de la UNIÓN del Br/> de N'30 D6-5FFC'< de la UNIÓN del Br/> de N'AE79-9EED'< de la UNIÓN del Br/> de N'10.5.0.75'< de la UNIÓN del Br/> de N'00-21-9B-01-5C-C4'< de la UNIÓN del Br/> del Writer'< del documento de N'Microsoft XPS de la UNIÓN del
de N'ActiveReports 6 ' de la UNIÓN del Br/> de N'6.0.2250.0'< ¿11, UNIONES del

The del Br/> de N'24'< ...... continúan para 1800 expedientes, y cada declaración se explota en las hornadas de 100, apenas así que no golpeo ninguna límites en tamaño de la declaración o número de parte movible de unions.

This tarda 4 segundos para insertar 1800 filas, por qué es esto tan lento? (Las diatribas del ms en TPC calculan alrededor etc, seguramente el más último y el más grande podría manejar más de 450 filas por segundo!!)la tabla del

The no tiene ningún índice, ningunas relaciones: el

crea la tabla MyTable
(
StringID internacional no nulo,
del
StringText

I tienen cambio la base de datos el registrar a “simple”, su edición 2008 del revelador del Sql que funciona en una caja de la base 2.66 del patio con el RAM 4GB. ¿Nada está funcionando en esa caja a menos que el estudio visual 2010.

I haya intentado ") valores (“en vez selecto, y de mí han intentado el sintaxis múltiple basado nueva coma del parte movible del sql 2008 - todas las mismas ideas del

Any? ¿Cualquier cosa intentar?
class= del

Respuesta : Declaración simple del parte movible muy lenta

Aquí es qué reajusta el DB antes de cada prueba.
Todas las pruebas son 10000 partes movibles.

freeproccache del dbcc
dropcleanbuffers del dbcc
fijar el nocount encendido
IR
;
caer la tabla MyTable3
IR
      Crear la tabla MyTable3
      (
            StringID internacional no nulo,
            Falta de información nvarchar de StringText (4000) no
      )
;
=========================
test1 - forma de la unión, una declaración grande (10000 una tirada), generada usar pellizcos below y los algunos manuales

declarar el @i internacional @i=1 determinado
mientras que el @i <� 10001="">comienza
imprimir “seleccionan “+right (@i, 10)+”, el ''' +convert (varchar (máximo), el newid de N ())+ unión del '''”;
fijar @i=@i+1
extremo
=========================

insertar MyTable3
seleccionar 1, unión de N'A0B8022B-CFE9-43C9-97E5-DE89822AC32F
seleccionar 2, unión de N'F87C8670-1339-458E-8F1C-C2E9B717F4AA
seleccionar 3, unión de N'35 ACFFFC-52CF-4805-8C30-A4EB41F3A218
..........
seleccionar 10000.

Tiempo - 7 minutes+, matados

=========================
test2 - unión TODA LA forma
=========================

Tiempo - más rápidamente que arriba.  La CLASE entonces DISTINTA no se requiere.  La unión en sus la propia hace un distinto

=========================
test3 - unión TODA LA forma, 100 por la hornada, separada cerca;
=========================

Tiempo - incluso más rápidamente.  Cada hornada está confiada y no toma mucho la dirección en RAM.  Por otra parte, el optimizador de la pregunta no pasa mucha hora en preguntas largas.  El tiempo de QO sube exponencial para las preguntas largas.

=========================
test4 - la tabla truncada, inserta otra vez (siguiendo de test3 sin reajuste)
=========================

El tiempo - más rápidamente de 3. QO no tiene que hacer ningún planeamiento, las 100 preguntas [de los parásitos atmosféricos] que vienen de escondrijo del plan

=========================
test5 - usar los partes movibles dados parámetros. QO planea solamente un parte movible. El resto de los partes movibles van por plan
Partes movibles generados usar

declarar el @i internacional @i=1 determinado
mientras que el @i <� 101="">comienza
imprimir “exec los valores del parte movible MyTable3 del sp_executesql N '' (@a, @a internacional, @b del @b) '', N '' nvarchar (4000) '', @a='+ a la derecha (el @i, 10)+”, el ''' +convert (varchar (máximo), el newid del @b=N ())+ '''';
fijar @i=@i+1
extremo
=========================

¡Tiempo llevado - 6s! Lo más rápidamente posible.

===================

Conclusiones

(1) el optimizador de la pregunta del servidor del Sql dura exponencial para compilar más largo es el texto de la pregunta.

(2) los bloques grandes del parte movible usar la unión o valores (), (), () los patrones se sientan en un MONTÓN en memoria, después dequeued de MONTÓN en el parte movible - malo.

(3) las preguntas dadas parámetros son buenas.  Mejorar si usted las trata por lotes en dice 10 partes movibles, pero cada parte movible entonces requeriría (por el ejemplo arriba) 20 parámetros en el parte movible de 10 hornadas.

(4) ** No hay prueba arriba, pero mi conjetura ** usar un SP para el parte movible, e.g @a del usp_insert, el @b que hace el parte movible y su escritura a granel de la forma

usp_insert 1, text'; del exec de N'test
usp_insert 2, text'; del exec de N'test
etc

estar tan rápidamente como los partes movibles dados parámetros usar sp_executesql, porque un SP se compila una vez solamente y re-used#.

# - que es la fuente de problemas el oler del parámetro….
Otras soluciones  
 
programming4us programming4us