Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли сделать такой вот хитрый запрос ? С динамическим вычислением значения. 
:(
    Опции темы
AndreyK
Дата 22.7.2009, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Мне надо, чтоб в запросе в поле показывалось некое значение, вычисляемое в зависимости от всех предыдущих записей этого запроса.

Например: сумма всех предыдущих значений какого-то поля.

Ну это можно сделать и обычными методами: включить подзапрос в котором суммируются все записи меньше даты текущей записи (работает медленно, но работает).

А что делать, когда мне надо подсчитать сложную среднюю (всех записей выше текущей)?

Нельзя ли как-то использовать для этого хранимую процедуру?

По следующему алгоритму:

1) Объявить в хранимой процедуре глобальную переменную (можно ли?)
2) Как-то указать, чтоб запрос обрабатывался строго в порядке как указано в ORDER BY ,а не как там оптимизатору приспичит.
3) В этой переменной накапливать вычисляемое значение в порядке обработки запроса.

Вот план я составил ... но не знаю - возможно ли это?

Может не стоит и пытаться?

Есть еще план номер 2:

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

Может уже кто-то сталкивался с подобными проблемами?


PM MAIL   Вверх
Zioma
Дата 22.7.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 22.8.2007

Репутация: 5
Всего: 5



А в чем собственно проблема?

Цитата

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

Не правда. Необходима оптимизация структуры.

Цитата

2) Как-то указать, чтоб запрос обрабатывался строго в порядке как указано в ORDER BY ,а не как там оптимизатору приспичит.

Тут совсем непонятно  smile 

Вообщем, неплохо бы было примеры для более предметного разговора ...

А, ну версию сиквела обезательно в студию.

Это сообщение отредактировал(а) Zioma - 22.7.2009, 22:41
PM MAIL   Вверх
DimW
Дата 23.7.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



AndreyK, саветую вам посмотреть в сторону аналитических(оконных) функций:
http://www.sqlbooks.ru/readarticle.aspx?pa...;file=sql200523
http://www.rsdn.ru/article/db/WindowFunctions.xml
PM MAIL ICQ   Вверх
NURMS
Дата 24.7.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Думаю здесь курсор поможет. (На сколько я понял вопрос)(:
PM MAIL   Вверх
AndreyK
Дата 24.7.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Цитата(DimW @ 23.7.2009,  10:25)
AndreyK, саветую вам посмотреть в сторону аналитических(оконных) функций:
http://www.sqlbooks.ru/readarticle.aspx?pa...;file=sql200523
http://www.rsdn.ru/article/db/WindowFunctions.xml

Пожалуй это похоже на вариант ... надо только разобраться с этим получше.

Добавлено через 4 минуты и 53 секунды
Цитата(NURMS @ 24.7.2009,  11:37)
Думаю здесь курсор поможет. (На сколько я понял вопрос)(:

У меня как раз всё и написано с использованием курсора ...

Но из-за очень медленного механизма связи приложение-SQL-сервер, моя задача выполняется очень медленно.

Тестирование показало, что один большой и сложный запрос, раз в сто эффективней того-же самого, но выполненного при помощи курсора.
Например, когда я пробегаю по курсору, создавая при каждом шаге ещё один запрос - это очень медленный способ работы.
PM MAIL   Вверх
DimW
Дата 24.7.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



Цитата(AndreyK @  24.7.2009,  12:32 Найти цитируемый пост)
надо только разобраться с этим получше.

 smile 

Цитата(AndreyK @  24.7.2009,  12:32 Найти цитируемый пост)
Например, когда я пробегаю по курсору, создавая при каждом шаге ещё один запрос - это очень медленный способ работы.

неужели в MSSQL нет возможности материализовать набор к которому нужно обращаться при каждом шаге?!...
PM MAIL ICQ   Вверх
Zloxa
Дата 24.7.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(DimW @  23.7.2009,  10:25 Найти цитируемый пост)
саветую вам посмотреть в сторону аналитических(оконных) функций:

не дорос еще билли, чтобы running sum посчитать.
Кляуза order by определена только для Ranking Window Functions , не для Aggregate Window Functions 

Когда я открыл для себя это, почувствовал себя сильно обманутым :(

Это сообщение отредактировал(а) Zloxa - 24.7.2009, 22:55


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 27.7.2009, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



Цитата(Zloxa @  24.7.2009,  22:45 Найти цитируемый пост)
Когда я открыл для себя это, почувствовал себя сильно обманутым :(

не то что я сильно расстроился, но за прояснения ситуации, спасибо!
PM MAIL ICQ   Вверх
AndreyK
Дата 30.7.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Я нашёл другое решение.

Оказывается MSSQL сильно тормозит, когда одновременно открыты два (или больше) курсоров и - главное! - в обоих происходят исправления.

Я переделал все алгоритмы, чтоб одновременно не было открыто более одного курсора.

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

И все сразу быстро заработало!

Та процедура, что раньше 20 минут выполнялась - теперь за пару секунд пролетает.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.