powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
24 сообщений из 24, страница 1 из 1
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799052
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверняка не бывает такого, чтобы анализатор не понял этого, но...

Чего-то типа

select (a*b*c+d-e-f) r,
case
when (a*b*c+d-e-f) =0 then 1
when (a*b*c+d-e-f) >30 then 2
when log(a*b*c+d-e-f)<1 then 3
else 0 end
from aaaaaaa
where (a*b*c+d-e-f) >=0

даже не вопрос, чтобы не писать a*b*c+d-e-f каждый раз
а просто чтобы анализатор не сделал план с пятью вычислениями a*b*c+d-e-f

или только

select r,
case
when r=0 then 1
when r>30 then 2
when log(r)<1 then 3
else 0 end
from (
select a*b*c+d-e-f r
from aaaaaaa
)
where r>=0

?

в доке смотрел, так уж спрошу на всякий случай)
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799057
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kzn,

математические вычисления - не самое медленное, с чем можно столкнуться на сервере. Например, целочисленное произведение современный процессор выполняет за один такт.
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799063
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznНаверняка не бывает такого, чтобы анализатор не понял этого, но...Уверен, что оптимизатор в сиквеле даже не имеет оптимизирующего это блока, за ненадобностью.
Самому, конечно, нужно писать это по методу "или только", не для оптимизации, а для сокращения вероятности ошибок.
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799095
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kzn,

Думаю, это бессмысленно, ибо ресурсов жрет тысячные доли процента производительности
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799139
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще и планы одинаковые
ну может на этапе исполнения кэшируется

alexeyvgdklim.kznНаверняка не бывает такого, чтобы анализатор не понял этого, но...Уверен, что оптимизатор в сиквеле даже не имеет оптимизирующего это блока, за ненадобностью.
Самому, конечно, нужно писать это по методу "или только", не для оптимизации, а для сокращения вероятности ошибок.

что за метод "или только"?
разовьюсь)))
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799149
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznеще и планы одинаковые
ну может на этапе исполнения кэшируется

alexeyvgпропущено...
Уверен, что оптимизатор в сиквеле даже не имеет оптимизирующего это блока, за ненадобностью.
Самому, конечно, нужно писать это по методу "или только", не для оптимизации, а для сокращения вероятности ошибок.

что за метод "или только"?
разовьюсь)))

это метод из вашего сообщения
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799162
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznчто за метод "или только"?
разовьюсь)))
dklim.kznили только

select r,
case
when r=0 then 1
when r>30 then 2
when log(r)<1 then 3
else 0 end
from (
select a*b*c+d-e-f r
from aaaaaaa
)
where r>=0
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799174
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kzn,

переходите на ассемблер, или хотя бы на C++. Там эта тема будет более актуальна.
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799227
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КритикДумаю, это бессмысленно, ибо ресурсов жрет тысячные доли процента производительностиА вообще, посмотрел, разница заметная :-)

Возьмём такой пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select SUM(cast(c.id as float))
from (
	select top 1000000 c1.id 
	from syscolumns c1 
		cross join syscolumns c2
) c
go
select SUM(cast(c.id + c.id/2 + 3 - c.id * 3.14 + c.id as float))
from (
	select top 1000000 c1.id 
	from syscolumns c1 
		cross join syscolumns c2
) c

У меня разница (по CPU и Duration) между запросами стабильно в 2 раза.
Так что, наверное, оптимизация, про которую говорит автор, могла бы ускорить некоторые запросы в несколько раз.
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799230
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,
авторУ меня разница (по CPU и Duration) между запросами стабильно в 2 раза.

и всё это только приведение типов
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799241
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kzn,
Как правильно написали, просто чтобы исключить ошибки copy-paste можно использовать CROSS APPLY
Не умеет он оптимизировать, он на каждое выражение WHEN создает отдельную переменную, и даже можно дойти до лимита переменных, если использовать несколько последовательных CROSS APPLY с CASE внутри.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT 
  ss1.[r], 
  ss2.[c]
FROM 
  aaaaaaa t
  CROSS APPLY (
    SELECT [r] = t.[a]*t.[b]*t.[c] + t.[d] - t.[e] - t.[f]
  ) ss1
  CROSS APPLY (
    SELECT [c] = CASE 
      WHEN ss1.[r] = 0 THEN 1 
      WHEN ss1.[r] > 30 THEN 2 
      WHEN log( ss1.[r] ) < 1 THEN 3
      ELSE 0
    END
  ) ss2
WHERE
  ss1.[r] >= 0
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799389
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKalexeyvg,
авторУ меня разница (по CPU и Duration) между запросами стабильно в 2 раза.

и всё это только приведение типовДа, наверное, некорректный пример...
Вот, попробую так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select SUM(1 + f1), SUM(2 + f1), SUM(3 + f1)
from (
	select 1 + id1/2 + 3 - id2 * 3.14 + id2 as f1
	from (
		select top 1000000 cast(c1.id as float) as id1, cast(c2.id as float) as id2
		from syscolumns c1 
			cross join syscolumns c2
	) c
) c
go
select SUM(1 + f1), SUM(2 + f2), SUM(3 + f3)
from (
	select 1 + id1/2 + 3 - id2 * 3.14 + id2 as f1, 2 + id1/2 + 3 - id2 * 3.14 + id2 as f2, 3 + id1/2 + 3 - id2 * 3.14 + id2 as f3
	from (
		select top 1000000 cast(c1.id as float) as id1, cast(c2.id as float) as id2
		from syscolumns c1 
			cross join syscolumns c2
	) c
) c
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799691
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетительdklim.kznеще и планы одинаковые
ну может на этапе исполнения кэшируется

пропущено...


что за метод "или только"?
разовьюсь)))

это метод из вашего сообщения

)))

И знаете, что делается?
Не работает "или только".
Предикат считается отдельно.
А скаляр отдельно в другом пункте плана.

Я писал, что планы одинаковые в итоге.
Если только какой то оптимизатор дальше роляет.
Кэш процессора или менеджер исполнения какой-нибудь.
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799694
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.Евгенийdklim.kzn,

переходите на ассемблер, или хотя бы на C++. Там эта тема будет более актуальна.

Для моей задачи и sql подходит
На i7 время исполнения запооса по таблице с 1м записей то 0 то 1 мс, это годиться.

На С перейти сейчас можно с использованием oltp. Но кстати, пришлось отказаться от использования. Отключает параллелизм, и еще ограничения в запросах - в итоге неOLTP получается быстрее. И я не помню еще, отключается ли batch для колумнстор. В итоге оставил обычный запрос, но с таблицами, оптимизированными для памяти.

Про использование С интересно почитать. А именно в чем смысл от сервера тогда, какой вариант ускорения от С ?

Вообще часто можно ускорить запрос до нужного.
Основной запрос у меня считается только по свежим записям. Но для этого надо получить из последней записи максимаальный номер (не identity). Ключ по двум полям, и номер - второй. Поэтому отлично получилось по TOP брать вязкой с таблицей стационарных значений первого поля в ключе, а потом уже брать максимум из этих значений.
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799755
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznНа С перейти сейчас можно с использованием oltp. Но кстати, пришлось отказаться от использования. Отключает параллелизм, и еще ограничения в запросах - в итоге неOLTP получается быстрееВ смысле? OLTP - это оперативная обработка транзакций. Например, 1С. И вообще большинство БД.
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799792
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznПро использование С интересно почитать. А именно в чем смысл от сервера тогда, какой вариант ускорения от С ?
Не знаю, что вы поняли из моих слов.
Я говорил о том, что СУБД при выполнении sql-запроса нагружает процессоры множеством относительно простых действий (например, чтением страниц памяти, формированием рекордсета, обновлением статистики и т.д.) и некоторым количеством сложных (типа переключения контекста потока). По этой причине ваши пять вычислений - просто экономия на спичках. Если бы ваши 1 млн записей по 50 байт хранились в стандартной коллекции (любого компилируемого ЯВУ), то подобная вашей оптимизация могла ускорить работу с ней.
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799840
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgdklim.kznНа С перейти сейчас можно с использованием oltp. Но кстати, пришлось отказаться от использования. Отключает параллелизм, и еще ограничения в запросах - в итоге неOLTP получается быстрееВ смысле? OLTP - это оперативная обработка транзакций. Например, 1С. И вообще большинство БД.

