我在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#应用程序来读取/更新每一行是一种更好的方法。至少我可以在不锁定表格的情况下进行位变化。
我还应该考虑其他方法吗?
答案 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?