Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQLServer2008中最好地进行部分文本匹配_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

如何在SQLServer2008中最好地进行部分文本匹配

如何在SQLServer2008中最好地进行部分文本匹配,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我在SQL Server 2008中有一个大的(1TB)表,看起来像这样: Select top x id From Table where Id between 1 and 100000 And Textcolumn like('%blah%') ID int |标志位| Notes NTEXT 我需要搜索每一行并将标志位设置为1,其中Notes包含单词翻转 是 “最好”的方法是什么 我想在这么大的桌子上运行可能需要几天的时间。我试过运行一个 SELECT TOP (10

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

Select  top x id
From    Table
where   Id between 1 and 100000
And     Textcolumn like('%blah%')
ID int |标志位| Notes NTEXT

我需要搜索每一行并将
标志
位设置为1,其中Notes包含单词
翻转

“最好”的方法是什么

我想在这么大的桌子上运行可能需要几天的时间。我试过运行一个

SELECT TOP (10) * FROM Table
WHERE Notes LIKE '%flip%'
10分钟后它仍在运行,所以性能看起来不太好

创建一个C#应用程序来读取/更新每一行是更好的方法吗。至少我可以零零碎碎地做这些改变,而不用把桌子锁上几天


你有没有尝试过其他的方法?

> P>你试过了吗?

< P>我建议你运行一个像上面这样的选择(没有前10条),把要更新的记录的ID(假设Id被索引)拖到临时分级表中。select将扫描整个表,但这比在update语句中扫描要好。如果您可以利用它,那么对于并发性来说,这将更好。如果需要使用循环方法,即迭代检查一小组记录,请使用ID(或某个可查找的列)作为主过滤器,以获取要模式匹配的记录块,并继续直到完成。例如:

Select  top x id
From    Table
where   Id between 1 and 100000
And     Textcolumn like('%blah%')
然后继续迭代,直到达到所有ID范围

然后,一旦您有了要更新的ID,就可以针对这些ID运行更新


正如Dmitry所说,前10个选项仍将扫描整个表,因此这将使您的速度减慢。一旦您有了ID,或者有了可以查找查询的东西,您就可以包含一个top x子句来减少并发性影响,但是只有当您有大量记录要影响时,这才有意义

谢谢你,德米特里。但我想快速解决这个问题。在这样大小的表上添加全文索引将花费很长时间,而且可能会有过大的杀伤力。我认为没有快速的解决方案,因为这样的查询无法使用任何索引,所以它们必须扫描整个表,并根据您的模式匹配每一行。你的桌子是1TB大,所以需要时间。除非您在不同的机器上获取表的一部分并并行处理它们(这可能也太过分了),否则您几乎无法在客户端更好地处理它。请参见上面的内容,但全文搜索对给定术语/单词内的后缀或前导通配符搜索没有帮助。请注意,全文索引对后缀或中期模式匹配没有帮助,就像您在这里指定的那样(即前导通配符搜索)。您可能还注意到,ntext已弃用,您需要将字段定义更改为nvarchar(max)。