我们可以在表值函数中创建索引吗?

时间:2014-07-23 12:11:53

标签: sql sql-server sql-server-2008

我们可以在SQL Server 2008中的表值函数表中的列上创建索引吗?

我的功能结果很慢。当我查看执行计划时,它是在表扫描下,因此我需要在函数表列上创建索引,以便将where子句放在该列上。

任何帮助都将受到高度赞赏。

提前致谢

1 个答案:

答案 0 :(得分:16)

如果表值函数是内联变量,则可以在基础表列上创建索引。

如果它是SQL Server 2008中的多语句TVF(标记为),则只能创建与主键或唯一约束关联的索引。

In SQL Server 2014+ it is possible to declare inline indexes not associated with any constraint

实施例

CREATE FUNCTION F()
RETURNS @X TABLE
(
A INT PRIMARY KEY /*<-- Implicit clustered index*/
)
AS
BEGIN
INSERT INTO @X 
    VALUES(1),(2)
RETURN;
END

GO

SELECT *
FROM F()
WHERE A = 12

enter image description here

上面首先将整个结果集具体化为表变量,并在其上创建一个隐式索引。

一般来说,内联TVF比多语句更受欢迎。