powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите с поиском по 40млн строк в один столбец.
25 сообщений из 79, страница 2 из 4
Помогите с поиском по 40млн строк в один столбец.
    #40091916
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Э-э-э ...
Есть какие-то сомнения, что на "холодном старте" grep обскачет sqlite?
Или будет сравнение удавки с бечевой (sqlite vs PG vs MariaDB vs Kafka vs ...)?
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091920
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Я разве говорил про постгрес?
Дело в том, что в SQLite, по умолчанию каждый инсерт проходит в отдельной транзакции. Т.е., проверяется целостность и все такое, а так же расширение базы, по мере надобности.. Причем, это каждый раз. При каждом инсерте. Это, ясен пень, можно побороть. Но поиск все равно происходит сканом. Если не проиндексировано имхо. А индексация - это сортировка и хеширование, что тоже время занимает.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091922
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне греп не интересен. Просто хочу узнать обстановку с современным sqlite.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091926
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поиск в базе с индексами (не по like, а по =) - что при "холодном" старте, что при "горячем", все равно быстрее, чем в текстовом файле

А индексация - это сортировка и хеширование, что тоже время занимает
Так один раз.
Создали базу. Залили данные. Пользуемся

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

В 98% случаев при HTTP никакого холодного старта не будет, стандартный CGI уже с 1995 года не модно AFAIK
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091927
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Мне греп не интересен. Просто хочу узнать обстановку с современным sqlite.

Я не уверен, что он радикально изменился с тех пор, когда про него Чингиз написал. Но у меня имеются (уже завершенных) несколько вэб-проектов на нем. Офигенно нравится. Для вэба - самое то.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091928
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Мне греп не интересен. Просто хочу узнать обстановку с современным sqlite.

С современным не знаю. Лет 5 назад - работало. И быстро работало (на моем паттерне insert'ов, select'ов минимум в 7-10 раз быстрее PostgreSQL, все запросы однострочные, экономия времени на коммуникации между приложением и ядром базы /один процесс/)
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091932
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Поиск в базе с индексами (не по like, а по =) - что при "холодном" старте, что при "горячем", все равно быстрее, чем в текстовом файле

В первом исходнике у автора видна наивная попытка делать поиск по вхождению строки
Код: sql
1.
LIKE '%$search_q%'


Если он не послушается Диминого совета и все-таки оставит like (захочет
искать

Код: sql
1.
*Гурбангулы*берды-керды*амедов*



), то ему тогда более универсальным
решением будет вот такой подход как здесь

https://www.sqlite.org/fts5.html

Коробочный текстовый поиск. Запрос надо будет подпилить зато явное преимущество индекса.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091936
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, вспомнил. Пять лет назад лайк по русским буквам не работал. Исправили?
Я читал инструкцию, как его перекомпилить.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091938
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSerge
А, вспомнил. Пять лет назад лайк по русским буквам не работал. Исправили?
Я читал инструкцию, как его перекомпилить.

Не верю ( C )

Upper, lower - могут работать/не работать. Но как может не работать Like? Если 8-битная кодировка, откуда он знает (какая ему разница), русские буквы или нет?

У Вас проблемы и решения какие-то странные. То дефолтный autocommit не отключили, то инструкцию прочитать надо.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091948
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Чтож вы так зло. Автокоммит? Интересно. И что, автор его отключил? А насчёт русских букв - известная история, можете погуглить.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091949
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да с ловер и уппер проблема.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091958
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У них (sqlite) странный багтрекер https://www.sqlite.org/src/wiki?name=Bug Reports

Ничего толком найти нельзя. Пробовал по слову russian искать - ничего нет. Или инцедентов
не было или они просто отдали эту часть функционала куда-то третьим конторам.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091964
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Проще проверить. Щас докурю.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40091983
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил.
Код: sql
1.
2.
3.
Select idCompany, CompanyShortName
From dicCompany
Where Upper(CompanyShortName) Like upper('%рога%')


Это было - "Рога и копыта".
Так не работает, а если написать Рога, то работает.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40092020
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Хорошо. А сколько секунд или милисекунд у него занимает эта операция?

Код: php
1.
2.
$db = new PDO('sqlite:'. @DB_FILENAME);
$res = $db->query("SELECT * FROM table1 LIMIT 1");



Тоесть я хочу понять метрику "готовность системы выдать 1-й байт выборки" (Time to first byte (TTFB)) для двигателя sqlite
в соотношении к Postgresql к примеру. Разумеется я буду жесток и буду требовать время холодного старта тоже включить
в это измерение.

Мне это интересно потому что это тоже юзейс данного топика.

Какой-то неадекватный запрос. По-хорошему должна быть ошибка синтаксиса т.к. нет ORDER BY

Сразу скажу что sqlite как СУБД для сайта это очень плохая идея, он не для этого создан. С полноценной СУБД нет смысла сравнивать.

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

Как уже написал sqlite для другого, он может разделять кэш между потоками одного процесса, но насколько знаю скрипты PHP запускается разными процессами, поэтому вся прогретость будет сводиться к тому что нужные страницы окажутся в дисковом кэше, т.е. тут никакой разницы с чтением напрямую из файла. Если запрос приводит к скану таблицы (... like '%...') то не будет никакого выигрыша по сравнению с чтением файла. НО если возможно задействовать индекс, то ускорение будет за счет чтения только нужных страниц.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40092045
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Какой-то неадекватный запрос. По-хорошему должна быть ошибка синтаксиса т.к. нет ORDER BY
С каких это пор недетерменированный запрос должен генерировать синтаксическую ошибку???
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40092049
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Dima T
Какой-то неадекватный запрос. По-хорошему должна быть ошибка синтаксиса т.к. нет ORDER BY
С каких это пор недетерменированный запрос должен генерировать синтаксическую ошибку???

Я не сказал что должен, я сказал "По-хорошему должна быть ошибка". Теория РСУБД гласит что все записи равноправны и не имеют порядка, поэтому требование получить первую бессмысленно без указания порядка сортировки, это требование дать одну любую из имеющихся, что полезно разве что для написания ПГСЧ.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40092091
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
поэтому требование получить первую бессмысленно без указания порядка сортировки, это требование дать одну любую из имеющихся, что полезно разве что для написания ПГСЧ.
В вашем посыле содержится логическая ошибка.
Синтаксис, на самом деле, не определяет семантику. Более того - не имеет права её определять.
Это правила грамматики, но только от автора зависит будет ли иметь смысл грамматически корректное приложение.
Это мы ещё даже не погружаемся в пучины какой-нибудь гносеологии и не начали ломать копья о смысле термина "бессмысленный"
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40092096
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что сортировка по умолчанию - это сортировка по первичному ключу.
А так да, дима_т вобщем правильно говорит.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40092108
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
mayton
Хорошо. А сколько секунд или милисекунд у него занимает эта операция?

Код: php
1.
2.
$db = new PDO('sqlite:'. @DB_FILENAME);
$res = $db->query("SELECT * FROM table1 LIMIT 1");



Тоесть я хочу понять метрику "готовность системы выдать 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.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40092124
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
В данном конкретном примере меня интересовало время чистого холодного старта БД sqlite и выборка
любой первой попавшейся строки из таблицы. Я пытался сравнить sqlite с h2/hsql/derby в их способе
хранения журнала и сегмента данных. Некоторые из них поджимают журнал. Некоторые делают
это отложенной операцией. Впрочем я могу это тоже проверить вместе с sqlite. И если sqlite ленив
и не поджимает журнал то я буду вынужден ждать первой строки до тех пор пока вся история изменений
таблицы не будет применена. Ведь история может содержать и deletes/updates. IMHO.

С журналом все просто, его обычно нет если нет открытых транзакций на запись:
https://habr.com/ru/post/149635/По умолчанию журнал ведется в режиме DELETE .

Это означает, что файл журнала удаляется после завершения транзакции. Сам факт наличия файла с журналом в этом режиме означает для SQLite, что транзакция не была завершена, база нуждается в восстановлении. Файл журнала имеет имя файла БД, к которому добавлено "-journal".
Как уже писал: подозреваю что данная БД используется только для чтения, если так, то затраты минимальны - проверить наличие файла с журналом.
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40092132
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я потестил с помощью штатной утилиты sqlite3.exe - открытие файла БД происходит не сразу, а только когда требуется обращение к БД, т.е. в момент передачи запроса.
В таком случае в режиме только чтение можно вообще отключить использование журнала перед подачей запроса
Код: sql
1.
pragma journal_mode=OFF;
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40092136
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХМ... а что тут 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.
sqlite> select count(*) from words;
752563301
Run Time: real 120.602 user 2.168943 sys 10.695976
sqlite> 
sqlite> explain query plan select word from words where word like 'sql%';
QUERY PLAN
`--SCAN TABLE words
Run Time: real 0.001 user 0.000134 sys 0.000000
sqlite> 
sqlite> .schema words
CREATE TABLE words(word text);
CREATE INDEX idx_words on words(word);
sqlite> 
sqlite> 
sqlite> explain query plan select word from words where word like = 'sql';
Run Time: real 0.000 user 0.000000 sys 0.000028
Error: near "=": syntax error
sqlite> explain query plan select word from words where word  = 'sql';
QUERY PLAN
`--SEARCH TABLE words USING COVERING INDEX idx_words (word=?)
Run Time: real 0.000 user 0.000000 sys 0.000102
sqlite> 
sqlite> explain query plan select word from words indexed by idx_words where word = 'sql';
QUERY PLAN
`--SEARCH TABLE words USING COVERING INDEX idx_words (word=?)
Run Time: real 0.000 user 0.000000 sys 0.000092
sqlite> explain query plan select word from words indexed by idx_words where word LIKE 'sql%';
Run Time: real 0.000 user 0.000000 sys 0.000083
Error: no query solution
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40092142
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сорян. Все нормально. Нужна какая-то прагма.

Код: sql
1.
2.
3.
4.
5.
6.
7.
sqlite> pragma case_sensitive_like = ON;
Run Time: real 0.000 user 0.000000 sys 0.000033
sqlite> 
sqlite> explain query plan select word from words indexed by idx_words where word LIKE 'sql%';
QUERY PLAN
`--SEARCH TABLE words USING COVERING INDEX idx_words (word>? AND word<?)
Run Time: real 0.000 user 0.000122 sys 0.000000
...
Рейтинг: 0 / 0
Помогите с поиском по 40млн строк в один столбец.
    #40092174
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bonnie
Имеется тхт. файл с около 40кк строк. Строки из 20-30 латинских знаков без пробелов.
Хочу сделать поиск по наличию строки. Простым запросом.
Сейчас текстовый файл переведен в базу sqlite. не принципиальго но посчитал простым решением.


Самое простое решение - использовать Pos() для строк файла.

Быстрее будет нечто похожее для буфера чтения,
без предварительного выделения строк, но это сложнее.
...
Рейтинг: 0 / 0
25 сообщений из 79, страница 2 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите с поиском по 40млн строк в один столбец.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]