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

Откуда: http://essbase.ru/about
Сообщений: 1407
ищу необычного
- есть ли синтаксис в табличных функциях like "oracle style" - построчный вывод записей . т.е. не накапливать буфер в табличной переменной - а выводить записи по -строчно ?

CREATE FUNCTION TrackingItemsModified(@minId int)
RETURNS @trackingItems TABLE (
   Id       int      NOT NULL,
   Issued   date     NOT NULL,
   Category int      NOT NULL,
   Modified datetime NULL
) 
AS
BEGIN
   INSERT INTO @trackingItems (Id, Issued, Category)
   SELECT ti.Id, ti.Issued, ti.Category 
   FROM   TrackingItem ti
   WHERE  ti.Id >= @minId; 
   
   UPDATE @trackingItems
   SET Category = Category + 1,
       Modified = GETDATE()
   WHERE Category%2 = 0;
  
   RETURN;
END;
19 мар 15, 19:47    [17407000]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
essbase.ru
Member

Откуда: http://essbase.ru/about
Сообщений: 1407
пример из oralce

 
CREATE OR REPLACE PACKAGE refcur_pkg IS
  TYPE refcur_t IS REF CURSOR RETURN employees%ROWTYPE;
  TYPE outrec_typ IS RECORD (
    var_num    NUMBER(6),
    var_char1  VARCHAR2(30),
    var_char2  VARCHAR2(30)
  );
  TYPE outrecset IS TABLE OF outrec_typ;
  FUNCTION f_trans (p refcur_t) RETURN outrecset PIPELINED;
END refcur_pkg;
/

CREATE OR REPLACE PACKAGE BODY refcur_pkg IS
  FUNCTION f_trans (p refcur_t) RETURN outrecset PIPELINED IS
    out_rec outrec_typ;
    in_rec  p%ROWTYPE;
  BEGIN
    LOOP
      FETCH p INTO in_rec;
      EXIT WHEN p%NOTFOUND;
      -- first row
      out_rec.var_num := in_rec.employee_id;
      out_rec.var_char1 := in_rec.first_name;
      out_rec.var_char2 := in_rec.last_name;
      PIPE ROW(out_rec);
      -- second row
      out_rec.var_char1 := in_rec.email;
      out_rec.var_char2 := in_rec.phone_number;
      PIPE ROW(out_rec);
    END LOOP;
    CLOSE p;
    RETURN;
  END f_trans;
END refcur_pkg;
19 мар 15, 19:48    [17407001]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31994
essbase.ru
- есть ли синтаксис в табличных функциях like "oracle style" - построчный вывод записей . т.е. не накапливать буфер в табличной переменной - а выводить записи по -строчно ?
Обычно стараются обрабатывать данные не построчно, а сразу, то есть одним запросом. И тогда сервер их не будет накапливать в буфере, а будет отдавать "построчно" приложению.
essbase.ru
like "oracle style"
MSSQL style сильно отличается от оракловского, и не столько синтаксисом, сколько концепцией работы с базами данных; лучше не пытайтесь эмулировать оракл на сиквеле, а сразу настраивайтесь на другой стиль.
19 мар 15, 19:54    [17407015]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
essbase.ru
Member

Откуда: http://essbase.ru/about
Сообщений: 1407
alexeyvg
Обычно стараются обрабатывать данные не построчно, а сразу, то есть одним запросом. И тогда сервер их не будет накапливать в буфере, а будет отдавать "построчно" приложению.


когда данных слишком много то не хватает ресурсов . а нужно обработать все записи построчно ...

в общем причины есть для такого поиска.
19 мар 15, 19:57    [17407026]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
есть ли синт
Guest
essbase.ru
alexeyvg
Обычно стараются обрабатывать данные не построчно, а сразу, то есть одним запросом. И тогда сервер их не будет накапливать в буфере, а будет отдавать "построчно" приложению.


когда данных слишком много то не хватает ресурсов . а нужно обработать все записи построчно ...

в общем причины есть для такого поиска.

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

SELECT ti.Id, ti.Issued, case when Category%2 = 0 then ti.Category+1 else ti.category end as Category, case when Category%2 = 0 then getdate() end as modified
   FROM   TrackingItem ti
   WHERE  ti.Id >= @minId; 

все? задача решена? в функцию заворачивать не нужно, ни в какую табличную переменную класть тоже
19 мар 15, 20:07    [17407056]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
essbase.ru
Member

Откуда: http://essbase.ru/about
Сообщений: 1407
есть ли синт,

спсб
есть строчка записей
ее нужно умножить использовав запрос к другой таблице.

сейчас работаю с 12 млн. записей - будет в в 60-70 раз больше.
19 мар 15, 20:10    [17407066]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
есть ли синт
Guest
essbase.ru,

в этом сообщении нет ни вопроса, ни проблемы, ни задачи.
нужно получить результат джойна - да, это делается с помощью джойна.
если 12млн заджойнить на таблицу где каждой строке из левой соответствуют 60 строк в правой - да, получится 720млн.

возможно получится чем-то помочь если опишете какая задача решается. если решаемая задача - джойн с выхлопом ярда записей - она решена. может с этой выборкой делается что-то еще?
19 мар 15, 20:17    [17407086]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31994
essbase.ru
есть строчка записей
ее нужно умножить использовав запрос к другой таблице.
Так умножте, запросом, и без "хранения в буфере".
essbase.ru
а нужно обработать все записи построчно ...
Вот это и есть другая, "оракловская" концепция. А вам нужна сиквельная. Возможно, и в модели данных тоже.

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

ЗЫ. Функции в сиквеле вообще нужно стараться не использовать, функции - это параметризированные запросы для очень ограниченного применения. Нужно использовать запросы и процедуры.
19 мар 15, 20:24    [17407109]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6204
alexeyvg
ЗЫ. Функции в сиквеле вообще нужно стараться не использовать

Я так понимаю, здесь речь про пользовательские скалярки и multi-statement TVF?
20 мар 15, 06:09    [17407908]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
Jaffar
Member

Откуда:
Сообщений: 633
автор
ЗЫ. Функции в сиквеле вообще нужно стараться не использовать, функции - это параметризированные запросы для очень ограниченного применения. Нужно использовать запросы и процедуры.


Слишком категоричное высказывание.
Нужно просто знать как работают те инструменты которыми пользуешься.
Но это знание, КПП, становится нужно только если что-то не получается, - если все хорошо - то и монитором можно забивать гвозди.
20 мар 15, 09:03    [17408174]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
essbase.ru
Member

Откуда: http://essbase.ru/about
Сообщений: 1407
alexeyvg

ЗЫ. Функции в сиквеле вообще нужно стараться не использовать, функции - это параметризированные запросы для очень ограниченного применения. Нужно использовать запросы и процедуры.


переписал свое творение по другому принципу

CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
RETURNS TABLE
AS
RETURN 
(
    SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'
    FROM Production.Product AS P 
    JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
    JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
    JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
    WHERE C.StoreID = @storeid
    GROUP BY P.ProductID, P.Name
);
GO  


работает быстрее раза в два

Вопрос
нет противоказаний вкладывать табличную функцию в табличную функцию ? Компилятор позволяет это сделать .. а что говорит практика ?
20 мар 15, 11:34    [17408891]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
essbase.ru
нет противоказаний вкладывать табличную функцию в табличную функцию ? Компилятор позволяет это сделать .. а что говорит практика ?

Практика говорит - зачем здесь вообще UDF
20 мар 15, 11:38    [17408925]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
essbase.ru
есть ли синт,

спсб
есть строчка записей
ее нужно умножить использовав запрос к другой таблице.

сейчас работаю с 12 млн. записей - будет в в 60-70 раз больше.


табличные функции - зло
20 мар 15, 11:39    [17408930]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
essbase.ru
Member

Откуда: http://essbase.ru/about
Сообщений: 1407
Winnipuh
табличные функции - зло

тема не раскрыта
нужно перечислить по пунктам , что ломается
20 мар 15, 12:05    [17409171]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
essbase.ru
нужно перечислить по пунктам , что ломается

Чем опасна граната в лапах обезъяны - перечислите все пункты пожалуйста.
20 мар 15, 12:08    [17409190]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
essbase.ru
Member

Откуда: http://essbase.ru/about
Сообщений: 1407
Glory
Практика говорит - зачем здесь вообще UDF


потому что за UDF стоит CLR , который оптимизатор дергает не эффектифно.
кеширование запроса позволяет сократить вызовы CLR
20 мар 15, 12:12    [17409224]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
essbase.ru
Member

Откуда: http://essbase.ru/about
Сообщений: 1407
Glory
Чем опасна граната в лапах обезъяны - перечислите все пункты пожалуйста.


модератору маска троля не клицу. изыди
20 мар 15, 12:13    [17409228]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
есть ли синтаксис
Guest
essbase.ru,

то 21млн с вычислениями, то поиск в плоских справочниках по id...
зато быстрей в два раза!))) капец
20 мар 15, 12:18    [17409273]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
essbase.ru
Glory
Чем опасна граната в лапах обезъяны - перечислите все пункты пожалуйста.


модератору маска троля не клицу. изыди

Это уж не вам решать.
Вам бы лучше почитать книжки какие. Про оптимизацию запросов TSQL. Глядишь, повторно переписанный код в свете новых знаний заработает еще "быстрее раза в два "
20 мар 15, 12:18    [17409275]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
essbase.ru
Member

Откуда: http://essbase.ru/about
Сообщений: 1407
Glory
Про оптимизацию запросов TSQL


- печально видеть , когда проф вызвавшийся помогать, выдал только "RTFM".
20 мар 15, 12:24    [17409311]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
essbase.ru
Glory
Про оптимизацию запросов TSQL


- печально видеть , когда проф вызвавшийся помогать, выдал только "RTFM".

Печально видеть, что вы даже RTFM не читали.
А все требуете, чтобы вам перечислили пункты, которые волшебным образом сделают ваш код быстродействующим

ЗЫ
И я не вызывался вам помогать. Для получения помощи нужно задавать адекватные вопросы. А не вида, как мне из MSSQL сделать Oracle

Сообщение было отредактировано: 20 мар 15, 12:28
20 мар 15, 12:27    [17409323]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
essbase.ru
Member

Откуда: http://essbase.ru/about
Сообщений: 1407
Glory,


Glory
А все требуете, чтобы вам перечислили пункты, которые волшебным образом сделают ваш код быстродействующим


что "лучшими практиками" в мире MsSQL не принято делится ?
20 мар 15, 12:28    [17409327]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
essbase.ru
Glory,


Glory
А все требуете, чтобы вам перечислили пункты, которые волшебным образом сделают ваш код быстродействующим


что "лучшими практиками" в мире MsSQL не принято делится ?

Лучших практик превращения MSSQL в Oracle не существует.
А любую оптимизацию начинают с поиска узких мест. Не умозрительного решения о каких то утечках памяти, а с замера конкретных параметров системы
20 мар 15, 12:31    [17409346]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
essbase.ru
Member

Откуда: http://essbase.ru/about
Сообщений: 1407
в общем тема не раскрыта.

- если у кого-нибудь будут идеи по существу то поделитесь пж.

er@essbase.ru
20 мар 15, 12:34    [17409361]     Ответить | Цитировать Сообщить модератору
 Re: табличные функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
essbase.ru
в общем тема не раскрыта.

Начните с так нелюбимого вами RTFM
https://technet.microsoft.com/en-us/library/ms190610(v=sql.105).aspx
20 мар 15, 13:27    [17409634]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить