Pergunta : Indicação simples da inserção muito lenta

Olá! os povos,

I've começ uma indicação muito simples da inserção, como segue

Insert no
select 0 de MyTable (StringID, StringText),
select 1 da UNIÃO do Br/> de N'123452.46093750'<,
select 2 da UNIÃO do Br/> de N'468330.90625000'<,
select 3 da UNIÃO do Br/> de N'152484.99609375'<,
select 4 da UNIÃO do Br/> de N'476937.99609375'<,
select 5 da UNIÃO do Br/> de N'30 D6-5FFC'<,
select 6 da UNIÃO do Br/> de N'AE79-9EED'<,
select 7 da UNIÃO do Br/> de N'10.5.0.75'<,
select 8 da UNIÃO do Br/> de N'00-21-9B-01-5C-C4'<,
select 9 da UNIÃO do Br/> do Writer'< do original de N'Microsoft XPS,
select 10 da UNIÃO do
de N'ActiveReports 6 ',
select da UNIÃO do Br/> de N'6.0.2250.0'< 11, UNIÕES do

The do Br/> de N'24'< ...... continua para 1800 registros, e cada indicação é estoirada em grupos de 100, apenas assim que eu não bato nenhuma limites no tamanho da indicação ou número de inserção de unions.

This toma 4 segundos para introduzir 1800 fileiras, por que é este tão lento? (Os divertidos do MS aproximadamente em TPC figuram etc., certamente o mais atrasado e grande poderia controlar mais de 450 por segundo das fileiras!!)a tabela do

The não tem nenhum índice, nenhuns relacionamentos: o

cria a tabela MyTable
(
StringID int nao nulo,
do
StringText

I têm a mudança a base de dados registrar a “simples”, sua edição 2008 do colaborador do Sql que funciona em uma caixa do núcleo 2.66 do quadrilátero com o RAM 4GB. Nada mais está funcionando nessa caixa a não ser que o estúdio visual 2010.

I tente ") valores (“em vez de seleto, e do mim tentaram vírgula nova a sintaxe múltipla baseada da inserção do sql 2008 - todas as mesmas idéias do

Any? Qualquer coisa tentar?
class= do

Resposta : Indicação simples da inserção muito lenta

É aqui o que restaura o DB antes de cada teste.
Todos os testes são 10000 inserções.

freeproccache do dbcc
dropcleanbuffers do dbcc
ajustar o nocount sobre
IR
;
deixar cair a tabela MyTable3
IR
      Criar a tabela MyTable3
      (
            StringID int nao nulo,
            Zero nvarchar de StringText (4000) não
      )
;
=========================
test1 - formulário da união, uma indicação grande (10000 umas disparadas), gerada using emendas below e algumas manuais

declarar o @i int @i=1 ajustado
quando o @i <� 10001="">começar
imprimir “selecionam “+right (@i, 10) +”, o ''' +convert de N (varchar (máximo), o newid ())+ união do '''”;
ajustar @i=@i+1
extremidade
=========================

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

Tempo - 7 minutes+, matados

=========================
test2 - união TODO O formulário
=========================

Tempo - mais rapidamente do que acima.  A SORTE DISTINTA não é exigida então.  A união no seus próprias faz um distinto

=========================
test3 - união TODO O formulário, 100 por o grupo, separado perto;
=========================

Tempo - mesmo mais rapidamente.  Cada grupo é cometido e não toma muito a manipulação no RAM.  Além disso, o optimizer da pergunta não passa muita hora em perguntas longas.  O tempo de QO vai acima exponencial para perguntas longas.

=========================
test4 - a tabela truncada, introduz outra vez (seguindo de test3 sem a restauração)
=========================

O tempo - mais rapidamente de 3. QO não tem que fazer nenhum planeamento, todas as 100 perguntas [da estática] que vêm do esconderijo da planta

=========================
test5 - using inserções parameterised. QO planeia somente uma inserção. Todas inserções restantes vão pela planta
Inserções geradas using

declarar o @i int @i=1 ajustado
quando o @i <� 101="">começar
imprimir “exec valores da inserção MyTable3 do sp_executesql N '' (@a, @a int do @b) '', N '', @b nvarchar (4000) '', @a='+ para a direita (@i, 10) +”, ''' +convert do @b=N (varchar (máximo), o newid ())+ '''';
ajustar @i=@i+1
extremidade
=========================

Tempo tomado - 6s! O mais rapidamente.

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

Conclusões

(1) o Optimizer da pergunta do usuário do Sql toma exponencial mais por muito tempo para compilar mais longo o texto da pergunta.

(2) os grandes blocos da inserção using a união ou os valores (), (), () testes padrões sentam-se em um MONTÃO na memória, a seguir dequeued do MONTÃO na inserção - mau.

(3) As perguntas Parameterized são boas.  Melhorar se você os trata em diz 10 inserções, mas cada inserção exigiria então (para o exemplo acima) 20 parâmetros na inserção de 10 grupos.

(4) ** nenhum teste acima, mas minha suposição ** Using um sp para a inserção, por exemplo @a do usp_insert, o @b que faz a inserção e seu certificado maioria é do formulário

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

ser tão rapidamente quanto as inserções Parameterized using o sp_executesql, porque um SP é compilado uma vez somente e re-used#.

# - que é a fonte de problemas sniffing do parâmetro….
Outras soluções  
 
programming4us programming4us