Выполнение запросов с использованием count (*) для таблиц с несколькими строками (более 300 миллионов) - PullRequest
0 голосов
/ 18 января 2012

Я понимаю, что существуют ограничения для использования sqlite, но я хотел бы знать, сможет ли он справиться с этим сценарием.

В моей таблице более 300 миллионов записей, а база данных составляет около 12 гигабайт.Утилита импорта данных с помощью sqlite хороша и быстра.Но затем я добавил индекс к строковому столбцу в этой таблице, и он выполнялся всю ночь, чтобы завершить эту операцию.Я не сравнивал это с другими БД, но мне показалось довольно медленным.

Теперь, когда мой индекс добавлен, я хочу найти дубликаты в данных.Итак, я пытаюсь выполнить запрос «count> 0», и, похоже, он также занимает часы.Мой запрос выглядит так:

select col1, count(*) 
from table1
group by col1
having count(*) > 1

Я бы предположил, что этот запрос будет использовать мой индекс на col1, но медленное выполнение запроса заставляет меня задуматься, а не так ли?

Возможно, SQL-сервер справится с такими вещами лучше?

Ответы [ 3 ]

3 голосов
/ 19 января 2012

SQLite count() не оптимизирован - он выполняет полное сканирование таблицы , даже если он проиндексирован.Вот рекомендуемый подход для ускорения вещей .Запустите EXPLAIN QUERY PLAN для проверки, и вы увидите:

EXPLAIN QUERY PLAN SELECT COUNT(FIELD_NAME) FROM TABLE_NAME;

Я получаю что-то вроде этого:

0|0|0|SCAN TABLE TABLE_NAME (~1000000 rows)
1 голос
/ 18 января 2012

Но затем я добавил индекс к строковому столбцу в этой таблице, и он выполнялся всю ночь, чтобы завершить эту операцию.Я не сравнивал это с другими БД, но мне показалось довольно медленным.

Не хочу говорить, но как выглядит ваш сервер?Не спорю, но это, возможно, очень ресурсоемкая операция, которая может потребовать большого количества операций ввода-вывода, и обычные компьютеры или веб-серверы chehap с медленным жестким диском не подходят для значительной работы с базой данных.Я работаю над проектами в сотни гигабайт дБ, и мой самый маленький сервер «больших данных» имеет 2 SSD и 8 Velociraptors для данных и журнала.Самый большой из них имеет 3 узла хранения с общим количеством SSD-дисков емкостью 1000 Гб - просто потому, что IO - это то, чем живет и дышит сервер БД.запрос, и кажется, что это занимает часы

Сколько оперативной памяти?Достаточно, чтобы вместить все это в память или виртуальный сервер с нехваткой памяти, где недостающая память взрывается до плохого ввода-вывода?Сколько памяти может использовать SqlLite?Как настроена температура?В памяти?Sql-сервер, возможно, будет использовать много памяти / базы данных tempdb для этого типа проверки.

0 голосов
/ 18 января 2012

увеличить кеш sqlite через PRAGMA cache_size=<number of pages>.используемая память - <number of pages> раз <size of page>.(который можно установить с помощью PRAGMA page_size=<size of page>)

, установив эти значения в 16000 и 32768 соответственно (или около 512 МБ), я смог снизить объем загрузки этой программы с 20 минут до 2 минут.(хотя я думаю, что если бы диск в этой системе не был таким медленным, это, возможно, не имело бы такого большого эффекта)

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

...