|
Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join
|
|||
---|---|---|---|
#18+
вот так создается таблица: Код: plaintext 1.
вот селекты: запрос по полю id: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
запрос по lid(library id): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
функция get time: Код: plaintext 1. 2. 3. 4. 5.
первый запрос выдает 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.
, а в таблице lib установить foreign key, то есть: Код: sql 1.
, то как правильно написать select результат которого будет подобен результату моего 2-го select-а? то бишь из множества записей с разными значениями lid выдаст те в которых это значение равно конкретному, нужному. я конечно знаю про join, и пыталась найти такую информацию, но не смогла почерпнуть оттуда решение потому что я блондинка либо авторы пускаются в совсем непонятные простаранные объяснения, либо приводятся примеры где объеденяются две таблицы и т.п. 3) если произвести действия указанные во втором вопросе, насколько это ускорит выборку? да, и еще вопрос, наверно самый интересный, но увы врядли имеющий практическую ценность для данной задачи: насколько я понимаю, при первом вызове sqlite3_step должна сформироваться таблица результатов и по ней уже он переходит на следующую строку при каждом вызове, каждую строчку он обрабатывает меньше чем за микросекунду, однако: между моментами когда цикл последний раз отработал и когда программа вышла из цикла проходит аж от 1,5 секунд.. насколько я понимаю после вызова t2 = get_time(0) у нас происходит следущее: вызывается sqlite3_step, она должна перескочить на следующую строку, следующей строки нет и она выдает НЕ SQLITE_ROW, while завершается.. так что в этом процессе может занимать так много времени? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2016, 21:10 |
|
Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join
|
|||
---|---|---|---|
#18+
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. Убери вывод на экран из цикла и удивись. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 04:25 |
|
Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join
|
|||
---|---|---|---|
#18+
White Owl, извиняюсь за возможно глупые вопросы, но индекс на lid это как? я просто не настолько хорошо знаю sql) и еще.. убрала cout из цикла.. и get_time убрала.. оставила только то что было нужно, то бишь переписывание значений колонок - та же хрень, когда только cout убрала - время 1-3 секунды, причем после выхода из цикла, когда убрала get_time - так же на всю выборку требуется 1-3 секунды. я так понимаю это последний вызов sqlite3_step который видит что строки нет и чего-то там проверяет - работает так долго, вопрос в том чего он там делает ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 12:33 |
|
Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join
|
|||
---|---|---|---|
#18+
enanthamelleWhite Owl, извиняюсь за возможно глупые вопросы, но индекс на lid это как? я просто не настолько хорошо знаю sql) 13601944 enanthamelleя так понимаю это последний вызов sqlite3_step который видит что строки нет и чего-то там проверяет - работает так долго, вопрос в том чего он там делаетпроверяет: "а вдруг там дальше еще строки удовлетворяющие условию?" ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 15:17 |
|
|
start [/forum/topic.php?fid=54&tid=2008612]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
25ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 128ms |
0 / 0 |