我知道派生表和公用表表达式(CTE)不会持久存在。它们存在于内存中,直到外部查询结束。每次通话都是重复执行。
内联表值函数等函数是否仍然存在,这意味着它们只计算一次?我们可以索引内联表值函数吗?
答案 0 :(得分:0)
内联表值函数等函数是否仍然存在
不,如果您看到table valued function
的语法,它本质上会返回select statement
的结果,因此它不会将获取的数据存储在任何位置(与视图中相同)。所以,不存在创建索引的问题,因为数据没有被存储。
除非您将获取的数据存储在另一个表中,如下所示,然后您可以在该测试表上创建索引/其他内容;
SELECT * FROM yourInlineTableValuedFunction(parameter)
INTO TestTable;
答案 1 :(得分:0)
内联函数与视图或CTE基本相同,只是它具有参数。如果查看查询计划,您将看到函数中的逻辑将包含在使用它的查询中 - 所以不,您不能对其进行索引,SQL Server不会对其进行缓存#39; s结果,但当然页面将在缓冲池中供将来使用。
我不会说每次调用CTE都是重复执行,因为只要结果正确,SQL服务器就可以自由决定如何运行查询。
对于多语句UDF,每个调用(至少在2014年以前的版本中)都是单独的执行,据我所知,每次都没有缓存,而是我认为你的意思。
答案 2 :(得分:0)
我们可以索引内联表值函数吗?
不,但如果您将表格设置为临时表,请确保您可以编制索引并加快速度。创建临时表的开销将在改进的索引访问,缓存以及根据您的用例在多用户场景中重复使用相同的临时表时获得回报。