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

Откуда:
Сообщений: 18
MSSQL 2005 Express
Очень простая операция, нужно создать временную таблицу с 5000 целыми значениями.
Но в зависимости от скрипта заполнения сервер или вообще не требует памяти, либо скачок в потреблении очень большой.
В конце приведены два примера. Оба сценария делают одно и тоже.

Выполнение первого практически не даёт всплеска потребления памяти сервером, до начала 22 Мб, после 22,5 Мб. Время выполнения 0 сек.
При выполнении второго примера есть сильный скачок в потреблении, до 22, после 240. Время выполнения 15 сек.
С чем это связано, и как избавтся?
В ПО таблица создаётся во внешней программе, запросы с инсертами идут на сервер через АДО.
GO
DROP TABLE _test_table


CREATE TABLE _test_table ( i int )

DECLARE @i int

SET @i = 0
	

WHILE @i < 5000
BEGIN
	INSERT INTO _test_table (i) VALUES( @i )
	SET @i = @i + 1
END

GO

Пример 2
DROP TABLE _test_table
CREATE TABLE _test_table ( i int )
INSERT INTO _test_table ( i ) VALUES( 0)
INSERT INTO _test_table ( i ) VALUES( 1)
INSERT INTO _test_table ( i ) VALUES( 2)
INSERT INTO _test_table ( i ) VALUES( 3)
INSERT INTO _test_table ( i ) VALUES( 4)
INSERT INTO _test_table ( i ) VALUES( 5)
INSERT INTO _test_table ( i ) VALUES( 6)
INSERT INTO _test_table ( i ) VALUES( 7)
INSERT INTO _test_table ( i ) VALUES( 8)
INSERT INTO _test_table ( i ) VALUES( 9)
INSERT INTO _test_table ( i ) VALUES( 10)
INSERT INTO _test_table ( i ) VALUES( 11)
INSERT INTO _test_table ( i ) VALUES( 12)
INSERT INTO _test_table ( i ) VALUES( 13)
INSERT INTO _test_table ( i ) VALUES( 14)
INSERT INTO _test_table ( i ) VALUES( 15)
INSERT INTO _test_table ( i ) VALUES( 16)
INSERT INTO _test_table ( i ) VALUES( 17)
INSERT INTO _test_table ( i ) VALUES( 18)
INSERT INTO _test_table ( i ) VALUES( 19)
INSERT INTO _test_table ( i ) VALUES( 20)
INSERT INTO _test_table ( i ) VALUES( 21)
INSERT INTO _test_table ( i ) VALUES( 22)
INSERT INTO _test_table ( i ) VALUES( 23)
INSERT INTO _test_table ( i ) VALUES( 24)
………………….
INSERT INTO _test_table ( i ) VALUES( 4999)
23 июн 13, 13:54    [14470315]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2005 Express: Не понятно почему настолько разное выполнение сценариев  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Сервер сначала компилирует полученный батч, а потом его выполняет. Как вы думаете на компиляцию батча из 10 строк и из 5000 будет затрачено одинаковое количество ресурсов?
В общем, включите statistics time и смотрите на результат.
23 июн 13, 14:46    [14470384]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2005 Express: Не понятно почему настолько разное выполнение сценариев  [new]
max_alus
Member

Откуда:
Сообщений: 18
invm
Сервер сначала компилирует полученный батч, а потом его выполняет. Как вы думаете на компиляцию батча из 10 строк и из 5000 будет затрачено одинаковое количество ресурсов?
В общем, включите statistics time и смотрите на результат.


О, спасибище огромное!
Так всё летает.
DROP TABLE _test_table
CREATE TABLE _test_table ( i int )   BEGIN TRANSACTION 
INSERT INTO _test_table ( i ) VALUES( 0)
INSERT INTO _test_table ( i ) VALUES( 1)
INSERT INTO _test_table ( i ) VALUES( 2)
INSERT INTO _test_table ( i ) VALUES( 3)
INSERT INTO _test_table ( i ) VALUES( 4)
INSERT INTO _test_table ( i ) VALUES( 5)
INSERT INTO _test_table ( i ) VALUES( 6)
INSERT INTO _test_table ( i ) VALUES( 7)
INSERT INTO _test_table ( i ) VALUES( 8)
GO
INSERT INTO _test_table ( i ) VALUES( 9)
INSERT INTO _test_table ( i ) VALUES( 10)
INSERT INTO _test_table ( i ) VALUES( 11)
INSERT INTO _test_table ( i ) VALUES( 12)
INSERT INTO _test_table ( i ) VALUES( 13)
INSERT INTO _test_table ( i ) VALUES( 14)
INSERT INTO _test_table ( i ) VALUES( 15)
INSERT INTO _test_table ( i ) VALUES( 16)
INSERT INTO _test_table ( i ) VALUES( 17)
INSERT INTO _test_table ( i ) VALUES( 18)
.................
23 июн 13, 14:51    [14470388]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2005 Express: Не понятно почему настолько разное выполнение сценариев  [new]
max_alus
Member

