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

Откуда:
Сообщений: 69
При подключении в запрос
SELECT a.pid FROM (...) a INNER JOIN ksn.Persons p ON a.pid = p.pid
представления

CREATE VIEW ksn.Persons
AS
    SELECT
        MemberID pid, LastName last, FirstName first, MiddleName middle,
        ksn.Name(LastName, FirstName, MiddleName) name
    FROM dbo.Member

(dbo.Member.MemberID - PK) ломается его параллельное выполнение; при подключении непосредственно таблицы
SELECT a.pid FROM (...) a INNER JOIN dbo.Member p ON a.pid = p.MemberID
всё ок, запрос выполняется "параллельно"; т.е. проблема, видимо в scalar ufn ksn.Name

Сама функция

CREATE FUNCTION ksn.Name(@last VARCHAR(24), @first VARCHAR(24), @middle VARCHAR(24))
RETURNS VARCHAR(74)
WITH SCHEMABINDING
BEGIN
    RETURN CASE
            WHEN @last IS NOT NULL THEN
                LTRIM(RTRIM(RTRIM(RTRIM(ISNULL(@last, '')) + ' ' +
                    LTRIM(ISNULL(@first, ''))) + ' ' + LTRIM(ISNULL(@middle,''))))
            ELSE NULL
        END
END

IsDeterministic=1, IsPrecise=1, IsSystemVerified=1 и не используется в результатах основного запроса (т.е., имхо, при выполнении запроса достаточно просто пробежаться по PK dbo.Member.MemberID и оставить записи a, которые в нем есть).

Куда копать, чтобы параллельное выполнение запроса не слетало? MSSQL 2005 Enterprise
30 май 11, 18:19    [10734207]     Ответить | Цитировать Сообщить модератору
 Re: Scalar UFN ломает параллельное выполнение запроса  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
User defined function performance is unacceptable

Совет, не пользуйтесь скалярками вааще.
Да и у вас особо незачем. Написали один-два раза во вью и больше ведь не нужно.

PS: RTRIM / RTRIM - боже мой. Зачем?
Уберите это и используйте (на стороне клиента) ДО вставки данных.
А далее пишите код прямой и понятный не экономьте буквы. Размер кода не обязательно говорит о его читаемости.

Например, поле LastName обязательное (вааще-то и FirstName), тогда:
SELECT	LastName + IsNull(' ' + FirstName,'') + IsNull(' ' + FirstName,'')
Т.к. NULL + что-то = NULL
30 май 11, 18:56    [10734391]     Ответить | Цитировать Сообщить модератору
 Re: Scalar UFN ломает параллельное выполнение запроса  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Mnior
Совет, не пользуйтесь скалярками вааще.
Тормозят жутко сами по себе.
RTRIM / LTRIM кстати тоже кушает порядочно.
30 май 11, 18:58    [10734406]     Ответить | Цитировать Сообщить модератору
 Re: Scalar UFN ломает параллельное выполнение запроса  [new]
ksn007
Member

Откуда:
Сообщений: 69
Mnior,
  • за ссылку / ответ спасибо
  • все остальное при условии необязательности полей и невозможности убрать пробелы нужно :)
  • 30 май 11, 20:14    [10734778]     Ответить | Цитировать Сообщить модератору
     Re: Scalar UFN ломает параллельное выполнение запроса  [new]
    Mnior
    Member

    Откуда: Кишинёв
    Сообщений: 6724
    Хорошо, что от функции отказались.
    ksn007
    невозможности убрать пробелы
    А в чём прикол? Поделитесь.
    30 май 11, 20:47    [10734925]     Ответить | Цитировать Сообщить модератору
     Re: Scalar UFN ломает параллельное выполнение запроса  [new]
    GlebZ
    Member

    Откуда: USA
    Сообщений: 286
    ksn007
    Mnior,

  • все остальное при условии необязательности полей и невозможности убрать пробелы нужно :)

  • У вас-же уже есть
    WHEN @last IS NOT NULL
    так зачем вам:
    ISNULL(@last, '')
    ?
    Насчет UDF and parallelism - it's a known issue. (Ну, в общем, МС об этом знает. :) )
    31 май 11, 17:57    [10740874]     Ответить | Цитировать Сообщить модератору
     Re: Scalar UFN ломает параллельное выполнение запроса  [new]
    Mnior
    Member

    Откуда: Кишинёв
    Сообщений: 6724
    GlebZ, поймали кота за яйца, а я даже не посмотрел.
    31 май 11, 21:22    [10741645]     Ответить | Цитировать Сообщить модератору
     Re: Scalar UFN ломает параллельное выполнение запроса  [new]
    ksn007
    Member

    Откуда:
    Сообщений: 69
    Согласен :) ОбNULLил все ''-значения, откусил пробелы в хвосе и в гриве и сделал
    @last + ISNULL(' ' + @first, '') + ISNULL(' ' + @middle, '')
    как вы дружно того требовали :)
    1 июн 11, 15:57    [10746654]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить