代码问题
您的数字表是一堆,每次都可能被完全扫描。
添加一个集群主键Number
并尝试以下forceseek
提示以获得所需的搜索。
据我所知,此提示是必需的,因为 SQL Server 仅估计表的 27% 将匹配谓词(30% 用于 the <=
,而 减少到 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, N, 1) <> SUBSTRING(S, 1 + L - N, 1)
)
THEN 0
ELSE 1
END
FROM
(SELECT LTRIM(RTRIM(@Word)), LEN(@Word)) AS v (S, L)
);
GO
有了这些变化,它对我来说就飞了(需要 228 毫秒)
问题答案
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:starryrocklee#gmail.com (将#修改为@)
如果觉得前端之家所整理的内容很不错的话,欢迎点击下方分享按钮,转发给身边开发程序员好友。