LINUX.ORG.RU
ФорумTalks

SQLite, давно хотел спросить

 


0

3

За что его многие искренне ненавидят? Насколько мне известно, вполне хорошая нишевая штука, хранить много взаимосвязанных данных в одном файле и быстро их оттуда доставать в один поток. Может дело в том, что его надо правильно применять?


Ответ на: комментарий от KRoN73

Кстати, когда я импортирую свои 2,5 MB закладок огнелис виснет намертво на 2 минуты на нетбуке. Хоть по часам засекай. Жутко бесит. Теряюсь в догадках, что он такого страшного делает с несчастным html на пару метров.

Gregon
() автор топика
Ответ на: комментарий от Gregon

он скорее всего каждую запись отдельно пишет, итого после каждой же записи дергается fsync

wota ★★
()

Не знаю кто не навидит, наоборот удобно использовать, есть всевозможные библиотеки и биндинги, некий универсальный контейнер, главное не делать из него сервер:)

TheMixa ★★★
()
Ответ на: комментарий от nikodymus

Foreign key constraints это тоже интегрити. Но вот мускуль ее не поддерживает.

Серьезно? Как им пользуются то вообще?

Я могу сказать кто ими не пользуется.

Absurd ★★★
()
Ответ на: комментарий от leave

Затем, что его часто используют не по назначению. Очень часто.

Не по назначению, это как? Обычно люди которые так говорят, предлгают вместо онного использовать файлики и передовые технологии xml.

Evil_Wizard ★★★
()
Ответ на: комментарий от nikodymus

Кроме C есть еще и другие, в том числе тот же PHP c «быдлокодерами».

в PHP есть intval(), которая делает из чего угодно INTEGER. Я не понимаю проблемы? Для строк есть специальная функция: http://www.php.net/manual/ru/function.sqlite-escape-string.php

Может тогда и ключи выбросить

зачем тогда СУБД нужна?

drBatty ★★
()
Ответ на: комментарий от leave

Затем, что его часто используют не по назначению. Очень часто.

Эт где, например? Другое дело когда часто MSSQL используют зачем-то.

Siado ★★★★★
()
Ответ на: комментарий от Evil_Wizard

Обычно люди которые так говорят, предлгают вместо онного использовать файлики

ты не поверишь, но иногда действительно лучше использовать «файлики».

и передовые технологии xml.

хотя может мы и о разных вещах.

drBatty ★★
()
Ответ на: комментарий от wota

Я, конечно, быдлокодер тот ещё, но вот набросал такой скриптик:

#!/usr/bin/env perl
#

use strict;
use warnings;
use DBI;

my $db_type = shift;
my ($db_handle, $db_chandle);
if ($db_type eq 'sqlite') {
        $db_handle = DBI->connect("DBI:SQLite:dbname=tmp/sqlite.db","","");
} else {
        my $db_args = {
                AutoCommit => 1,
                RaiseError => 1
        };
        $db_handle = DBI->connect("DBI:mysql:rssad:localhost:3306", 'rssad', '', $db_args);
        $db_handle->{InactiveDestroy} = 1;
}

my $db_query = $db_handle->prepare("CREATE TABLE lortest (id int, value varchar(255))");
$db_query->execute();
sleep(5);

for (my $i = 1; $i <= 20; $i++) {
        my $pid = fork();
        if ($pid == 0) {
                my $fpid = $$;
                print(time(), ": ", "Started writer: $fpid", "\n");
                if ($db_type eq 'sqlite') {
                        $db_chandle = DBI->connect("DBI:SQLite:dbname=tmp/sqlite.db","","");
                } else {
                        my $db_args = {
                                AutoCommit => 1,
                                RaiseError => 1
                        };
                        $db_chandle = DBI->connect("DBI:mysql:rssad:localhost:3306", 'rssad', '', $db_args);
                        $db_chandle->{InactiveDestroy} = 1;
                }
                my $db_insert = $db_chandle->prepare("INSERT INTO lortest (id, value) VALUES (?, ?)");
                print(time(), ": ", "Insert from $fpid", "\n") if $db_insert->execute("$i$fpid", "$i test $fpid");
                $db_insert->finish();
                exit 0;
        }
}

for (my $i = 1; $i <= 20; $i++) {
        my $pid = fork();
        if ($pid == 0) {
                my $fpid = $$;
                print(time(), ": ", "Started reader: $fpid", "\n");
                if ($db_type eq 'sqlite') {
                        $db_chandle = DBI->connect("DBI:SQLite:dbname=tmp/sqlite.db","","");
                } else {
                        my $db_args = {
                                AutoCommit => 1,
                                RaiseError => 1
                        };
                        $db_chandle = DBI->connect("DBI:mysql:rssad:localhost:3306", 'rssad', '', $db_args);
                        $db_chandle->{InactiveDestroy} = 1;
                }
                my $db_select = $db_chandle->prepare("SELECT * FROM lortest");
                print(time(), ": ", "Select from $fpid", "\n") if  $db_select->execute();
                $db_select->finish();
                exit 0;
        }
}

sleep(10);
$db_query = $db_handle->prepare("DROP TABLE lortest");
$db_query->execute();

Результат работы для mysql: http://pastebin.com/HtXJ0fNb

И для sqlite: http://pastebin.com/ukuEYGt5

Почему даже на таких простых запросах sqlite проседает? А что будет, если чтение/запись будет идти с нормальными данными и во множество связанных таблиц одновременно? sqlite - хорошая база, но не надо его пихать туда, где ему не место.

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Почему даже на таких простых запросах sqlite проседает?

хочешь скорости - включай WAL, отключай sync и используй одно соединение на все потоки, разница будет огромная

!/usr/bin/env perl

а еще пользуйся библиотекой напрямую из С, чтоб избежать кривого кода в прослойке, но это если есть возможность, конечно

wota ★★
()
Ответ на: комментарий от shell-script

хочешь скорости - включай WAL, отключай sync и используй одно соединение на все потоки, разница будет огромная

а почему:

а) WAL быстрее журнала, который по дефолту
б) по дефолту после каждого запроса sqlite вызывает fsync, это конечно очень надежно, но тормозит те же инсерты просто неимоверно, установка sync даже в normal очень позитивно скажется на скорости
в) при открытии нескольких соединений sqlite использует shared cache, который является дополнительной блокировкой, sqlite может безопасно работать с одним соединением из разных потоков

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от wota

Это всё можно сделать не лету в программе без перекомпиляции sqlite, если я буду использовать именно внешнюю библиотеку, а не притащу с собой свою? Если нет, тогда не катит - не буду же я заставлять каждого пользователя перекомпиливать sqlite.

Ну и плюс я говорил про случаи, с которыми мне приходилось сталкиваться. И в тех случаях при многопоточной работе всё сильно тормозило. От этого и «ненависть», про которую ТС спрашивал.

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Это всё можно сделать не лету в программе без перекомпиляции sqlite

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

wota ★★
()
Ответ на: комментарий от Evil_Wizard

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

leave ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.