Как лучше всего выполнить частичное совпадение текста в SQL Server 2008 - PullRequest
2 голосов
/ 19 ноября 2009

В SQL Server 2008 у меня есть большая (1 ТБ) таблица, которая выглядит примерно так:

ID int | Flag BIT | Notes NTEXT

Мне нужно выполнить поиск в каждой строке и установить бит Flag в 1, где Notes содержит слово flip

Is

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

«лучший» способ сделать это?

Я думаю, что на такой большой стол может уйти несколько дней. Я пытался запустить

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

и он все еще работает через 10 минут - так что производительность не выглядит хорошей.

Было бы лучше создать приложение на C # для чтения / обновления каждой строки. По крайней мере, я мог бы сделать изменение в битах, не блокируя таблицу в течение нескольких дней.

Есть ли другие методы, которые я должен рассмотреть?

Ответы [ 2 ]

3 голосов
/ 19 ноября 2009

Я бы порекомендовал выполнить выборку, подобную той, что была у вас выше (без предложения 10 лучших), чтобы извлечь идентификаторы записей, которые вы хотите обновить (при условии, что Id проиндексирован), во временную промежуточную таблицу. Ваш выбор будет сканировать всю таблицу, но это лучше, чем делать это в операторе обновления. Если вы можете использовать Read Committed Snapshot Isolation, это будет еще лучше для параллелизма. Если вам нужно использовать метод зацикливания, то есть итеративную проверку небольшого набора записей, используйте идентификатор (или некоторый столбец с возможностью поиска) в качестве основного фильтра, чтобы получить блок записей для сопоставления с образцом и продолжить до завершения. Т.е. как то так:

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

Затем продолжайте итерацию, пока не дойдете до всех диапазонов идентификаторов.

Затем, когда у вас есть идентификаторы для обновления, запустите обновление вместо них.

Как говорит Дмитрий, 10 лучших по-прежнему будут сканировать всю таблицу для этого типа запроса , так что это просто замедлит вас. Если у вас есть идентификаторы или что-то, что делает запрос доступным для поиска, вы можете включить в него предложение top x, чтобы уменьшить влияние параллелизма, но это, вероятно, будет иметь смысл только в том случае, если на вас влияет очень большое количество записей.

2 голосов
/ 19 ноября 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...