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

Откуда:
Сообщений: 12
Создаю таблицу такой командой:
CREATE TABLE RandomData(
	Number int NOT NULL
);

и заполняю её десятью миллионами случайных чисел (так надо по условию задачи):
DECLARE @p_Quantity int = 10000000;
DECLARE @p_MinValue int =1;
DECLARE @p_MaxValue int = 100000;

DECLARE @randomValue int;
DECLARE @interval int = @p_MaxValue - @p_MinValue;
DECLARE @i int =0;	
WHILE(@i<@p_Quantity)
	BEGIN
		SET @randomValue = @p_MinValue + CONVERT(int, (RAND()*@interval));
		INSERT INTO RandomData VALUES (@randomValue);
		SET @i=@i+1;	
	END;

На локальной машине операция выполняется почти полтора часа :(

Можно ли как-то оптимизировать процесс генерации случайных чисел и записи их в таблицу?
7 июл 09, 17:14    [7387878]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать операцию заполнения таблицы случайными числами?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31182
Айкон
Можно ли как-то оптимизировать процесс генерации случайных чисел и записи их в таблицу?
в транзакцию оберните
7 июл 09, 17:19    [7387916]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать операцию заполнения таблицы случайными числами?  [new]
Айкон
Member

Откуда:
Сообщений: 12
alexeyvg
в транзакцию оберните

Супер! Спасибо!
7 июл 09, 17:25    [7387978]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать операцию заполнения таблицы случайными числами?  [new]
aleks2
Guest
Айкон,
Сделав так, можно сэкономить полчаса

DECLARE @i int =@p_Quantity;	
WHILE(@i>0)
	BEGIN
		INSERT INTO RandomData VALUES (@p_MinValue + (RAND()*@interval));
		SET @i=@i-1;	
	END;
7 июл 09, 18:45    [7388438]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать операцию заполнения таблицы случайными числами?  [new]
GlebZ
Member

Откуда: USA
Сообщений: 284
А покопать в этом направлении:
CREATE TABLE #RandomData(
	Number int NOT NULL
);
DECLARE @i int
INSERT #RandomData SELECT abs(CHECKSUM(NEWID()))
SET @i=1
 WHILE(@i<10000000)
BEGIN 
	INSERT #RandomData 
	SELECT abs(CHECKSUM(NEWID())) FROM #RandomData
	except 
	SELECT * FROM #RandomData
        SET @i=@i + @@Rowcount
END
?
Водку? Водку - буду!
7 июл 09, 19:45    [7388589]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать операцию заполнения таблицы случайными числами?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31182
Айкон
alexeyvg
в транзакцию оберните

Супер! Спасибо!
Пожалуйста.

Ещё вариант:
create view vrand as select rand() as r
go
DECLARE @p_Quantity int = 10000000;
DECLARE @p_MinValue int =1;
DECLARE @p_MaxValue int = 100000;

DECLARE @interval int = @p_MaxValue - @p_MinValue;

INSERT INTO RandomData
select top (@p_Quantity) @p_MinValue + CONVERT(int, ( r * @interval))
from vrand
    cross join sysobjects o1
    cross join sysobjects o2
    cross join sysobjects o3
8 июл 09, 10:27    [7389856]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать операцию заполнения таблицы случайными числами?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
alexeyvg
Айкон
alexeyvg
в транзакцию оберните

Супер! Спасибо!
Пожалуйста.

Ещё вариант:
create view vrand as select rand() as r
go
DECLARE @p_Quantity int = 10000000;
DECLARE @p_MinValue int =1;
DECLARE @p_MaxValue int = 100000;

DECLARE @interval int = @p_MaxValue - @p_MinValue;

INSERT INTO RandomData
select top (@p_Quantity) @p_MinValue + CONVERT(int, ( r * @interval))
from vrand
    cross join sysobjects o1
    cross join sysobjects o2
    cross join sysobjects o3
А Вы сами это пробовали?
IMHO, надо ещё функцию замутить:
create view vrand as select rand() as r
go
create function dbo.frand() returns float as begin return (select r from vrand) end
go
DECLARE @p_Quantity int = 10000000;
DECLARE @p_MinValue int =1;
DECLARE @p_MaxValue int = 100000;

DECLARE @interval int = @p_MaxValue - @p_MinValue;

INSERT INTO RandomData
select top (@p_Quantity) @p_MinValue + CONVERT(int, ( dbo.frand() * @interval))
from sysobjects o1
    cross join sysobjects o2
    cross join sysobjects o3
8 июл 09, 10:47    [7389989]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать операцию заполнения таблицы случайными числами?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31182
iap
А Вы сами это пробовали?
IMHO, надо ещё функцию замутить:
Вроде раньше прокатывало :-(
8 июл 09, 11:29    [7390277]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить