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

Откуда: Москва
Сообщений: 371
Здравствуйте.
Прошу помочь с пониманием механизмов того как происходит работа с View в MS SQL сервер при использовании скалярных функций.
Есть таблица имеющая колонку типа double. На основании значения этого столбца необходимо вычислить принадлежность величины к определенному градиенту. Это делается в скалярной функции. Сама функция вызывается в View. В итоге получаем View, содержащее значения из целевой таблице и вычисленное значения.
В приложении я использую LINQ TO SQL для доступа к данным. Выбираю ОДНО значение по определенным условиям (в условие не входит вычисляемое скалярной функцией значение).
Теперь сам вопрос - значение скалярной функции будет вычисляться для всех строк исходной таблицы и после этого будет произведен поиск строки удовлетворяющей условию или же значение функции будет вычисляться только один раз?
12 май 13, 18:09    [14284180]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
Old Nick
Member

Откуда: Санкт-Петербург
Сообщений: 3177
Homosum,

Запусти профилер и посмотри.
12 май 13, 22:23    [14284846]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
Homosum
Member

Откуда: Москва
Сообщений: 371
Old Nick,

Спасибо за совет.
Может у старших товарищей есть уже готовый мотивированный ответ.

Модератор: Тема перенесена из форума "Проектирование БД".


Сообщение было отредактировано: 12 май 13, 23:50
12 май 13, 22:46    [14284925]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Homosum
Теперь сам вопрос - значение скалярной функции будет вычисляться для всех строк исходной таблицы и после этого будет произведен поиск строки удовлетворяющей условию или же значение функции будет вычисляться только один раз?
Ответ на этот вопрос -- в реальном плане выполнения запроса.
13 май 13, 00:17    [14285180]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
Homosum
Теперь сам вопрос - значение скалярной функции будет вычисляться для всех строк исходной таблицы и после этого будет произведен поиск строки удовлетворяющей условию или же значение функции будет вычисляться только один раз?

Зависит от того, является ли скалярка deterministic (schema-bound).
13 май 13, 03:35    [14285521]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
aleks2
Guest
Сон Веры Павловны
Homosum
Теперь сам вопрос - значение скалярной функции будет вычисляться для всех строк исходной таблицы и после этого будет произведен поиск строки удовлетворяющей условию или же значение функции будет вычисляться только один раз?

Зависит от того, является ли скалярка deterministic (schema-bound).

Да ну? Врете ведь.
Homosum
Выбираю ОДНО значение по определенным условиям (в условие не входит вычисляемое скалярной функцией значение).
13 май 13, 06:56    [14285591]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
super-code
Member

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

в скалярную функцию вставьте insert в таблицу. После отработки ваших запросов, см. в таблице кол-во записей.
13 май 13, 11:27    [14286444]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
super-code
Homosum,

в скалярную функцию вставьте insert в таблицу. После отработки ваших запросов, см. в таблице кол-во записей.
Ну-ка ну-ка, с этого места поподробнее.
Хочу видеть скалярную функцию T-SQL со вставкой в таблицу!
13 май 13, 11:34    [14286500]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
iap
Хочу видеть скалярную функцию T-SQL со вставкой в таблицу!
Лехко
+ Функция со вставкой в таблицу
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4276.0 (X64)   Feb  8 2013 10:37:00   Copyright (c) Microsoft Corporation  Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
use tempdb;
go

if not exists(select * from sys.servers where name = N'TestLoopback')
 begin
  exec sp_addlinkedserver N'TestLoopback', N'', N'SQLNCLI', @@servername;
  exec sp_addlinkedsrvlogin N'TestLoopback', N'true';
 end;

create table dbo.TestTable (i int primary key, v int);
go

create function dbo.fnTest()
returns bigint
as
begin
 declare @result int;
 
 select
  @result = a
 from
  openquery(TestLoopback, 'select 1 as a; insert into tempdb.dbo.TestTable values(1, 2); if @@trancount > 0 commit;');
 
 return @result;
end;
go

begin tran;
select dbo.fnTest();
insert into tempdb.dbo.TestTable values(2, 3);
rollback;

select * from dbo.TestTable;
go

if exists(select * from sys.servers where name = N'TestLoopback')
 exec sp_dropserver N'TestLoopback';
go
 
drop function dbo.fnTest;
drop table dbo.TestTable;
go
Только практического смысла в этом никакого...
13 май 13, 14:26    [14287652]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Homosum,
VIEW - это по сути кусок текста, который подставляется в запрос.
Скалярка вызывается каждый раз как внешняя процедура - очень не эффективная вещь. Лучше не пользовться вообще.
У вас не должно быть ассоциации SQL c Си или иной императивщиной, здесь каждый запрос копилируется и оптимизируется, самое главное написать правильный смысл (ЧТО), а КАК оно будет фунчиклировать внутрях дело компилятора (он отбросит всё ненужное, вывернет наизнанку - лишь бы эффективно).
И чем больше вы дадите информации скулю тем эффективнее он будет делать планы запросов. Любое ограничение FK, CK, UQ может всё кардинально изменить.

Есть конечно некоторые нюансы, но это исключение из правил, но ещё и архитектура должна быть "правильной".

Homosum
LINQ
Фтопку.
14 май 13, 00:56    [14290271]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
Homosum
Member

Откуда: Москва
Сообщений: 371
Mnior
Homosum,
VIEW - это по сути кусок текста, который подставляется в запрос.
Скалярка вызывается каждый раз как внешняя процедура - очень не эффективная вещь. Лучше не пользовться вообще.
У вас не должно быть ассоциации SQL c Си или иной императивщиной, здесь каждый запрос копилируется и оптимизируется, самое главное написать правильный смысл (ЧТО), а КАК оно будет фунчиклировать внутрях дело компилятора (он отбросит всё ненужное, вывернет наизнанку - лишь бы эффективно).
И чем больше вы дадите информации скулю тем эффективнее он будет делать планы запросов. Любое ограничение FK, CK, UQ может всё кардинально изменить.

Есть конечно некоторые нюансы, но это исключение из правил, но ещё и архитектура должна быть "правильной".

Homosum
LINQ
Фтопку.


Спасибо. Я так понял что она вызывается каждый раз. А чем пользоваться вместо скалярной функции?
Насчет LINQ - что посоветуете использовать и самое главное почему?
14 май 13, 10:56    [14291103]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Homosum
Спасибо. Я так понял что она вызывается каждый раз. А чем пользоваться вместо скалярной функции?

если очень хочется, то табличной функцией. Inline table-valued Function
14 май 13, 11:00    [14291141]     Ответить | Цитировать Сообщить модератору
 Re: View и скалярная функция  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Мистер Хенки
если очень хочется, то табличной функцией. Inline table-valued Function
Обычно я (и не только) её называю "параметризованное представление".

Инструкция APPLY это вообще офигитительная весчь. Всё становится простым и понятным с ней.

Homosum
LINQ - что посоветуете использовать и самое главное почему?
Лучше всего это объяснит тот к уже наступил на эти грабли. (а их большинство, а не надо было доверять, MS первая кто обманет. Равняйтесь на Торвальдса)

Как я это воспринимаю:
Императивный код тяжелее контролировать, точнее бессмысленно. Он не формализован и там написано КАК.
В итоге, современное положение дел таково, что он очень не эффективный, всё выкатывается на том что он оперирует быстрыми микрокомандами и прямым доступом в память и всё такое. И вот, когда сие начинают отражать на доступ к удалённой базе, то тут надо выяпываться и решать, когда надо/не надо кешировать, обновлять, и какой набор данных можно не трогать и т.п. Стратегий можно придумать много, но для каждого случая оно не будет эффективным и давать кучу неприятных эффектов.
Нельзя (нереально) из КАК получить ЧТО, а вот наоборот - можно.

Все долбаются об одну и туже стену. Нельзя не прилагая усилий и не описывая смысл задачи, уходить от её формализации и получить результат. Нельзя набрать гуманитариев в техническую область поднять отрасль - она погрязнет в неэффективности. Вот так и тут.

Контролировать потоки данных необходимо как ни крути, и LINQ как раз этого не делает, скорее наоборот, он уменьшает барьер. А современный проггер без плети уже жить не может.
И с LINQ можно контролировать, но не каждый возьмётся это делать в его примитивах (задалбливает).
Получается что приходится два раза описывать один и тот же смысл.
Поэтому некоторые откатывают в "по старинке", хотя при этом переходят на "новые тяхнологии".

Но на топорных проектах вы это почти не почувствуете.

Другими словами.
Проблема не в LINQ, а в среде где он используется - в императивном языке.
Проблема в том, что многим не охота писать правильно, развивать LINQ, им хочется быстро написать и спихнуть.
А MS не может ничего развивать. На Open Source сейчас вся надежда.

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

Ссори за каламбур - мозг непроизвольно касается всех связанных весчей.
14 май 13, 16:41    [14294093]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить