Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Кто тормозит: я или сервер?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1107
Может ли кто объяснить, почему SELECT INTO #TEMP_TABLE (*2) выполняется значительно медленне чем просто SELECT (*1)?

Ниже пример, где количество Element1 сокращено до 3.
В моём случае количество Element1 около 20000.
SELECT INTO так тормозит, что оказалось проще сгенерить скрипт для инсерта.

declare @xml xml
select @xml = 
'<RootElement>
  <Element1>
    <NR1>00001</NR1>
    <TXT>Hallo1</TXT>
    <NR2>00001</NR2>
  </Element1>
  <Element1>
    <NR1>00002</NR1>
    <TXT>Hallo2</TXT>
    <NR2>00002</NR2>
  </Element1>
  <Element1>
    <NR1>00003</NR1>
    <TXT>Hallo2</TXT>
    <NR2>00003</NR2>
  </Element1>
</RootElement>'


--*1 (Быстро)
SELECT 
t1.Col.value('NR1[1]', 'int') C1,
t1.Col.value('TXT[1]', 'varchar(50)') C2,
t1.Col.value('NR2[1]', 'int') C3
FROM @xml.nodes('//Element1') t1(col);

--*2 (Ну очень меленно)
SELECT 
t1.Col.value('NR1[1]', 'int') C1,
t1.Col.value('TXT[1]', 'varchar(50)') C2,
t1.Col.value('NR2[1]', 'int') C3 INTO #TEMP_TABLE  
FROM @xml.nodes('//Element1') t1(col);

select @@version: Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86)   Feb  9 2007 22:47:07   Copyright (c) 1988-2005 Microsoft Corporation  Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3) 
8 июн 09, 14:25    [7276614]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5189
Alexander Us

--*2 (Ну очень меленно)
SELECT 
t1.Col.value('NR1[1]', 'int') C1,
t1.Col.value('TXT[1]', 'varchar(50)') C2,
t1.Col.value('NR2[1]', 'int') C3 INTO #TEMP_TABLE  
FROM @xml.nodes('//Element1') t1(col);
[/src]


а так ?


SELECT 
t1.Col.value('NR1[1]', 'int') C1,
t1.Col.value('TXT[1]', 'varchar(50)') C2,
t1.Col.value('NR2[1]', 'int') C3 INTO #TEMP_TABLE  
FROM @xml.nodes('//Element1') t1(col) where 1=0;

insert into #TEMP_TABLE (C1,C2,C3)
SELECT 
t1.Col.value('NR1[1]', 'int') C1,
t1.Col.value('TXT[1]', 'varchar(50)') C2,
t1.Col.value('NR2[1]', 'int') C3
FROM @xml.nodes('//Element1') t1(col);
8 июн 09, 14:31    [7276655]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1107
komrad,

После 20 минут прервал выполнение
8 июн 09, 14:58    [7276843]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
create table...
insert into...

для спящего время бодрствования равносильно сну
8 июн 09, 15:49    [7277172]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1107
[quot Алексей2003]
create table...
insert into...
это и так понятно: речь идёт о тормозах а не ошибке при выполнении.
8 июн 09, 16:26    [7277420]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5189
Alexander Us,

сам селект то быстро отрабатывает?
8 июн 09, 16:27    [7277429]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1107
komrad,

Да, быстро.
8 июн 09, 18:37    [7278148]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Alois
Member

Откуда:
Сообщений: 354
Проблему решили?
Кажется, что tempdb лежит где-то на медленном накопителе или на нем выключено кэширование.
9 июн 09, 16:50    [7282090]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5189
Alois
Проблему решили?
Кажется, что tempdb лежит где-то на медленном накопителе или на нем выключено кэширование.

или диск сбоит
или нагрузка на темпдб большая
или рейд перестраивается
или, или, или ...

вариантов много, информации мало
9 июн 09, 17:04    [7282180]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2Alexander Us
помоему вы не поняли.
вместо
select .... from ... into ...
использовать консктрукцию, что я написал выше (БЕЗ INTO).

