我知道派生表和公用表表达式(CTE)不会持久存在。它们一直存在于内存中,直到外部查询结束。每次调用都是一次重复的执行。
像内联表值函数这样的函数是否仍然存在,这意味着它们只计算一次?我们能索引一个内联表值函数吗?
发布于 2015-07-23 21:49:11
诸如内联表值函数之类的
Do函数仍然存在
不,如果你看到table valued function
的语法,它本质上会返回select statement
的结果,所以它不会将获取的数据存储在任何地方(与视图中相同)。因此,不存在创建索引的问题,因为数据不会被存储。
除非您将获取的数据存储在如下所示的另一个表中,然后可以在该测试表上创建索引/其他内容;
SELECT * FROM yourInlineTableValuedFunction(parameter)
INTO TestTable;
发布于 2015-07-23 21:51:33
内联函数基本上与视图或CTE相同,只是它有参数。如果查看查询计划,您将看到函数中的逻辑将包含在使用它的查询中--因此,您不能对其进行索引,SQL Server也不会这样缓存它的结果,但是这些页当然会放在缓冲池中以备将来使用。
我也不会说每次对CTE的调用都是重复执行,因为SQL server可以自由地决定如何运行查询,只要结果是正确的。
对于多语句UDF,每个调用(至少在2014年之前的版本中)都是单独的执行,据我所知,每次都是独立的执行,而不是我假设的你所指的意义上的缓存。
发布于 2015-07-23 21:58:08
我们能索引一个内联表值函数吗?
不能,但是如果你把这个表变成一个临时表,你肯定可以建立索引并提高速度。创建临时表的开销将在改进的索引访问、缓存以及根据您的用例在多用户场景中重复使用相同的临时表方面得到更多的回报。
https://stackoverflow.com/questions/31598491
复制