SQL Server и оптимизация пользовательских функций с табличными значениями - PullRequest
0 голосов
/ 29 апреля 2010

Если у меня есть UDF, который возвращает таблицу с тысячами строк, но я просто хочу конкретную строку из этого набора строк, сможет ли SQL Server эффективно это обработать?

DECLARE @pID int; --...
SELECT * FROM dbo.MyTableUDF(@pID)
WHERE SomeColumn BETWEEN 1 AND 2 OR SomeOtherColumn LIKE 'this_pattern&'

Насколько оптимизатор запросов способен рассуждать об этом типе запроса?

Чем табличные UDF отличаются от традиционных представлений, если они не принимают параметров?

Есть какие-нибудь ошибки, о которых я должен знать?

1 Ответ

1 голос
/ 29 апреля 2010

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

Примерно так:

CREATE FUNCTION dbo.MyTableUDF(@ID int)
RETURNS @myTable TABLE 
(
    ID int PRIMARY KEY NOT NULL, 
    FirstName nvarchar(50) NULL, 
    LastName nvarchar(50) NULL
)
as begin

Insert Into @myTable (ID, FirstName, LastName)
Select ID, FirstName, LastName
From Users
Where ID = @ID


return

end
go

Select * From MyTableUDF(1)

Для этого сценария это был бы гораздо лучший подход.

EDIT:

Хорошо, так как вы используете UDF-таблицу, а не представление, я предполагаю, что это UDF-таблица с несколькими операторами, а не встроенная. Я почти уверен, что использование UDF таким образом не повлияет на производительность.

Производительность действительно снизится, если вы использовали UDF в операторе Select или предложении Where. Это потому, что UDF будет вызываться для каждой строки, возвращаемой из таблицы. например, Select col1, col2, dbo.MyUDF(col3) From MyTable

или

Select col1, col2 from dbo.MyTable Where dbo.MyUDF(col3) != 1

Так что, если вы MyTable содержали 100 000 строк, ваш UDF будет вызываться 100 000 раз. Если для выполнения UDF требуется 5 секунд, вы столкнетесь с проблемами.

Насколько я понимаю, вы не собираетесь использовать UDF таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...