返回表的SQL Server 2008函数是否像存储过程一样进行优化?

时间:2011-01-17 21:48:11

标签: linq-to-sql sql-server-2008 function stored-procedures

在成为许多(多年)的ADO.NET弟子之后,我终于想弄明白Linq了。在Linq中,从SQL Server函数返回的表数据类型为IQueryable,而从存储过程返回的数据是ISingleResult。

由于IQueryable更容易处理,我想使用它。我的问题:是一个SQL函数,它返回与同等存储过程一样有效的表数据吗?

3 个答案:

答案 0 :(得分:2)

My question: is an SQL function that returns table data as efficient as an equivalent stored procedure?

是的,底层代码将在TSQL中以相​​同的方式通过查询优化器,因此对于“效率等效”,它必须是一个坚实的肯定。但是,有些东西在表值函数的帮助下,特别是如果函数可以内联(外部过滤器被带入函数内的查询)。

生成结果集(或多个)的SP只能从参数中获取输入,而内联表函数可以从外部查询中引入其他过滤器。考虑一下:

create function dbo.testif() returns table as return
select * from information_schema.columns

和查询

select * from dbo.testif() where TABLE_NAME like 'S%'

条件 TABLE_NAME就像'S%'实际上被带入函数内部的查询中,而您无法使用存储过程。

答案 1 :(得分:1)

LINQ-to-SQL对于简单查询非常有效,但在执行更复杂的语句时,您可以创建一个编译查询以便重用并提高性能。

查看System.Data.Linq.CompiledQuery课程。

以下链接有一些性能测试和进一步讨论: http://www.codeproject.com/KB/linq/LINQquery.aspx

答案 2 :(得分:1)

Cyber​​wiki和Kirk的回答都帮助了我,但在Linq中使用存储过程似乎非常尴尬。我确实发现Linq会像表一样处理视图,所以我可以使用视图来塑造我的结果,所以我仍然可以在服务器上进行大部分处理,而不是在应用程序代码中加入表。

我认为使用视图以及Linq编译的查询以获得更好的性能(正如Kirk建议的那样),会给我想要的结果。