gpt4 book ai didi

stored-procedures - 使用 NULL 参数的 SQL Server 全文搜索 - 性能命中

转载 作者:行者123 更新时间:2023-12-04 07:43:35 25 4
gpt4 key购买 nike

我正在尝试在搜索过程中使用 Contains()。全文索引已创建并正在运行。出现此问题是因为您不能对 NULL 变量或参数使用 Contains() 调用,它会引发错误。

这需要 9 秒才能运行(传递非空参数):

--Solution I saw on another post    
IF @FirstName is null OR @FirstName = '' SET @FirstName = '""'
...
Select * from [MyTable] m
Where
(@FirstName = '""' OR CONTAINS(m.[fname], @FirstName))

这会立即运行(传入非空参数)

IF @FirstName is null OR @FirstName = '' SET @FirstName = '""'
...
Select * from [MyTable] m
Where
CONTAINS(m.[fname], @FirstName)

只需在“包含”前面添加额外的“或”就完全改变了查询计划。我也尝试过使用“case”语句而不是“OR”但无济于事,我仍然得到缓慢的查询。

有没有人解决过全文搜索中空参数的问题或者遇到过我的问题?任何想法都会有所帮助,谢谢。

我正在使用 SQL Server 2012

最佳答案

您正在检查 SQL 中绑定(bind)变量的值。更糟糕的是,您使用访问谓词在 OR 中执行此操作。我不是 SQL Server 方面的专家,但这通常是一种不好的做法,并且此类谓词会导致全表扫描。

如果您确实需要在 @FirstName 为 null 时从表中选择所有值,那么请在 SQL 查询之外检查它。

IF @FirstName is null 
<query-without-CONTAINS>
ELSE
<query-with-CONTAINS>

我相信,在大多数情况下 @FirstName 不是空的。这样,您将在大多数时间使用全文索引访问表。无论如何,从表中获取所有行都是失败的原因。

关于stored-procedures - 使用 NULL 参数的 SQL Server 全文搜索 - 性能命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34500287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com