для спящего время бодрствования равносильно сну
9 июн 09, 17:32    [7282397]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
дописал select getdate() в начало и в конец теста. вывел версию. получил:

Microsoft SQL Server 2005 - 9.00.4035.00 (X64)
Nov 24 2008 16:17:31
Copyright (c) 1988-2005 Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)


2009-06-09 19:28:49.407
2009-06-09 19:28:49.413

то есть 6 ms на все про все. для 2008:

Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64)
Mar 29 2009 10:11:52
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2)

2009-06-09 19:29:34.157
2009-06-09 19:29:34.160

для 2000 не проверяю
9 июн 09, 20:30    [7283135]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1107
Crimean,
Вы не обратили внимание: речь шла о 30000 елементах.

Наглядно продемонстрировать проблему поможет скрипт с 5000 элементами.
--Шаг1: Запаолняем таблицу:
create table #VALS(NR1 int, TXT varchar(10), NR2 int); declare @i int; set @i=1;
while @i <= 5000 begin; insert #VALS select @i, 'Hallo' + cast(@i as varchar(10)), @i ;set @i=@i+1; end;
GO


--Шаг2:  Вариатнт без инсерта: (быстро)
declare @xml xml; set @xml = (select * from #VALS for XML RAW('Element1'), ELEMENTS, ROOT('RootElement'));
SELECT 
t1.Col.value('NR1[1]', 'int') C1,
t1.Col.value('TXT[1]', 'varchar(50)') C2,
t1.Col.value('NR2[1]', 'int') C3
FROM @xml.nodes('//Element1') t1(col);
GO

--Шаг3: Вариатнт с инсертом: (ну очень медленно) 
declare @xml xml; set @xml = (select * from #VALS for XML RAW('Element1'), ELEMENTS, ROOT('RootElement'));
SELECT 
t1.Col.value('NR1[1]', 'int') C1,
t1.Col.value('TXT[1]', 'varchar(50)') C2,
t1.Col.value('NR2[1]', 'int') C3 INTO #TEMP_TABLE  
FROM @xml.nodes('//Element1') t1(col);

Внимание вопрос: почему?
9 июн 09, 23:36    [7283481]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Crimean,
> Вы не обратили внимание: речь шла о 30000 елементах.
>
> Наглядно продемонстрировать проблему поможет скрипт с 5000 элементами.

у меня даже с 30000 оба варианта примерно одинаковое время занимают: ~2400мс

Microsoft SQL Server 2005 - 9.00.4035.00 (X64) Nov 24 2008 16:17:31 Copyright (c) 1988-2005 Microsoft Corporation
Developer Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)

Posted via ActualForum NNTP Server 1.4

10 июн 09, 09:03    [7283882]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
*ворчливо* примеры бы не такие кривые писали - глядишь и проблем бы поубавилось
дописал set nocount on в начало
дописал drop table #VALS; drop table #TEMP_TABLE в конец
запустил на 2005

2009-06-10 09:44:12.113
2009-06-10 09:44:12.680
что ~ 500

2009-06-10 09:44:12.713
2009-06-10 09:44:13.273
что ~ 500

где разница?

на 2008

2009-06-10 09:45:37.480
2009-06-10 09:45:37.980

2009-06-10 09:45:38.010
2009-06-10 09:45:38.510

посчитаете сами?
10 июн 09, 10:46    [7284328]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1107
Crimean,
А можно узнать Вашу
select @@version
10 июн 09, 12:07    [7284952]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1107
daw,
Спасибо за инфу.
10 июн 09, 12:08    [7284962]     Ответить | Цитировать Сообщить модератору
 Re: Кто тормозит: я или сервер?  [new]
Alexander Us
Member

Откуда:
Сообщений: 1107
Alexander Us
Crimean,
А можно узнать Вашу
select @@version

Пардон, это выше написано...
10 июн 09, 12:10    [7284978]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить