sql-server – 多语句TVF与内联TVF性能
发布时间:2020-12-25 06:18:04 所属栏目:MsSql教程 来源:网络整理
导读:比较 Palindrome question上的一些答案(仅限10k用户,因为我删除了答案),我的结果令人困惑. 我提出了一个multi-statement,schema-bound TVF,我认为它比运行标准功能更快.我也认为多语句TVF会被“内联”,虽然我错了,但你会在下面看到.这个问题是关于这两种风格
这是我的数字表的定义,主键和聚集索引: CREATE TABLE dbo.Numbers ( Number INT NOT NULL CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED ); ;WITH n AS ( SELECT v.n FROM ( VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ) v(n) ) INSERT INTO dbo.Numbers(Number) SELECT ROW_NUMBER() OVER (ORDER BY n1.n) FROM n n1,n n2,n n3,n n4,n n5,n n6; 解决方法您的数字表是一个堆,每次都可能被完全扫描.在Number上添加一个聚簇主键,并使用forceseek提示尝试以下操作以获得所需的搜索. 据我所知,这个提示是必需的,因为SQL Server只估计该表的27%将与谓词匹配(< = 30%和<>减少到27%).因此,它只需要读取3-4行才能找到匹配的行,并且可以退出半连接.因此,扫描选项的成本非常低廉.但事实上,如果确实存在任何回文,那么它将不得不阅读整个表格,因此这不是一个好的计划. CREATE FUNCTION dbo.InlineIsPalindrome ( @Word NVARCHAR(500) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( WITH Nums AS ( SELECT N = number FROM dbo.Numbers WITH(FORCESEEK) ) SELECT IsPalindrome = CASE WHEN EXISTS ( SELECT N FROM Nums WHERE N <= L / 2 AND SUBSTRING(S,L) ); GO 随着这些变化,它飞了我(需要228ms) (编辑:好传媒网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读