Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Медленно работает MSSQL сервер [D7, MSSQL]


Страницы:   1 2

ch_victor ©   (2004-02-02 10:45:00) 

Добрый день всем!!!
Я слышал что MSSQL сервер медленно работает с user-defined function, но не думал, что настолько медленно

обьясняю суть задачи:
имееется 2 таблицы
1 таблица частолетающих пассажиров
2 таблица полетов этих пассажиров
по правилам частолетающим пассажиром является тот кто совершает полеты не реже раз в год
поэтому нужно связать эти две таблицы и найти таких пассажиров, у которых промежуток между двумя полетами более года

я сделал view в котором выводятся такие пассажиры
в нем использую функцию которая вычисляет есть ли большой промежуток между полетами, в функции использую курсор который вытаскивает построчно полеты определенного пассажира и сравнивает даты полета

так вот эта задача отрабатывает очень долго (около часа), хотя количество записей в таблицах не очень большое в первой 10000 записей, а во второй 60000

можно ли обойтись без курсора в функции, потому что я так думаю тормозит из-за него, какие будут предложения?


Nikolay M.   (2004-02-02 11:15:00) [21]

Еще как вариант - сделать курсор по запросу
SELECT client_id, servicedate
FROM transaction
ORDER BY client_id, servicedate
и пошагово сравнивать в рамках каждого клиента, что последующая дата больше предыдущей на год и, если больше, то такого клиента пихать во временную таблицу, а потом делать селект из нее.


Nikolay M.   (2004-02-02 11:11:00) [22]

Имхо, можно вот так, но могут быть ошибки, да и не самое оптимальное это, потому что подзапрос есть:
SELECT DISTINCT(client_id)
FROM transaction tr1
WHERE DATEDIFF(Day, tr1.servicedate, (SELECT ISNULL(MAX(service), tr1.servicedate) FROM transaction tr2 WHERE tr2.servicedate < tr1.servicedate)) > 365


ch_victor   (2004-02-02 11:03:00) [23]


> , а с другой стороны, нужно найти тех, у кого промежуток
> между полетами больше года. Какая-то нестыковочка.


операторы забивают любые полеты, поэтому и стоит задача найти неправильно введенные

а структура в простом виде такая
(убираю поля которые сейчас неважные)
такая
таблица пассажиров(client)
client_id
lastname,
firstname

таблица полетов(transaction_)
transaction_id
client_id
servicedate (дата полета)


Nikolay M.   (2004-02-02 10:56:00) [24]

Да, кстати, я что-то не совсем въехал в условие. С одной стороны, есть таблица
> 1 таблица частолетающих пассажиров
> по правилам частолетающим пассажиром является тот кто совершает
> полеты не реже раз в год

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


sniknik   (2004-02-02 10:56:00) [25]

в функции наверное специально задержки ставил? показать важность и обьемность задачи. ;о))

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


Ega23   (2004-02-02 10:53:00) [26]

Это всё на уровне Select можно сделать.
where (Date1-Date2)<=365


Nikolay M.   (2004-02-02 10:53:00) [27]


> можно ли обойтись без курсора в функции

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо