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

Откуда: страна ленивых программистов
Сообщений: 2506
Странно, но оптимизатор оптимизирует запрос

SELECT *
FROM MyTable
WHERE 1=2

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

SELECT *
FROM GetMyTable()
WHERE 1=2

Можно както добиться чтобы сначала проверялось условия where ?

PS:
MS SQL 2005
2 сен 09, 18:08    [7609964]     Ответить | Цитировать Сообщить модератору
 Re: Интересная проблема. Как заставить сначала проверить условие Where ?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
IF
?
2 сен 09, 18:12    [7609998]     Ответить | Цитировать Сообщить модератору
 Re: Интересная проблема. Как заставить сначала проверить условие Where ?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
У Вас судя по всему Multistatement Table-valued функция, ибо для Inline оптимизатор такого не делает.

Кстати, план бы не помешал.
2 сен 09, 18:14    [7610009]     Ответить | Цитировать Сообщить модератору
 Re: Интересная проблема. Как заставить сначала проверить условие Where ?  [new]
ResearchStudio
Member [заблокирован]

Откуда: страна ленивых программистов
Сообщений: 2506
pkarklin
У Вас судя по всему Multistatement Table-valued функция, ибо для Inline оптимизатор такого не делает.

Кстати, план бы не помешал.


да, Multistatement Table функция. Там сложный запрос из нескольких таблиц.
План в первом варианте короткий ( присоединяю )

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

К сообщению приложен файл (plan.sqlplan - 2Kb) cкачать
2 сен 09, 18:19    [7610038]     Ответить | Цитировать Сообщить модератору
 Re: Интересная проблема. Как заставить сначала проверить условие Where ?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Уверен, что можно переписать на inline функцию. Так скорее размер кода уменьшиться, будет работать быстрее и эффективнее, больше шансов для дальнейшего развития системы. Но если будет доказано что невозможно, тогда и только тогда, можно и извратиться как-то так:
CREATE FUNCTION [dbo].[fnTest] (
	@@Count	Int
) RETURNS @Table TABLE (
	 ID	Int IDENTITY PRIMARY KEY
	,Data	VarChar(250)
) AS BEGIN
	WHILE (@@Count > 0) BEGIN
		INSERT	@Table
		DEFAULT	VALUES

		SET @@Count = @@Count - 1
	END
	RETURN
END
GO
SELECT	F.*
FROM	dbo.fnTest(10000) F
WHERE	1 = 2
GO
SELECT	F.*
FROM	(SELECT 1000 AS [Count] WHERE 1 = 2) P
	CROSS APPLY dbo.fnTest(P.[Count]) F
GO

Кстати, не должен генератор планов так оптимизировать. Можно, но тогда не будет будущего у такого движка. Совместимость костылей задушит.
2 сен 09, 23:34    [7610905]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить