如何最好地在SQL Server 2008中进行部分文本匹配

时间:2009-11-19 12:40:41

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

我在SQL Server 2008中有一个大型(1TB)表,看起来像这样:

ID int | Flag BIT | Notes NTEXT

我需要搜索每一行并将Flag位设置为1,其中Notes包含单词flip

UPDATE Table SET Flag = 1
WHERE Notes LIKE '%flip%'

“最好”的方式吗?

我认为在这么大的桌子上运行可能需要数天时间。我试过运行

SELECT TOP (10) * FROM Table
WHERE Notes LIKE '%flip%'

并且它在10分钟后仍在运行 - 所以性能看起来并不好。

创建一个C#应用程序来读取/更新每一行是一种更好的方法。至少我可以在不锁定表格的情况下进行位变化。

我还应该考虑其他方法吗?

2 个答案:

答案 0 :(得分:3)

我建议像上面那样运行一个select(没有前10个子句)来将要更新的记录的ID(假设Id被索引)拉出到临时临时表中。您的选择将扫描整个表,但这比在更新语句中这样做更好。如果您可以使用Read Committed Snapshot Isolation,,那么并发性会更好。如果您需要使用循环方法,即迭代地检查一小组记录,请使用ID(或一些可搜索列)作为主过滤器来获取一大块记录以进行模式匹配并继续直到完成。就是这样的:

Select  top x id
From    Table
where   Id between 1 and 100000
And     Textcolumn like('%blah%')

然后继续迭代,直到您点击所有ID范围。

然后,一旦您有要更新的ID,请改为针对这些更新。

就像德米特里所说的那样,前十名选择仍将扫描整个表格for this type of query,这样只会减慢你的速度。一旦你拥有了ID或者可以查询查询的东西,你就可以包含一个top x子句来减少并发性影响,但是如果你有大量的记录需要影响,这可能才有意义。

答案 1 :(得分:2)

您是否尝试过full text indexing