Ввод-вывод, связанный с чтениями? Способы оптимизации?

#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. Это зависит от вашей схемы и запросов. Поясняющий план запроса подскажет вам, действительно ли используются ваши индексы или нет.