|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Э-э-э ... Есть какие-то сомнения, что на "холодном старте" grep обскачет sqlite? Или будет сравнение удавки с бечевой (sqlite vs PG vs MariaDB vs Kafka vs ...)? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 16:51 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Я разве говорил про постгрес? Дело в том, что в SQLite, по умолчанию каждый инсерт проходит в отдельной транзакции. Т.е., проверяется целостность и все такое, а так же расширение базы, по мере надобности.. Причем, это каждый раз. При каждом инсерте. Это, ясен пень, можно побороть. Но поиск все равно происходит сканом. Если не проиндексировано имхо. А индексация - это сортировка и хеширование, что тоже время занимает. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 17:06 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Мне греп не интересен. Просто хочу узнать обстановку с современным sqlite. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 17:12 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Поиск в базе с индексами (не по like, а по =) - что при "холодном" старте, что при "горячем", все равно быстрее, чем в текстовом файле А индексация - это сортировка и хеширование, что тоже время занимает Так один раз. Создали базу. Залили данные. Пользуемся В контексте дискуссии, уже не очень понятен термин "холодный старт". Так можно договориться, что это время от начала форматирования винчестера, до показа страницы, включая время вбивания 40 млн. строк с клавиатуры. В 98% случаев при HTTP никакого холодного старта не будет, стандартный CGI уже с 1995 года не модно AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 17:19 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
mayton Мне греп не интересен. Просто хочу узнать обстановку с современным sqlite. Я не уверен, что он радикально изменился с тех пор, когда про него Чингиз написал. Но у меня имеются (уже завершенных) несколько вэб-проектов на нем. Офигенно нравится. Для вэба - самое то. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 17:21 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
mayton Мне греп не интересен. Просто хочу узнать обстановку с современным sqlite. С современным не знаю. Лет 5 назад - работало. И быстро работало (на моем паттерне insert'ов, select'ов минимум в 7-10 раз быстрее PostgreSQL, все запросы однострочные, экономия времени на коммуникации между приложением и ядром базы /один процесс/) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 17:22 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Поиск в базе с индексами (не по like, а по =) - что при "холодном" старте, что при "горячем", все равно быстрее, чем в текстовом файле В первом исходнике у автора видна наивная попытка делать поиск по вхождению строки Код: sql 1.
Если он не послушается Диминого совета и все-таки оставит like (захочет искать Код: sql 1.
), то ему тогда более универсальным решением будет вот такой подход как здесь https://www.sqlite.org/fts5.html Коробочный текстовый поиск. Запрос надо будет подпилить зато явное преимущество индекса. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 17:31 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
А, вспомнил. Пять лет назад лайк по русским буквам не работал. Исправили? Я читал инструкцию, как его перекомпилить. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 17:35 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
ShSerge А, вспомнил. Пять лет назад лайк по русским буквам не работал. Исправили? Я читал инструкцию, как его перекомпилить. Не верю ( C ) Upper, lower - могут работать/не работать. Но как может не работать Like? Если 8-битная кодировка, откуда он знает (какая ему разница), русские буквы или нет? У Вас проблемы и решения какие-то странные. То дефолтный autocommit не отключили, то инструкцию прочитать надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 17:43 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Чтож вы так зло. Автокоммит? Интересно. И что, автор его отключил? А насчёт русских букв - известная история, можете погуглить. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 18:01 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Ну да с ловер и уппер проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 18:03 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
У них (sqlite) странный багтрекер https://www.sqlite.org/src/wiki?name=Bug Reports Ничего толком найти нельзя. Пробовал по слову russian искать - ничего нет. Или инцедентов не было или они просто отдали эту часть функционала куда-то третьим конторам. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 18:16 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
mayton, Проще проверить. Щас докурю. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 18:25 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Проверил. Код: sql 1. 2. 3.
Это было - "Рога и копыта". Так не работает, а если написать Рога, то работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 18:52 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
mayton Хорошо. А сколько секунд или милисекунд у него занимает эта операция? Код: php 1. 2.
Тоесть я хочу понять метрику "готовность системы выдать 1-й байт выборки" (Time to first byte (TTFB)) для двигателя sqlite в соотношении к Postgresql к примеру. Разумеется я буду жесток и буду требовать время холодного старта тоже включить в это измерение. Мне это интересно потому что это тоже юзейс данного топика. Какой-то неадекватный запрос. По-хорошему должна быть ошибка синтаксиса т.к. нет ORDER BY Сразу скажу что sqlite как СУБД для сайта это очень плохая идея, он не для этого создан. С полноценной СУБД нет смысла сравнивать. Тут топик ушел непонятно в какую сторону, ТС пропал, поэтому немножко добавлю условий как я понял первый пост: есть некий текстовый файл в котором надо найти нужные записи. ТС решил залить его в таблицу БД, надеясь что будет работать быстрее. Я предположил что файл только для чтения, например какой-то большой справочник, который редко обновляется. Т.е. задача не требует функционала полноценной СУБД. Как уже написал sqlite для другого, он может разделять кэш между потоками одного процесса, но насколько знаю скрипты PHP запускается разными процессами, поэтому вся прогретость будет сводиться к тому что нужные страницы окажутся в дисковом кэше, т.е. тут никакой разницы с чтением напрямую из файла. Если запрос приводит к скану таблицы (... like '%...') то не будет никакого выигрыша по сравнению с чтением файла. НО если возможно задействовать индекс, то ускорение будет за счет чтения только нужных страниц. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 20:28 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Dima T Какой-то неадекватный запрос. По-хорошему должна быть ошибка синтаксиса т.к. нет ORDER BY ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 21:34 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Dima T Какой-то неадекватный запрос. По-хорошему должна быть ошибка синтаксиса т.к. нет ORDER BY Я не сказал что должен, я сказал "По-хорошему должна быть ошибка". Теория РСУБД гласит что все записи равноправны и не имеют порядка, поэтому требование получить первую бессмысленно без указания порядка сортировки, это требование дать одну любую из имеющихся, что полезно разве что для написания ПГСЧ. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 21:43 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Dima T поэтому требование получить первую бессмысленно без указания порядка сортировки, это требование дать одну любую из имеющихся, что полезно разве что для написания ПГСЧ. Синтаксис, на самом деле, не определяет семантику. Более того - не имеет права её определять. Это правила грамматики, но только от автора зависит будет ли иметь смысл грамматически корректное приложение. Это мы ещё даже не погружаемся в пучины какой-нибудь гносеологии и не начали ломать копья о смысле термина "бессмысленный" ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 04:43 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Я так понимаю, что сортировка по умолчанию - это сортировка по первичному ключу. А так да, дима_т вобщем правильно говорит. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 06:38 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Dima T mayton Хорошо. А сколько секунд или милисекунд у него занимает эта операция? Код: php 1. 2.
Тоесть я хочу понять метрику "готовность системы выдать 1-й байт выборки" (Time to first byte (TTFB)) для двигателя sqlite в соотношении к Postgresql к примеру. Разумеется я буду жесток и буду требовать время холодного старта тоже включить в это измерение. Мне это интересно потому что это тоже юзейс данного топика. Какой-то неадекватный запрос. По-хорошему должна быть ошибка синтаксиса т.к. нет ORDER BY Тут - разные аспекты. Есть реляционная алгебра. И есть конкретная реализация SQL. Сам по себе SQL и современные DBMS к примеру вобщем-то не требуют существования PK. Многие создают лог-таблицы без PK но с сегментацией по времени. По дням или неделям или месяцам. Такой подход базируется на предположении что лог нужен но на всякий пожарный случай. И доступ к нему будет редкий. Можно и сортирнуть если что за последний день. Есть процессы ETL которые тоже не соблюдают ордеринг строк или полагаются на дефолтный который по случайному стечению обстоятельств (IOT/ClusteredTable) может быть сортированным относительно ключа если таковой был объявлен. Это тоже лежит вне реляционной алгебры. Есть процессы сбора статистики по БД. Которые используют семплирование. Буквально - это выборка рандомных 3-5% (или любых других процентов) от общего объема таблицы. Где или откуда эти проценты выбираются - это ноу-хау каждой системы. Оракл ЕМНИП выбирает набор DB_BLOCKS и уже из них берет семплирование. Это - тоже физика и без нее БД просто не может жить. Есть технически хинты или хитрости которые использует разработчик. Например чтобы проверить что таблица не пуста, junior SQL develper считает count(*) по всей таблице. А опытный делает тот-же count(*) с limit. Хотя для реляционной алгебры - безразлично но для физической модели очень даже важно. В данном конкретном примере меня интересовало время чистого холодного старта БД sqlite и выборка любой первой попавшейся строки из таблицы. Я пытался сравнить sqlite с h2/hsql/derby в их способе хранения журнала и сегмента данных. Некоторые из них поджимают журнал. Некоторые делают это отложенной операцией. Впрочем я могу это тоже проверить вместе с sqlite. И если sqlite ленив и не поджимает журнал то я буду вынужден ждать первой строки до тех пор пока вся история изменений таблицы не будет применена. Ведь история может содержать и deletes/updates. IMHO. Именно поэтому я написал запрос таким образом. Если-бы я добавил order by то для миллиардной неиндексированной таблицы это заняло-бы длинельное время и моя оценка была бы сложной. Мне пришлось-бы учитывать неизвестное время сортировки. А так я получил чистое время прогрева всего стека. UI-щики которые рисуют приложения в браузере обычно меряют TTFB для endpoints. Чтобы оценить как быстро можно начать рендеринг пользовательского интерфейса исходя из свойств back-end. И если TTFB плохой то бесполезно что-то оптимизировать в графической части. Надо лечить back. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 09:30 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
mayton В данном конкретном примере меня интересовало время чистого холодного старта БД sqlite и выборка любой первой попавшейся строки из таблицы. Я пытался сравнить sqlite с h2/hsql/derby в их способе хранения журнала и сегмента данных. Некоторые из них поджимают журнал. Некоторые делают это отложенной операцией. Впрочем я могу это тоже проверить вместе с sqlite. И если sqlite ленив и не поджимает журнал то я буду вынужден ждать первой строки до тех пор пока вся история изменений таблицы не будет применена. Ведь история может содержать и deletes/updates. IMHO. С журналом все просто, его обычно нет если нет открытых транзакций на запись: https://habr.com/ru/post/149635/По умолчанию журнал ведется в режиме DELETE . Это означает, что файл журнала удаляется после завершения транзакции. Сам факт наличия файла с журналом в этом режиме означает для SQLite, что транзакция не была завершена, база нуждается в восстановлении. Файл журнала имеет имя файла БД, к которому добавлено "-journal". Как уже писал: подозреваю что данная БД используется только для чтения, если так, то затраты минимальны - проверить наличие файла с журналом. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 09:49 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
Я потестил с помощью штатной утилиты sqlite3.exe - открытие файла БД происходит не сразу, а только когда требуется обращение к БД, т.е. в момент передачи запроса. В таком случае в режиме только чтение можно вообще отключить использование журнала перед подачей запроса Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 10:14 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
ХМ... а что тут like не летает? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 10:25 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
А сорян. Все нормально. Нужна какая-то прагма. Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 10:43 |
|
Помогите с поиском по 40млн строк в один столбец.
|
|||
---|---|---|---|
#18+
bonnie Имеется тхт. файл с около 40кк строк. Строки из 20-30 латинских знаков без пробелов. Хочу сделать поиск по наличию строки. Простым запросом. Сейчас текстовый файл переведен в базу sqlite. не принципиальго но посчитал простым решением. Самое простое решение - использовать Pos() для строк файла. Быстрее будет нечто похожее для буфера чтения, без предварительного выделения строк, но это сложнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 11:30 |
|
|
start [/forum/topic.php?fid=16&msg=40091920&tid=1339638]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
others: | 261ms |
total: | 416ms |
0 / 0 |