Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / SQLite [игнор отключен] [закрыт для гостей] / sqlite. медленный select. / 25 сообщений из 25, страница 1 из 1
11.02.2008, 11:40
    #35123584
eoipso
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
имеется база, 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 - та же проблема.
...
Рейтинг: 0 / 0
11.02.2008, 18:57
    #35125216
Серж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
закинь create для этих таблиц и примеры insert'ов для них...
...
Рейтинг: 0 / 0
11.02.2008, 19:50
    #35125300
Серж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
Сейчас попробовал на своих табличках. Запрос работает быстрее, если связывать сначала мелкие таблицы.
...
Рейтинг: 0 / 0
12.02.2008, 11:21
    #35126198
PSmith
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
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.
Т.е. индексы перестраиваются при каждом открытии базы.
...
Рейтинг: 0 / 0
12.02.2008, 20:17
    #35128253
Серж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
PSmith1. Используйте JOIN вместо WHERE Во 2-й версии join работал медленнее where. С чем связано не помню. Также не помню пофиксено ли это.

PSmithТ.е. индексы перестраиваются при каждом открытии базы. Только если их нет, он их перестраивать не будет :) Индексы удалять нельзя.
...
Рейтинг: 0 / 0
13.02.2008, 11:12
    #35129237
PSmith
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
СержИндексы удалять нельзя.
В версии 3.х можно.
...
Рейтинг: 0 / 0
13.02.2008, 16:41
    #35130652
eoipso
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
если переписать через join - вообще убрать where, действительно намного быстрее, спасибо.
вместо 4 часов - 5 минут. но это против 5 секунд в mysql..
...
Рейтинг: 0 / 0
13.02.2008, 17:32
    #35130806
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
eoipsoесли переписать через join - вообще убрать where, действительно намного быстрее, спасибо.
вместо 4 часов - 5 минут. но это против 5 секунд в mysql..Дык! SQ Lite же оно :) У этой базы предназначение быть встроенной микро-базой. На большие объемы она не рассчитана.
...
Рейтинг: 0 / 0
13.02.2008, 20:15
    #35131167
Серж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
PSmith СержИндексы удалять нельзя.
В версии 3.х можно.Если я их удалю, откуда будет известно какие поля индексировать, какие нет?
...
Рейтинг: 0 / 0
13.02.2008, 20:58
    #35131227
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
Серж PSmith СержИндексы удалять нельзя.
В версии 3.х можно.Если я их удалю, откуда будет известно какие поля индексировать, какие нет?Из объявления таблиц.
...
Рейтинг: 0 / 0
14.02.2008, 11:19
    #35132074
Серж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
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.
...
Рейтинг: 0 / 0
14.02.2008, 11:29
    #35132118
eoipso
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
White OwlДык! SQ Lite же оно :) У этой базы предназначение быть встроенной микро-базой. На большие объемы она не рассчитана.
2 таблицы по 100000 и 50000 записей - это разве большие объёмы?
...
Рейтинг: 0 / 0
11.12.2008, 13:29
    #35708063
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
у меня тоже проблема с выборкой, оч долго. Но я не знаток SQL, может поможете оптимизировать один запросик? (использую SQLite)
...
Рейтинг: 0 / 0
11.12.2008, 14:07
    #35708189
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
Иван4444может поможете оптимизировать один запросик? (использую SQLite)
Пости текст запроса и желательно - DDL таблиц.
...
Рейтинг: 0 / 0
11.12.2008, 15:03
    #35708382
Иван4444
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
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 - просто трока, выложил в таком виде для удобства чтения.
...
Рейтинг: 0 / 0
13.12.2008, 12:00
    #35712467
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
Для оптимизации запроса смотрите информацию об используемых индексах:

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 умеет создавать индексы для выборки, если построение индекса эффективнее сканирования таблицы при выполнении запроса. Но злоупотреблять не стоит, да и версия эта еще далеко не у всех.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
08.06.2010, 12:58
    #36675225
xneo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
Возник вопрос по селекту. Чтобы не плодить тем отпишу сюда.
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.
CREATE TABLE [users] (
[uid] VARCHAR( 32 )  PRIMARY KEY NOT NULL,
[name] VARCHAR( 200 )  NOT NULL,
[locationid] INTEGER  NOT NULL,
[birthdate] INTEGER  NOT NULL,
[sex] INTEGER  NOT NULL,
[avatar] VARCHAR( 128 )  NOT NULL,
[homepagelink] VARCHAR( 128 )  NOT NULL,
[balance] REAL DEFAULT '0' NOT NULL,
[rating] INTEGER DEFAULT '0' NOT NULL,
[games] INTEGER DEFAULT '0' NOT NULL,
[pairs] INTEGER DEFAULT '0' NOT NULL,
[chosen] INTEGER DEFAULT '0' NOT NULL,
[lasteventtime] INTEGER( 8 ) DEFAULT '0' NOT NULL,
[about] VARCHAR( 250 )  NULL,
[owneruid] VARCHAR( 32 ) DEFAULT '0' NOT NULL,
[price] INTEGER DEFAULT '1' NOT NULL
);
CREATE INDEX [IDX_USERS_owneruid] ON [users]([owneruid]  ASC);
CREATE INDEX [IDX_USERS_rating] ON [users]([rating]  ASC);

Работаю с БД с помощью DISQLite компонента. Простой запрос в стиле:
Код: plaintext
select * from users where uid = '3370465999377519315';
Обрабатывается около 15-16мс.
В то же время этот же запрос в утилите SQLiteSpy (от того же разработчика что и сам компонент DISQLite) обрабатывает этот же запрос за 0,4мс. Что я неучёл ? :)
...
Рейтинг: 0 / 0
08.06.2010, 13:06
    #36675256
xneo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
Чуть соврал... запрос следующий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT 
  users.uid, 
  users.name, 
  users.locationid, 
  users.birthdate, 
  users.sex, 
  users.avatar, 
  users.homepagelink, 
  users.balance, 
  users.rating, 
  users.games, 
  users.pairs, 
  users.chosen, 
  users.lasteventtime,
  users.about, 
  users.price, 
  users.owneruid, 
  city.name as cityname, 
  country.name as countryname 
FROM users 
LEFT JOIN city ON (city.id = users.locationid) 
LEFT JOIN country ON (country.id = city.parent) 
WHERE (users.uid = '3370465999377519315');

Таблицы City и Country (имеют не более 100 записей) следующие:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE `city` (
  `id` int( 10 ) NOT NULL,
  `parent` int( 3 ) NOT NULL,
  `name` varchar( 255 ) NOT NULL,
  PRIMARY KEY  (`id`)
);
CREATE TABLE `country` (
  `id` int( 10 ) NOT NULL,
  `name` varchar( 255 ) NOT NULL,
  PRIMARY KEY  (`id`)
);
У меня 15-16мс, в SQLiteSpy этот же запрос 0,4мс.
...
Рейтинг: 0 / 0
08.06.2010, 13:49
    #36675409
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
xneo, это могут быть:
1) погрешность измерения. Как мерил ?
2) разные PRAGMA установки после открытия БД. Что за библиотека доступа, какие прагмы ?
3) разные запрашиваемые кодировки строк, но наврядли ...
...
Рейтинг: 0 / 0
08.06.2010, 14:47
    #36675622
xneo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
Dmitry Arefievxneo, это могут быть:
1) погрешность измерения. Как мерил ?
2) разные PRAGMA установки после открытия БД. Что за библиотека доступа, какие прагмы ?
3) разные запрашиваемые кодировки строк, но наврядли ...

1. Пробовал и системное время и GetTickCount, результат один и тот же.
2. Единственное что я изменяю в своём коде это:
Код: plaintext
1.
    FBase.Execute('PRAGMA temp_store=MEMORY');
Библиотека доступа получается одна и та же. Разработчик на основе своей библиотеки и реализовал SQLiteSpy. (www.yunqa.de)
3. Строки в кодировке UTF8. Пробовал вообще не читать эти поля, разницы нет.

Кстати запрос в стиле
Код: plaintext
1.
UPDATE users SET balance= 1  WHERE uid='123123123';
Вообще обрабатывается до 150мс у меня... у SQLiteSpy до 1мс.
Никак не пойму как может быть такая громадная разница.
Функции работы с БД в моём коде находятся внутри критических секций, тоесть в момент доступа с БД работает только одна функция.
...
Рейтинг: 0 / 0
13.07.2010, 12:59
    #36738053
two2off
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
MBG,

А как увеличить размер дисковой страницы для КПК?
...
Рейтинг: 0 / 0
13.07.2010, 15:47
    #36738712
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
...
Рейтинг: 0 / 0
19.07.2010, 23:33
    #36749334
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
White OwlДык! SQ Lite же оно :) У этой базы предназначение быть встроенной микро-базой. На большие объемы она не рассчитана.

У меня базы размером до 100 Гб работают замечательно (это не предел, просто мне больше не требуется). Страшно спросить, что же такое _для вас_ большие базы? А сверхбольшие?..
...
Рейтинг: 0 / 0
19.07.2010, 23:42
    #36749348
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
Модераторам:

Раз темы с такими вопросами оживают, есть предложение создать тему с примерами внедрений, что ли. А то вот оказывается, что понятие большая и маленькая до сих пор не определено, хотя об этом и в других топиках обсуждения случались.
...
Рейтинг: 0 / 0
20.07.2010, 10:53
    #36749678
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite. медленный select.
MBGРаз темы с такими вопросами оживают, есть предложение создать тему с примерами внедрений, что ли.
+1 Создавай - тебе карты в руки.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / sqlite. медленный select. / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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