Откуда:
Сообщений: 18
[quot max_alus]
invm
DROP TABLE _test_table
CREATE TABLE _test_table ( i int )   BEGIN TRANSACTION 


BEGIN TRANSACTION - остаток эксперимента, на скорость в данном случае не влияет.
23 июн 13, 14:52    [14470391]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2005 Express: Не понятно почему настолько разное выполнение сценариев  [new]
max_alus
Member

Откуда:
Сообщений: 18
В продолжении темы...
сравниваю заливку данных в постоянную таблицу и временную. сценарии, находятся в конце сообщения.

первый для 5000 записей выполняется 0 секунд, скачёк памяти минимальный.
второй выполняется 1 секунду и скачок памяти 130 Мб.

Файл профилера для 1го случая:
http://cs418624.vk.me/v418624129/678d/MlHm9eBMfb8.jpg
для 2го:
http://cs418624.vk.me/v418624129/6796/s98xz2GlQpY.jpg
Почему такое различие?
Скачок памяти сам по себе не страшен, но когда не 5000 а 50000 там разница значительно более сильная.

Мне нужно создавать временную таблицу перед получением отчёта, таблица как раз и содержит id объектов. Подскажите, что я делаю не так?)
CREATE TABLE _test_table ( i int ) 
INSERT INTO _test_table ( i ) VALUES( 0)
INSERT INTO _test_table ( i ) VALUES( 1)
INSERT INTO _test_table ( i ) VALUES( 2)
INSERT INTO _test_table ( i ) VALUES( 3)
INSERT INTO _test_table ( i ) VALUES( 4)
INSERT INTO _test_table ( i ) VALUES( 5)
INSERT INTO _test_table ( i ) VALUES( 6)
INSERT INTO _test_table ( i ) VALUES( 7)
INSERT INTO _test_table ( i ) VALUES( 8)
GO
INSERT INTO _test_table ( i ) VALUES( 9)
INSERT INTO _test_table ( i ) VALUES( 10)
INSERT INTO _test_table ( i ) VALUES( 11)
INSERT INTO _test_table ( i ) VALUES( 12)
INSERT INTO _test_table ( i ) VALUES( 13)
INSERT INTO _test_table ( i ) VALUES( 14)
INSERT INTO _test_table ( i ) VALUES( 15)
INSERT INTO _test_table ( i ) VALUES( 16)
INSERT INTO _test_table ( i ) VALUES( 17)
INSERT INTO _test_table ( i ) VALUES( 18)
GO
INSERT INTO _test_table ( i ) VALUES( 19)
и т.д.


DROP TABLE #_test_table
CREATE TABLE #_test_table ( i int ) 
INSERT INTO #_test_table ( i ) VALUES( 0)
INSERT INTO #_test_table ( i ) VALUES( 1)
INSERT INTO #_test_table ( i ) VALUES( 2)
INSERT INTO #_test_table ( i ) VALUES( 3)
INSERT INTO #_test_table ( i ) VALUES( 4)
INSERT INTO #_test_table ( i ) VALUES( 5)
INSERT INTO #_test_table ( i ) VALUES( 6)
INSERT INTO #_test_table ( i ) VALUES( 7)
INSERT INTO #_test_table ( i ) VALUES( 8)
GO
INSERT INTO #_test_table ( i ) VALUES( 9)
INSERT INTO #_test_table ( i ) VALUES( 10)
INSERT INTO #_test_table ( i ) VALUES( 11)
INSERT INTO #_test_table ( i ) VALUES( 12)
INSERT INTO #_test_table ( i ) VALUES( 13)
INSERT INTO #_test_table ( i ) VALUES( 14)
INSERT INTO #_test_table ( i ) VALUES( 15)
INSERT INTO #_test_table ( i ) VALUES( 16)
INSERT INTO #_test_table ( i ) VALUES( 17)
INSERT INTO #_test_table ( i ) VALUES( 18)
GO
и т.д.
23 июн 13, 17:16    [14470638]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2005 Express: Не понятно почему настолько разное выполнение сценариев  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
max_alus
BEGIN TRANSACTION - остаток эксперимента, на скорость в данном случае не влияет.
Как раз очень сильно должно влиять, с BEGIN TRANSACTION будет быстрее.
23 июн 13, 19:40    [14470844]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2005 Express: Не понятно почему настолько разное выполнение сценариев  [new]
Ennor Tiegael
Member

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

INSERT - дорогая операция, их должно быть как можно меньше. Можете вставить больше одной строки за раз - обязательно пользуйтесь этой возможностью.

В вашем случае проще всего так:
insert into test_table (Id)
select row_number() over(order by (select null)) from (
  select top (5000) 0 as [Id] from master.dbo.spt_values, master.dbo.spt_values
) sq;
24 июн 13, 02:45    [14471591]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2005 Express: Не понятно почему настолько разное выполнение сценариев  [new]
max_alus
Member

Откуда:
Сообщений: 18
Спасибо за ответы и советы.

Почему такие отличия при работе с временной таблицей я не понял, попробую на другом экземпляре сервера.
25 июн 13, 11:11    [14478433]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить