我应该在第二列上使用LIKE还是CONTAINS?

时间:2019-01-09 17:10:52

标签: sql-server full-text-search sql-server-2016

我有一个表,该表有2列(nvarchar(max)varbinary(max)。二进制列包含PDF文档,并设置了目录和索引以使用此列。

nvarchar列包含ID的列表(例如“ 12”,“ 55”,“ 69”等)。此列可以包含100个ID,因此文本会很长。

建立搜索查询时,我总是使用CONTAINS,例如:

SELECT *
FROM mytable
WHERE CONTAINS(mybinarycolumn, 'keyword')

根据搜索,我可能会或可能不会使用第二列。所以我将使用IF执行第二个查询,如下所示:

SELECT *
FROM mytable
WHERE CONTAINS(mybinarycolumn, 'keyword') AND
mytextcolumn LIKE '%"55"%'

如果我使用LIKE,会导致性能下降吗?是否可以将CONTAINSLIKE合并为一个CONTAINS,而在搜索中可能使用或不使用mytextcolumn? (如果必须使用text列,则始终使用AND并使用二进制列。)

1 个答案:

答案 0 :(得分:0)

假设标准化选项对您来说不是一个好选择...

我确定将会对性能产生影响。 LIKE从来都不是一项高性能的操作,您无法真正建立任何索引来帮助您。如果幸运的话,SQL优化器将首先执行查询的CONTAINS部分,并将LIKE仅应用于匹配结果。 (显示执行计划将是您的朋友。)

我想不出一种将两列组合成可以用单个CONTAINS搜索的好方法;我想出的任何事情看起来都比查询要多。

您可以尝试在mytextcolumn上放置全文索引,然后在该列上也使用CONTAINS。我不确定这是否会有所帮助,但是值得一试。

我认为mytextcolumn中的值是定界的。如果该列包含未引用的值,例如'12,23,45,67,777,890'而不是'“ 12”,“ 23”,“ 45”,“ 67”,“ 777”,“ 890”',那么您的LIKE条件将无法按您期望的方式工作(因为'%55%'会匹配'11,22,55'和'11,22,555')。

祝你好运。