Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 SET vs SELECT  [new]
Vladimir Kozloff
Member

Откуда:
Сообщений: 32
Уважаемые коллеги,

в MSSQL2000 для присвоения значений переменным можно использовать как SET так и SELECT, и вот возник вопрос:

SELECT @AmtLEI=@LeftUSD*@Rate, @NewSaldoUSD=@OldSaldoUSD-@LeftUSD

или

SET @AmtLEI=@LeftUSD*@Rate
SET @NewSaldoUSD=@OldSaldoUSD-@LeftUSD

- что быстрее? Скрипт огромный, выполняется >12 часов, и в нем такие присваивания в общей сложности будут выполняться около 600000 раз. Поэтому скорость собираю буквально по крупицам. Просветите по быстродействию сабжевых операторов :)
11 авг 03, 20:21    [296458]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
Как-то Людовик XIV пришел в Академию наук (или что в то время во Франции было) и спросил своих ученых:
- А почему бокал с Шампанским звенит дольше чем с Бургунским?
Один ученый не растерялся и ответил:
- К сожалению, на выделяемые средства нам мы не в состоянии ставить подобные опыты.

Я к тому что я например никогда не задумывался на эту тему, т.к. не делал никогда такие циклы. Но в любом случае цикл который выполняется 600000 будет работать медленно и лучше бы подумать как от него избавиться. Если никак - попробуйте и так и так и сообщите нам результаты опытов.
11 авг 03, 20:42    [296466]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
Smile
Member

Откуда:
Сообщений: 1148
а если и быстрее, править ручками будете все 600000 раз или автоматизируете правку??
простите за иронию
11 авг 03, 20:47    [296470]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
Vladimir Kozloff
Member

Откуда:
Сообщений: 32
Избавиться от цикла никак - на нем весь алгоритм строится. Точнее, там 2 вложенных цикла - один повторяется раз 30000, у него внутри транзакция которая тоже трясет кучу записей. Перетрясать нужно каждый месяц, и накопительные таблицы тоже мало чем помогут...
11 авг 03, 20:49    [296472]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
Vladimir Kozloff
Member

Откуда:
Сообщений: 32
2 Smile: их в процедуре всего штук 12. Проблема в том, что эта процедура вызывается в цикле очень много раз.
11 авг 03, 20:50    [296474]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
МуМу
Guest
У меня тоже иногда возникает соблазн задавать такие вопросы но внутренне я понимаю что все это от лени:)

Чтобы выяснить ответ на твой вопрос достаточно 5 мин твоего времени и 5 мин серверного.:)
11 авг 03, 20:55    [296476]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Я не нашел разницы.
11 авг 03, 22:12    [296501]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
vdimas
Member

Откуда: Севастополь
Сообщений: 1147
Сама микрософт рекомендует по возможности использовать set
12 авг 03, 01:30    [296539]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
Vladimir Kozloff
Member

Откуда:
Сообщений: 32
DECLARE @d1 DATETIME,@d2 DATETIME,@d3 DATETIME
DECLARE @i INT,@k INT

SET @d1=GETDATE()
SELECT @k=100000,@i=0
WHILE @k>0 BEGIN
SELECT @k=@k-1,@i=@i+1
END
SET @d2=GETDATE()
SELECT @k=100000,@i=0
WHILE @k>0 BEGIN
SET @k=@k-1
SET @i=@i+1
END
SET @d3=GETDATE()
SELECT DATEDIFF(ms,@d1,@d2),DATEDIFF(ms,@d2,@d3)

Результат:

22170 39820

Итак, MS рекомендует использовать SET ? ))))))))))
12 авг 03, 09:01    [296641]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Vladimir Kozloff, и зачем топик завел, если сам разобрался?
12 авг 03, 09:22    [296670]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
Vladimir Kozloff
Member

Откуда:
Сообщений: 32
tpg: Думал, может есть какие подводные камни, о которых я не знаю, а народ знает :))
12 авг 03, 09:36    [296692]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
хъъ
Guest
С точки зрения ADO, каждый SELECT в процедуре - это отдельный рекодсет, доступный через NextRecordset. Set отдельных рекодсетов не создает, и по идее не должно занимать память и выполняться быстрей. Оказываеться нет. Бля!
12 авг 03, 09:40    [296699]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Кстати, а что так медленно? У меня даже миллионные цыклы на каком то 800 МГц дуроне отрабатывают в разы быстрее!
12 авг 03, 09:47    [296714]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
snake
Member

Откуда: Russia, Penza
Сообщений: 2290
ага
12 авг 03, 09:47    [296715]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
кам
Guest
2 хъъ

С точки зрения ADO, каждый SELECT в процедуре - это отдельный рекодсет, доступный через NextRecordset. Set отдельных рекодсетов не создает, и по идее не должно занимать память и выполняться быстрей

Никаких рекордсетов нет, конечно, ни в том, ни в другом случае.
И время выполнения отдельного SET и отдельного SELECT равны.
Вот почему время выполнения SELECT с одним выражением равно времени выполнения SELECT с двумя выражениеми ?
12 авг 03, 09:51    [296725]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
Vladimir Kozloff
Member

Откуда:
Сообщений: 32
кам: Не равно. Select с двумя выражениями выполняется медленнее, чем с одним. но SELECT с двумя выражениями выполняется явно быстрее, чем 2 SET-а по одному выражению. На трех выражениях разница еще заметнее. Итак, для множественных присвоений SELECT явно шустрее.
12 авг 03, 10:02    [296748]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
хъъ
Guest
2кам
>Никаких рекордсетов нет, конечно, ни в том, ни в другом случае.

