SQL-сервер выбирает, где в () со многими элементами \ идентификаторами истекает время ожидания
У меня есть сценарий JS узла, который обрабатывает большое количество записей и сравнивает его с существующими записями в базе данных (MS SQL). NodeJS динамически создает запрос. Он извлекает данные из внешнего источника и сравнивает их с моей базой данных. Пример: я получил 1000 записей из внешнего источника и, допустим, все идентификаторы теперь находятся в массиве под названием «ar». Итак, я генерирую запрос:
select from my_table where ID in ('--list of all IDs from ar--')
Когда это 1k, 2k и до 10k, все работает хорошо. Но когда он начинает увеличиваться, запросы начинают истекать.
Поэтому я применяю какой-то механизм разбиения по страницам, я разбиваю массив до фиксированного размера и повторяю его по частям. мета-код:
let total_results = 0
while i < ar.length {
let temp_result = execute_query("select from my_table where ID in ('--list of next 10K IDs from ar--')")
i += 5000
total_results += temp_result
}
* это просто мета-код, а не настоящий код.
Так что я делаю это по частям, и таким образом все не терпит неудач.
Мой вопрос:
Есть ли другое лучшее и более быстрое решение, которое я могу использовать в SQL Server?
1 ответ
Текущий запрос будет анализировать во время выполнения набор идентификаторов, переданных в предложение in. Чем больше количество идентификаторов, тем больше будет влияние на производительность.
Я бы попытался сначала вставить 10K идентификаторов this во временную таблицу.(При необходимости создайте индекс по идентификатору), а затем запросите
select *
from my_table
where id in (select id from temp_table)