Имеет ли параметр SQLite `NOT IN` ограничение по размеру? - PullRequest
0 голосов
/ 27 октября 2018

У меня есть БД SQLite, где я выполняю запрос, подобный

  Select * from table where col_name NOT IN ('val1','val2')

Обычно я получаю огромный список значений с сервера, и мне нужно выбрать значения, которых нет в данном списке.

В настоящее время работает нормально, без проблем. Но количество значений с сервера становится огромным, так как база данных сервера часто обновляется.

Итак, я могу получить тысячи строковых значений, которые мне нужно передать в NOT IN

Мой вопрос: это вызовет какие-либо проблемы с производительностью в будущем? Есть ли у параметра NOT IN ограничение по размеру? (например, максимальные 10000 значений, которые вы можете проверить)?

Приведет ли это к какой-нибудь аварии?

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Имея несколько значений для проверки, вам лучше поместить их в таблицу с индексом в столбце, содержащем их.Тогда такие вещи, как

SELECT *
FROM table
WHERE col_name NOT IN (SELECT value_col FROM value_table);

или

SELECT *
FROM table AS t
WHERE NOT EXISTS (SELECT 1 FROM value_table WHERE value_col = t.col_name);

, будут достаточно эффективными независимо от того, сколько записей в value_table, поскольку этот индекс будет использоваться для поиска записей.

Плюс, конечно, намного проще повторно использовать подготовленные операторы, потому что вам не нужно создавать новый и заново связывать каждое значение (Вы используете подготовленные операторы с заполнителямидля этих значений, верно, и не пытаться поместить их содержимое встроенным в строку?) каждый раз, когда вы добавляете значение к тем, которые вам нужно проверить.Вы просто вставляете его в value_table.

0 голосов
/ 27 октября 2018

Это официальная ссылка о различных ограничениях в sqlite.Я думаю, Максимальная длина оператора SQL может относиться к вашему случаю.Значение по умолчанию - 1000000, и оно настраивается.

Кроме этого, я не думаю, что какие-либо ограничения существовали для номеров параметров в предложении NOT IN.

...