У нас есть метод веб-сервиса, который принимает некоторые данные и помещает их в индекс Lucene. Мы используем его для индексирования новых и обновленных записей из нашего веб-приложения asp.net.
Эти записи хранятся в большой таблице SQL Server (20M строк и растут), и мне нужен способ переиндексировать всю таблицу в случае, если текущий индекс будет удален или поврежден. Я не уверен, каков оптимальный способ извлечения фрагментов данных из большой таблицы. В настоящее время мы используем тот факт, что таблица имеет автоинкремент PK, поэтому мы получаем куски по 1000 строк, пока она не начнет ничего не возвращать. Вроде как (на псевдо языке):
i = 0
while (true)
{
SELECT col1, col2, col3 FROM mytable WHERE pk between i and i + 1000
.... if result is empty 20 times in a row, break ....
.... otherwise send result to web service to reindex ....
i = i + 1000
}
Таким образом, нам не нужно ВЫБРАТЬ СЧЕТЧИК (*), который может сильно снизить производительность, и мы просто увеличиваем значения pk, пока не перестанем получать какие-либо результаты. Это имеет свои недостатки: если где-то в таблице будет дыра, превышающая 20 000 значений, она прекратит индексирование, предполагая, что оно достигло конца, но это компромисс, который мы должны пережить сейчас.
Кто-нибудь может предложить более эффективный способ получения данных из таблицы для индексации? Я предполагаю, что мы не первые, кто сталкивается с этой проблемой - в настоящее время широко используются поисковые системы:)