powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как так?
7 сообщений из 7, страница 1 из 1
Как так?
    #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
Как так?
    #32042701
~Bazul~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...а потомому-что нет ничего тормозней, чем оператор IN...
Хотя это не аксиома, и надо смотреть на настройки сервака, индексы таблиц и т.д. Посмотри план запроса в QA, может чего проясниться.
...
Рейтинг: 0 / 0
Как так?
    #32042702
Gena G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понимаю это, но два первых запроса пролетают за милисекунды, а последний просто померает по дороге и все... Не в IN дело :(
...
Рейтинг: 0 / 0
Как так?
    #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
Как так?
    #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
Как так?
    #32042707
~Bazul~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну на вкидку ничего на ум не приходит. Может гуру в курсе?
А план выполнения запроса в QA смотрел?
...
Рейтинг: 0 / 0
Как так?
    #32042728
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Gena G.
По моему ответ очевиден - всё дело в операторе OR
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как так?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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