OLTP-процедуры компилируются "в собственный код", в dll, через промежуточное формирование файлов на С.

Я не сомневаюсь,, что Вам это известно, но просто отмечаю, что если кому-то очень надо в С - велкам ту OLTP-процедуры )))
Толку на самом деле немного лично для меня пока в смысле применения для расчетов - обычные запросы быстрее
Но вот грядет написание триггера, он будет NC, может увижу разницу
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799842
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.Евгений,

ну да, похоже сервер не парится с этим
важнее отделить блок фильтрации от блока расчетов
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799874
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dklim.kznНаверняка не бывает такого, чтобы анализатор не понял этого, но...

Чего-то типа

select (a*b*c+d-e-f) r,
case
when (a*b*c+d-e-f) =0 then 1
when (a*b*c+d-e-f) >30 then 2
when log(a*b*c+d-e-f)<1 then 3
else 0 end
from aaaaaaa
where (a*b*c+d-e-f) >=0

в доке смотрел, так уж спрошу на всякий случай)

Легко!

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select t.n r, 
case 
when t.n =0 then 1 
when t.n >30 then 2 
when log(t.n)<1 then 3
else 0 end
from aaaaaaa a
	Cross apply(Values (a*b*c+d-e-f)) t(n)
where  t.n >=0



И, кстати:
Владислав Колосов dklim.kzn,
математические вычисления - не самое медленное, с чем можно столкнуться на сервере. Например, целочисленное произведение современный процессор выполняет за один такт.

Если один из компонентов - скалярка - всё совсем не радужно.
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799876
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznalexeyvgВ смысле? OLTP - это оперативная обработка транзакций. Например, 1С. И вообще большинство БД.

OLTP-процедуры компилируются "в собственный код", в dll, через промежуточное формирование файлов на С.

Я не сомневаюсь,, что Вам это известно, но просто отмечаю, что если кому-то очень надо в С - велкам ту OLTP-процедуры )))А, понятно.
Это называется Natively Compiled Stored Procedures .
А OLTP - это OnLine Transaction Processing
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799878
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznOLTP-процедуры компилируются "в собственный код", в dll, через промежуточное формирование файлов на С.Интересно, где вам попалась такая интерпретация этой аббревиатуры?
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39799894
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, мне тоже интересно. OLPT не диктует внутреннюю реализацию. Компиляция процедур в пи-код обусловлена использованием механики интерпретатора.
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39800590
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну у меня так скомпилировалось в собственный код)
мс добивались и добилась желаемого, наверное

впрочем, ничего страшного не вижу
наверное, если ms сделали что-то для чего-то - то можно "внутри мс" говорить и в таком варианте
если мс сделали отдельный вид процедур для использования в oltp-решениях, то ...

а так, конечно, у меня тоже oltp на несколько тысяч транзакций в секунду
и как минимум 3/4 будет пережевываться не nc-процедурой
но при этом в таблице, оптимизированной для памяти

однако, тоже вопрос спорный и пограничный - транзакции ли у меня)))
если расчеты делаются по каждой, но какие-то результаты генерируются только для единиц из них
...
Рейтинг: 0 / 0
Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
    #39800768
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznну у меня так скомпилировалось в собственный код)
мс добивались и добилась желаемого, наверное

впрочем, ничего страшного не вижу
наверное, если ms сделали что-то для чего-то - то можно "внутри мс" говорить и в таком варианте
если мс сделали отдельный вид процедур для использования в oltp-решениях, то ...

а так, конечно, у меня тоже oltp на несколько тысяч транзакций в секунду
и как минимум 3/4 будет пережевываться не nc-процедурой
но при этом в таблице, оптимизированной для памяти

однако, тоже вопрос спорный и пограничный - транзакции ли у меня)))
если расчеты делаются по каждой, но какие-то результаты генерируются только для единиц из нихЖесть
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли анализатору явно указать выражение, которое считать 1 раз, а дальше использовать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]