Есть в случае Select. И это легко проверить


CREATE PROCEDURE [dbo].[xp_set_select] AS

Declare @t1 int
Declare @t2 int

select @t1=1500, @t2=9999
Select @t1, @t2
Select 6890, N'qwerty'



Public Sub dfeee()
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Set cnn = New ADODB.Connection
cnn.ConnectionString = "бла-бла"

cnn.Open

Set rs = New ADODB.Recordset
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = cnn
With cmd
.CommandText = "dbo.xp_set_select"
.CommandType = adCmdStoredProc
rs.Open cmd
End With


Debug.Print rs.GetString 'Первый рекодсет
Set rs = rs.NextRecordset
Debug.Print rs.GetString '
Второй рекодсет

End Sub


Убираем из ХП Select и уже нет ни одного рекодсета.

Так что - рекодсеты есть, они должны занимать память. Т.е. более активно использовать ресурся, а значит и работаь медленней, а это не так :(
12 авг 03, 10:14    [296772]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
ale-805
Member

Откуда: Питер
Сообщений: 670
Мне кажется, что ответ на вопрос кроется все-таки в количестве присвоений, т.к. для
DECLARE @d1 DATETIME,@d2 DATETIME,@d3 DATETIME
DECLARE @i INT,@k INT

SET @d1=GETDATE()
SELECT @k=100000,@i=0
WHILE @k>0 BEGIN

SELECT @k=@k-1
SELECT @i=@i+1

END
SET @d2=GETDATE()
SELECT @k=100000,@i=0
WHILE @k>0 BEGIN
SET @k=@k-1
SET @i=@i+1
END
SET @d3=GETDATE()
SELECT DATEDIFF(ms,@d1,@d2),DATEDIFF(ms,@d2,@d3)

время выполнения селектов и сетов примерно равно (иногда даже первое значение больше). А если 3 и т.д.? Соотвественно, если нужно присвоить значение одной переменной, то разницы нет, а если выбирать между множественным селектом или повторениями сетов, то, безусловно, селект. Всё это глубокое имхо.
12 авг 03, 10:58    [296838]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
кам
Guest
2 Vladimir Kozloff

Select с двумя выражениями выполняется медленнее, чем с одним. но SELECT с двумя выражениями выполняется явно быстрее, чем 2 SET-а по одному выражению.

На приведенном примере и моем сервере разница лежит в пределах погрешности измерения.

2 хъъ

При присвоении локальным переменным никаких рекордсетов быть не может.
Что и показал твой код - 3 селекта и 2 рекордсета.
12 авг 03, 11:31    [296920]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
хъъ
Guest
2кам
>При присвоении локальным переменным никаких рекордсетов быть не может.
Что и показал твой код - 3 селекта и 2 рекордсета.

Ну да. Ошибся. Буду знать. Фэнкс
12 авг 03, 11:36    [296932]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
хъъ
Guest
2кам
>При присвоении локальным переменным никаких рекордсетов быть не может.
Что и показал твой код - 3 селекта и 2 рекордсета.

Ну да. Ошибся. Буду знать. Фэнкс
12 авг 03, 11:36    [296933]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: SET vs SELECT  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Случайно наткунулся на топик.

По теме - "лучше" использовать SET и не слушать вот этого уважаемого человека:

Crimean
Я не нашел разницы.


:)


А теперь по делу: пару лет назад наткнулся на такой вот нелепый финт: если использовать SET VS SELECT в цикле (курсоре), при условии, что этот SET или SELECT выполняют запрос с возвратом одного значения, то SELECT работает с "опозданием", если это SELECT вернет нам NULL.

Примеры: сравните результаты двух циклов:

DECLARE @i int, @s sysname
SET @i = 0

WHILE (@i < 5)
BEGIN
	SELECT @s
	
	SET @s = 'sample'
	IF @i = 0
		SELECT @s = [NAME] FROM sys.databases WHERE 0 = 1

    SET @I = @I + 1
END

DECLARE @i int, @s sysname
SET @i = 0

WHILE (@i < 5)
BEGIN
	SELECT @s
	
	SET @s = 'sample'
	IF @i = 0
		SET @s = (SELECT [NAME] FROM sys.databases WHERE 0 = 1)

    SET @I = @I + 1
END

В первом случае получаем:

NULL
sample
sample
sample
sample

Во втором:

NULL
NULL
sample
sample
sample

Тем самым, мы видим эффект запаздывания. Нигде в документации подобного поведения я не нашел, буду признательным, если знающие люди ткнут пальцем.

P.S. Если баян - сорри, если фича - благодарности принимаются
17 ноя 09, 22:47    [7942325]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
iljy
Member

Откуда:
Сообщений: 8711
МСУ,

это даже не баян, это хуже.
BOL- SELECT @local_variable (Transact-SQL)

Для назначения переменных рекомендуется использовать SET @local_variable вместо SELECT @local_variable.

Если инструкция SELECT не возвращает ни одной строки, переменная сохраняет свое текущее значение.
17 ноя 09, 23:39    [7942435]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
Влом регистрироваться
Guest
МСУ,

это не "эффект запаздывания" (паржал), а обычная безграмотность!
18 ноя 09, 07:39    [7942802]     Ответить | Цитировать Сообщить модератору
 Re: SET vs SELECT  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Что-то не понял. Присвоение @s происходит перед if и в самом if, но только в первый раз.
Зачем же здесь цикл? При @i>0 всегда видим просто результат set @s='sample'
А про @i=0 уже написали...
18 ноя 09, 09:03    [7942940]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить