|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
имеется база, 8 таблиц, 2 из них - 50000-100000 записей, остальные совсем маленькие. делается select, по структуре такой: select o.a, o_n.a, s.a, s.b, a.c, a.d, a.e, a.f, a.g, a.h, a.i from s, o, o_n, a where ( o.a = o_n.a AND a.x = s.x AND a.y = o.y ); o.a, o_n.a, s.a, s.b - строки, остальное - числа. результат запроса - около 10000 записей. проблема - select делается 4 часа. если сравнение строк o.a = o_n.a заменить на сравнение чисел - аналогично. a.x, s.x, a.y, o.y - primary key, остальные поля проиндексированы... в чем может быть подвох? доступ к базе осуществляется с помощью с api, т.е. запрос - sqlite3_prepare, sqlite3_step в цикле, sqlite3_finalize. php, sqlite maestro, консоль sqlite3 - та же проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2008, 11:40 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
закинь create для этих таблиц и примеры insert'ов для них... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2008, 18:57 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
Сейчас попробовал на своих табличках. Запрос работает быстрее, если связывать сначала мелкие таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2008, 19:50 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
eoipsoимеется база, 8 таблиц, 2 из них - 50000-100000 записей, остальные совсем маленькие. делается select, по структуре такой: select o.a, o_n.a, s.a, s.b, a.c, a.d, a.e, a.f, a.g, a.h, a.i from s, o, o_n, a where ( o.a = o_n.a AND a.x = s.x AND a.y = o.y ); o.a, o_n.a, s.a, s.b - строки, остальное - числа. результат запроса - около 10000 записей. проблема - select делается 4 часа. если сравнение строк o.a = o_n.a заменить на сравнение чисел - аналогично. a.x, s.x, a.y, o.y - primary key, остальные поля проиндексированы... в чем может быть подвох? 1. Используйте JOIN вместо WHERE The query is executed against one or more tables specified after the FROM keyword. If multiple tables names are separated by commas, then the query is against the cross join of the various tables. The full SQL-92 join syntax can also be used to specify joins. A sub-query in parentheses may be substituted for any table name in the FROM clause. The entire FROM clause may be omitted, in which case the result is a single row consisting of the values of the expression list. Суть в том, что, если не указаны JOIN'ы, то сначала стриотся - полное объединение таблиц . (CROSS JOIN = 50000 x 100000 x <маленький_размер>), а потом оно фильтруется по условию WHERE. При указании JOIN, сначала делаются подвыборки из исходных таблиц, а затем уже CROSS JOIN по этим подвыборкам. А фильтрация по WHERE может быть задана если нужно дополнительно ограничить результат. 2. А зачем индексы? Попробуйте удалить индексы, с учетом Every time the database is opened, all CREATE INDEX statements are read from the sqlite_master table and used to regenerate SQLite's internal representation of the index layout. Т.е. индексы перестраиваются при каждом открытии базы. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2008, 11:21 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
PSmith1. Используйте JOIN вместо WHERE Во 2-й версии join работал медленнее where. С чем связано не помню. Также не помню пофиксено ли это. PSmithТ.е. индексы перестраиваются при каждом открытии базы. Только если их нет, он их перестраивать не будет :) Индексы удалять нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2008, 20:17 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
СержИндексы удалять нельзя. В версии 3.х можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2008, 11:12 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
если переписать через join - вообще убрать where, действительно намного быстрее, спасибо. вместо 4 часов - 5 минут. но это против 5 секунд в mysql.. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2008, 16:41 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
eoipsoесли переписать через join - вообще убрать where, действительно намного быстрее, спасибо. вместо 4 часов - 5 минут. но это против 5 секунд в mysql..Дык! SQ Lite же оно :) У этой базы предназначение быть встроенной микро-базой. На большие объемы она не рассчитана. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2008, 17:32 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
PSmith СержИндексы удалять нельзя. В версии 3.х можно.Если я их удалю, откуда будет известно какие поля индексировать, какие нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2008, 20:15 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
Серж PSmith СержИндексы удалять нельзя. В версии 3.х можно.Если я их удалю, откуда будет известно какие поля индексировать, какие нет?Из объявления таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2008, 20:58 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
White OwlИз объявления таблиц. В объявлении таблицы информации об индексах нет. Иначе зачем вообще были бы нужны индексы. авторEvery time the database is opened, all CREATE INDEX statements are read from the sqlite_master table and used to regenerate SQLite's internal representation of the index layout.Говорится о том, что при каждом открытии генерируется внутреннее представление об индексах, взятых из sqlite_master. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2008, 11:19 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
White OwlДык! SQ Lite же оно :) У этой базы предназначение быть встроенной микро-базой. На большие объемы она не рассчитана. 2 таблицы по 100000 и 50000 записей - это разве большие объёмы? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2008, 11:29 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
у меня тоже проблема с выборкой, оч долго. Но я не знаток SQL, может поможете оптимизировать один запросик? (использую SQLite) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2008, 13:29 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
Иван4444может поможете оптимизировать один запросик? (использую SQLite) Пости текст запроса и желательно - DDL таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2008, 14:07 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
SQL = SQL + L" SELECT Tovar.s_name, Ost.vcnt,Tovar.kid,m_place"; SQL = SQL + L" FROM Tovar,Struct"; SQL = SQL + L" LEFT JOIN Ost ON Tovar.kid=Ost.robj"; SQL = SQL + L" LEFT JOIN ( SELECT m_groups.rpraise as m_rprais FROM m_groups,cln WHERE cln.id='<ТУт я вставляю код>' and m_groups.rtype=cln.rtype)"; SQL = SQL + L" ON m_rpraise=Tovar.vproizve"; SQL = SQL + L" WHERE mt_struct.vname=Tovar.vproizv and m_struct.istovar=1"; где SQL - просто трока, выложил в таком виде для удобства чтения. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2008, 15:03 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
Для оптимизации запроса смотрите информацию об используемых индексах: explain query plan _запрос_ Без этого сложно угадать, как у вас все работает. Но 5 минут на обработку объединения трех мелких табличек это очень много... если только поля в базе не содержат, скажем, mp3-файлы (некоторые додумываются именно так и сделать - хоть бы, черти, выносили большие поля в отдельную табличку). И еще - вы оптимизацию и настройку базы вообще делали? Если нет, то сделайте. Например, увеличение дисковой страницы до 4-х килобайт с дефолтового значения в 1 килобайт позволяет значительно увеличить скорость работы (дефолтовое значение для сотовых телефонов еще годится, а вот для современных КПК уже нет, а уж для десктопа и вовсе). P.S. Индексы _не перестраиваются_ при открытии базы - они хранятся на диске и _информация_ о них просто считывается в определенную структуру в памяти при открытии базы. "internal representation of the index layout" - это внутреннее представление в ОЗУ о размещении страниц индекса на диске, а не весь индекс на диске. Кстати, соответствующие структуры в памяти создаются для всех объектов базы, а не только индексов. P.P.S. Маленькие "объемы" - это, простите, сколько? В продакшене использую эскулайт-базу, преведенную с постгреса, около 20 гиг, прекрасно работает. Когда перетаскивал с постгреса, создавал тестовые базы эскулайт в 100 гиг, с ними также все хорошо. Если для вас десятки и сотни гигабайт это "маленькие" базы, то уж будьте любезны, уточняйте размер :-) В документации по SQLite объяснено, почему не рекомендуется создавать базы размером более "нескольких дюжин гигабайт" (коротко говоря, требуется выделить память пропорционально количеству дисковых страниц менеджеру дисковых страниц при старте записывающей транзакции), но это вовсе не предел, хотя часто оказывается удобнее и эффективнее использовать команду attach, объединяя нужные базы в одну для выборок и выполняя вставки в отдельные базы (к тому же это ограничение было сформулировано в начале 2000-х годов, с тех пор доступные объемы и скорость оперативной памяти значительно выросли). P.P.P.S. При открытии базы создаются внутренние структуры для доступа к индексам (internal representation of the index layout). При этом индексы хранятся в самом файле БД, см. http://www.sqlite.org/fileformat2.html Версия 3.7.0 умеет создавать индексы для выборки, если построение индекса эффективнее сканирования таблицы при выполнении запроса. Но злоупотреблять не стоит, да и версия эта еще далеко не у всех. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2008, 12:00 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
Возник вопрос по селекту. Чтобы не плодить тем отпишу сюда. SQLite Ver.3.6.21. Есть таблица: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Работаю с БД с помощью DISQLite компонента. Простой запрос в стиле: Код: plaintext
В то же время этот же запрос в утилите SQLiteSpy (от того же разработчика что и сам компонент DISQLite) обрабатывает этот же запрос за 0,4мс. Что я неучёл ? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2010, 12:58 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
Чуть соврал... запрос следующий: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Таблицы City и Country (имеют не более 100 записей) следующие: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2010, 13:06 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
xneo, это могут быть: 1) погрешность измерения. Как мерил ? 2) разные PRAGMA установки после открытия БД. Что за библиотека доступа, какие прагмы ? 3) разные запрашиваемые кодировки строк, но наврядли ... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2010, 13:49 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
Dmitry Arefievxneo, это могут быть: 1) погрешность измерения. Как мерил ? 2) разные PRAGMA установки после открытия БД. Что за библиотека доступа, какие прагмы ? 3) разные запрашиваемые кодировки строк, но наврядли ... 1. Пробовал и системное время и GetTickCount, результат один и тот же. 2. Единственное что я изменяю в своём коде это: Код: plaintext 1.
3. Строки в кодировке UTF8. Пробовал вообще не читать эти поля, разницы нет. Кстати запрос в стиле Код: plaintext 1.
Никак не пойму как может быть такая громадная разница. Функции работы с БД в моём коде находятся внутри критических секций, тоесть в момент доступа с БД работает только одна функция. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2010, 14:47 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
MBG, А как увеличить размер дисковой страницы для КПК? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2010, 12:59 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
White OwlДык! SQ Lite же оно :) У этой базы предназначение быть встроенной микро-базой. На большие объемы она не рассчитана. У меня базы размером до 100 Гб работают замечательно (это не предел, просто мне больше не требуется). Страшно спросить, что же такое _для вас_ большие базы? А сверхбольшие?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2010, 23:33 |
|
sqlite. медленный select.
|
|||
---|---|---|---|
#18+
Модераторам: Раз темы с такими вопросами оживают, есть предложение создать тему с примерами внедрений, что ли. А то вот оказывается, что понятие большая и маленькая до сих пор не определено, хотя об этом и в других топиках обсуждения случались. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2010, 23:42 |
|
|
start [/forum/topic.php?fid=54&msg=35123584&tid=2009315]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 175ms |
0 / 0 |