代码之家  ›  专栏  ›  技术社区  ›  Mr. Flibble

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

  •  2
  • Mr. Flibble  · 技术社区  · 15 年前

    我在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 回复  |  直到 15 年前
        1
  •  3
  •   Community ƒernando Valle    7 年前

    我建议像上面那样运行select(不带top 10子句),将要更新的记录的ID(假定ID已编入索引)提取到临时临时临时表中。您的select将扫描整个表,但这比在update语句中扫描要好。如果你能利用 Read Committed Snapshot Isolation, 这对于并发性来说会更好。如果需要使用循环方法(即反复检查一小组记录),请使用ID(或某些可查找的列)作为主筛选,以获取要匹配模式的记录块,并继续执行,直到完成。例如:

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

    然后继续迭代,直到达到所有ID范围。

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

    正如dmitry所说,前10个选项仍将扫描整个表 for this type of query 所以这只会让你慢下来。一旦您拥有了ID,或者一些可以使查询看起来像是的东西,那么您就可以包含一个top x子句来减少并发性的影响,但是只有当您有大量的记录要影响时,这才可能有意义。

        2
  •  2
  •   Dmitry    15 年前

    你试过吗? full text indexing ?