powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join
5 сообщений из 5, страница 1 из 1
Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join
    #39194894
enanthamelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот так создается таблица:
Код: plaintext
1.
sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS lib (id INT PRIMARY KEY NOT NULL, lid INT, name CHAR[40], path CHAR[256], info TEXT, sid INT);", NULL, 0, &zerrmsg);


вот селекты: запрос по полю id:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
t2 = get_time(0);
       sqlite3_exec(db,"BEGIN;",0,0,&err);
       ........................
        while (numlist != NULL)
        {
            sqlite3_prepare16(db,(WCHAR*) L"SELECT id, lid, name, path, info, sid FROM lib WHERE ID = ?;", -1, &stmt, 0);
            sqlite3_bind_int(stmt,1,numlist->number);
            while (sqlite3_step(stmt) == SQLITE_ROW)
            {
                ...................
            }
            sqlite3_finalize(stmt);
            numlist = numlist->next;
        }
        sqlite3_exec(db,"COMMIT;",0,0,&err);
        t2 = get_time(t2);
        cout << " after scroll: " << t2 << endl;


запрос по lid(library id):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
sqlite3_prepare16(db,(WCHAR*) L"SELECT id, lid, name, path, info, sid FROM lib WHERE lid = ?;", -1, &stmt, 0);
            sqlite3_bind_int(stmt,1,lid);
            double t3 = get_time(0);
            while (sqlite3_step(stmt) == SQLITE_ROW)
            {
                t1 = get_time(0);
                ................................
                t1 = get_time(t1);
                cout << " one row: " << t1 << endl;
                t2 = get_time(0);
            }
            t2 = get_time(t2);
            cout << " after scroll: " << t2 << endl;
            t3 = get_time(t3);
            cout << "scroll rows: " << t3 << endl;
        sqlite3_finalize(stmt);


функция get time:
Код: plaintext
1.
2.
3.
4.
5.
double get_time (double t1)
{
    if (t1 == 0) return clock();
    else return (clock() - t1);
}


первый запрос выдает t2 = 60 на ~1000 записей из 1000000, тобишь 6 милисекунд
второй - t1 = 0-1, t2 = 1500 - 3000 (1,5 - 3 секунды), t3 - от t2 отличается на пару милисекунд

итак: по смыслу программы один фаил (id) принадлежит только к одной категории (lid) и необходимо будет много раз запрашивать список из файлов одной категории, и крайне необходимо чтобы список этот формировался максимально быстро (ну никак не за 1,5 секунды)
внимание вопросы:
1) собсно до меня только сейчас дошло наконец что время второго запроса - это просмотр всей базы, ибо lid не уникальный ключ, это так? и есть ли способ это обойти?
2) если создать таблицу категорий скажем:
Код: sql
1.
CREATE TABLE category (lid PRIMARY KEY NOT NULL, name GHAR[50])


, а в таблице lib установить foreign key, то есть:
Код: sql
1.
CREATE TABLE lib (id INT PRIMARY KEY NOT NULL, lid INT, name CHAR[40], path CHAR[256], info TEXT, sid INT, FOREIGN KEY (lid) REFERENCES category(lid))


, то как правильно написать select результат которого будет подобен результату моего 2-го select-а? то бишь из множества записей с разными значениями lid выдаст те в которых это значение равно конкретному, нужному.
я конечно знаю про join, и пыталась найти такую информацию, но не смогла почерпнуть оттуда решение потому что я блондинка либо авторы пускаются в совсем непонятные простаранные объяснения, либо приводятся примеры где объеденяются две таблицы и т.п.
3) если произвести действия указанные во втором вопросе, насколько это ускорит выборку?

да, и еще вопрос, наверно самый интересный, но увы врядли имеющий практическую ценность для данной задачи:

насколько я понимаю, при первом вызове sqlite3_step должна сформироваться таблица результатов и по ней уже он переходит на следующую строку при каждом вызове, каждую строчку он обрабатывает меньше чем за микросекунду, однако: между моментами когда цикл последний раз отработал и когда программа вышла из цикла проходит аж от 1,5 секунд.. насколько я понимаю после вызова t2 = get_time(0) у нас происходит следущее: вызывается sqlite3_step, она должна перескочить на следующую строку, следующей строки нет и она выдает НЕ SQLITE_ROW, while завершается.. так что в этом процессе может занимать так много времени?
...
Рейтинг: 0 / 0
Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join
    #39195002
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
enanthamelle1) собсно до меня только сейчас дошло наконец что время второго запроса - это просмотр всей базы, ибо lid не уникальный ключ, это так? и есть ли способ это обойти?Индекс на lid.
enanthamelle2) если создать таблицу категорий скажем:
...
, а в таблице lib установить foreign key, то есть:
...
, то как правильно написать select результат которого будет подобен результату моего 2-го select-а?Точно также как он уже написан. Внешние ключи это способ предотвратить изменения в базе которые нарушают логику объектов описанных в базе.
В твоем случае, если сделаешь внешний ключ на lid, а потом вставишь в таблицу lib запись с lid который еще не описан в таблице category - то база выругается и откажется добавлять такую запись.
На выборки наличие внешних ключей не влияет никак. Абсолютно никак.

enanthamelleда, и еще вопрос, наверно самый интересный, но увы врядли имеющий практическую ценность для данной задачи:

насколько я понимаю, при первом вызове sqlite3_step должна сформироваться таблица результатов и по ней уже он переходит на следующую строку при каждом вызове, каждую строчку он обрабатывает меньше чем за микросекунду, однако: между моментами когда цикл последний раз отработал и когда программа вышла из цикла проходит аж от 1,5 секунд.. насколько я понимаю после вызова t2 = get_time(0) у нас происходит следущее: вызывается sqlite3_step, она должна перескочить на следующую строку, следующей строки нет и она выдает НЕ SQLITE_ROW, while завершается.. так что в этом процессе может занимать так много времени?cout. Убери вывод на экран из цикла и удивись.
...
Рейтинг: 0 / 0
Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join
    #39195269
enanthamelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, извиняюсь за возможно глупые вопросы, но индекс на lid это как? я просто не настолько хорошо знаю sql)

и еще.. убрала cout из цикла.. и get_time убрала.. оставила только то что было нужно, то бишь переписывание значений колонок - та же хрень, когда только cout убрала - время 1-3 секунды, причем после выхода из цикла, когда убрала get_time - так же на всю выборку требуется 1-3 секунды. я так понимаю это последний вызов sqlite3_step который видит что строки нет и чего-то там проверяет - работает так долго, вопрос в том чего он там делает
...
Рейтинг: 0 / 0
Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join
    #39195485
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
enanthamelleWhite Owl, извиняюсь за возможно глупые вопросы, но индекс на lid это как? я просто не настолько хорошо знаю sql)
13601944
enanthamelleя так понимаю это последний вызов sqlite3_step который видит что строки нет и чего-то там проверяет - работает так долго, вопрос в том чего он там делаетпроверяет: "а вдруг там дальше еще строки удовлетворяющие условию?"
...
Рейтинг: 0 / 0
Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join
    #39195947
enanthamelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, Слава индексации) 1-2мсек)) спасибо)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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