Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 оператор and  [new]
maximIZ
Member

Откуда: Спб
Сообщений: 640
Добрый день. В .NET есть две логические конструкции AND и ANDALSO

разница в том что если использовать просто AND, то будет проверяться и первое условие и второе, даже если первое условие уже не истинно. ANDALSO же прерывается если первое условие вернуло ЛОЖЬ. Например, вот такая конструкция
DIM T INT = 0
DIM B INT = 1

IF T = 1 AND B = 1 
.....
END IF


Здесь будут проверены оба условия T = 1 и B = 1, хотя очевидно что первое вернуло уже ЛОЖЬ и второе проверять не обязательно. Если использовать ANDALSO, то проверка будет происходить быстрее, т.к. не будут проверяться лишние условия, да и в некоторых случаях можно код написать в кратком и более удобном виде

А вот если этот пример перевести в скл

DECLARE @T INT = 0, @B INT = 1

IF @T = 1 AND @B = 1 
	BEGIN
.........
	END


То как тут работает AND? Второе условие @B = 1 будет проверяться или нет? Т.е. в скл AND работает как нетовский AND или как нетовский ANDALSO ?
20 янв 16, 13:16    [18705537]     Ответить | Цитировать Сообщить модератору
 Re: оператор and  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
maximIZ,

Вы не там оптимизацию делаете:)
20 янв 16, 13:23    [18705590]     Ответить | Цитировать Сообщить модератору
 Re: оператор and  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
maximIZ,

ответ прост - что и в каком порядке делать, решает оптимизатор.
И зависит от выбранного плана выполнения.
20 янв 16, 13:24    [18705601]     Ответить | Цитировать Сообщить модератору
 Re: оператор and  [new]
maximIZ
Member

Откуда: Спб
Сообщений: 640
Да мне просто стало интересно как же AND работает ))
20 янв 16, 13:25    [18705612]     Ответить | Цитировать Сообщить модератору
 Re: оператор and  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
maximIZ
Да мне просто стало интересно как же AND работает ))
В SQL наблюдается большая разница между тем, что вы написали,
и тем, как сервер будет выполнять написанное физически.
Логически результат должен быть один и тот же у вас и сервера.
Это единственное требование.
20 янв 16, 13:31    [18705671]     Ответить | Цитировать Сообщить модератору
 Re: оператор and  [new]
maximIZ
Member

Откуда: Спб
Сообщений: 640
я тут скорее задумался как код сделать немного поменьше но сохранить работоспособность при этом

можно написать так, но так слишком громоздко
IF @T = 1 
	BEGIN
		IF @B = 1 
			BEGIN
.........
			END
	END


а можно так

IF @T = 1 AND @B = 1 
	BEGIN

	END


будет и это одинаково по скорости работать
20 янв 16, 13:35    [18705708]     Ответить | Цитировать Сообщить модератору
 Re: оператор and  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
CREATE TABLE dbo.t1(ID INT)
GO
CREATE TABLE dbo.t2 (ID INT)
GO

IF EXISTS(SELECT * FROM t1)
    AND EXISTS(SELECT * FROM t2)
BEGIN

    SELECT 1

END


AND работает очень предсказуемо. Что написали, то SQL Server распарсил и построил план.

Например в таблицах нет строк, но SQL Server всегда предполагает (Estimated Number of Rows) что там есть хотя бы 1. Поэтому они в план выполнения включаются.
20 янв 16, 13:35    [18705709]     Ответить | Цитировать Сообщить модератору
 Re: оператор and  [new]
maximIZ
Member

Откуда: Спб
Сообщений: 640
спасибо. посмотрел планы. и тут если нужно увеличить производительность и не делать лишних проверок лучше делать вложенные IF? а не использовать AND
20 янв 16, 13:53    [18705864]     Ответить | Цитировать Сообщить модератору
 Re: оператор and  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
IF EXISTS(SELECT * FROM t1)
BEGIN
    IF EXISTS(SELECT * FROM t2) BEGIN
        SELECT 1
    END
END


Если посмотрите на план, то он будет уже другим.
20 янв 16, 14:03    [18705939]     Ответить | Цитировать Сообщить модератору
 Re: оператор and  [new]
maximIZ
Member

Откуда: Спб
Сообщений: 640
да спасибо. я увидел. лучше конечно использовать именно такую конструкцию
20 янв 16, 14:26    [18706098]     Ответить | Цитировать Сообщить модератору
 Re: оператор and  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
maximIZ,

AND или ANDALSO в T-SQL конструкции IF будут работать одинаково медленно, по сравнению с .NET, потому что SQL не разрабатывался для быстрого выполнения условных операторов. Язык SQL нужен для быстрой работы с наборами данных. Так что смотреть нужно на AND в реальных SQL выражениях (WHERE, ON и т.д.). Ну и да у сервера в этом плане большая свобода, он может выполнять в том порядке как посчитает оптимальным главное чтобы конечный результат был таким же. Иногда он ошибается в выборе, тогда да, нужно смотреть планы, разбираться почему и решать что делать.
22 янв 16, 01:11    [18713941]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить