![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Медленно работает MSSQL сервер [D7, MSSQL]
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 поставить условие, что дата из одной таблицы больше всех дат из второй таблицы как минимум на год?
Час на таких объемах - просто несерьезно.