Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как так? / 7 сообщений из 7, страница 1 из 1
13.08.2002, 06:15:10
    #32042691
Gena G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как так?
почему запросы:

1)
Код: plaintext
1.
2.
3.
4.
sELECT    BookingID AS CO
FROM         dbo.Bookings
WHERE     BookingID NOT IN
                          (SELECT     BookingID
                            FROM          Invoice)

2)
Код: plaintext
1.
2.
3.
4.
5.
SELECT     BookingID AS CO
FROM         dbo.Bookings
WHERE     (BookingID IN
                          (SELECT     BookingID
                            FROM          Invoice
                            WHERE      Active =  0 )) AND InviceAfter < GETDATE()


Работают быстро, а

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT     COUNT(BookingID) AS C
FROM         dbo.Bookings
WHERE     (BookingID NOT IN
                          (SELECT     BookingID
                            FROM          Invoice)) OR
                      (BookingID IN
                          (SELECT     BookingID
                            FROM          Invoice
                            WHERE      Active =  0 )) AND (InviceAfter < GETDATE())


вылетает по тайм-ауту?
...
Рейтинг: 0 / 0
13.08.2002, 07:59:41
    #32042701
~Bazul~
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как так?
...а потомому-что нет ничего тормозней, чем оператор IN...
Хотя это не аксиома, и надо смотреть на настройки сервака, индексы таблиц и т.д. Посмотри план запроса в QA, может чего проясниться.
...
Рейтинг: 0 / 0
13.08.2002, 08:03:23
    #32042702
Gena G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как так?
Я понимаю это, но два первых запроса пролетают за милисекунды, а последний просто померает по дороге и все... Не в IN дело :(
...
Рейтинг: 0 / 0
13.08.2002, 08:11:10
    #32042704
~Bazul~
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как так?
А ты действуй методом исключения. Замени все операторы IN на exists() так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT     COUNT(BookingID) AS C
FROM         dbo.Bookings
WHERE     
 not exists(SELECT  * FROM   Invoice 
              where Invoice.BookingID=Bookings.BookingID)) 
 OR
 exists ( select * from Invoice Invoice
            WHERE Invoice.BookingID=Bookings.BookingID 
            and Active =  0  AND InviceAfter < GETDATE())


Сообщи результат.
...
Рейтинг: 0 / 0
13.08.2002, 08:17:02
    #32042705
Gena G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как так?
Работает твой вариант, только

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select COUNT(*) as C from
(sELECT    BookingID AS CO
FROM         dbo.Bookings
WHERE     BookingID NOT IN
                          (SELECT     BookingID
                            FROM          Invoice)
union
SELECT     BookingID AS CO
FROM         dbo.Bookings
WHERE     (BookingID IN
                          (SELECT     BookingID
                            FROM          Invoice
                            WHERE      Active =  0 )) AND InviceAfter < GETDATE()) as d


быстрее.

Мой же вопрос - в чем собака порылась что такая разница?
...
Рейтинг: 0 / 0
13.08.2002, 08:20:56
    #32042707
~Bazul~
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как так?
Ну на вкидку ничего на ум не приходит. Может гуру в курсе?
А план выполнения запроса в QA смотрел?
...
Рейтинг: 0 / 0
13.08.2002, 09:23:53
    #32042728
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как так?
2 Gena G.
По моему ответ очевиден - всё дело в операторе OR
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как так? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]