#performance #io #sqlite
#Производительность #io #sqlite
Вопрос:
В SQLite я считываю данные из одной базы данных с помощью SELECT
, выполняю некоторые изменения и записываю их в другую базу данных.
Глядя на выходные данные iotop
, производительность процесса (с использованием только одного ядра) ограничена вводом-выводом (IO>80%, CPU<20%). Большая часть действий, которые я вижу в iotop
, выполняется в разделе «ЧТЕНИЕ с ДИСКА», и только время от времени что-то отображается в разделе «ЗАПИСЬ На ДИСК».
Вероятно ли, что производительность процесса зависит от SELECT
транзакций чтения? В основном вся информация, связанная с производительностью для SQLite, которую я вижу в Интернете, касается INSERT
/ write. Есть ли что-нибудь, что нужно знать и оптимизировать при чтении данных?
Может ли неэффективный запрос, например, при выборе поля с отсутствующим индексом, оказать более сильное влияние на ввод-вывод, чем на процессор?
Комментарии:
1. Если у вас много операций записи, вы можете оптимизировать их, объединив в одну транзакцию. Оптимизировать чтения сложнее …
2. Этот вопрос слишком широкий. Если вы хотите ускорить конкретные запросы, спросите о них.
3. Перед началом работы рассмотрите возможность размещения базы данных, из которой вы читаете, на диске оперативной памяти.
4. @MarkSetchell Это было бы здорово, только я боюсь, что файл слишком большой (155 ГБ файла против 192 ГБ памяти)…
5. Какое у вас оборудование? Если вы считываете данные с одного SATA-накопителя S-L-O-W с частотой вращения 5400 оборотов в минуту, вам повезет, если вы получите 50-60 операций ввода-вывода в секунду. комментарий @MarkSetchell о RAMdisk — это конкретная реализация самого простого способа запустить что-то быстрее: запустить это на более быстром оборудовании.
Ответ №1:
Вопрос довольно широкий, поэтому и ответ таков: Да, выбор в поле с отсутствующим индексом может оказать сильное влияние на ввод-вывод.
В зависимости от вашего запроса, схемы и данных SQLite может выполнять полное сканирование таблицы.
Выполнение объяснения плана запроса может дать вам хорошее представление о том, что SQLite делает в ваших конкретных обстоятельствах.
Комментарии:
1. Да, однако все соответствующие поля проиндексированы. Есть еще способы оптимизации?
2. Это зависит от вашей схемы и запросов. Поясняющий план запроса подскажет вам, действительно ли используются ваши индексы или нет.