powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / sqlite. медленный select.
25 сообщений из 25, страница 1 из 1
sqlite. медленный select.
    #35123584
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, остальные поля проиндексированы... в чем может быть подвох?

доступ к базе осуществляется с помощью с api, т.е. запрос - sqlite3_prepare, sqlite3_step в цикле, sqlite3_finalize. php, sqlite maestro, консоль sqlite3 - та же проблема.
...
Рейтинг: 0 / 0
sqlite. медленный select.
    #35125216
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
закинь create для этих таблиц и примеры insert'ов для них...
...
Рейтинг: 0 / 0
sqlite. медленный select.
    #35125300
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас попробовал на своих табличках. Запрос работает быстрее, если связывать сначала мелкие таблицы.
...
Рейтинг: 0 / 0
sqlite. медленный select.
    #35126198
Фотография PSmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
sqlite. медленный select.
    #35128253
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PSmith1. Используйте JOIN вместо WHERE Во 2-й версии join работал медленнее where. С чем связано не помню. Также не помню пофиксено ли это.

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

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
Период между сообщениями больше года.
sqlite. медленный select.
    #36675225
xneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возник вопрос по селекту. Чтобы не плодить тем отпишу сюда.
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
sqlite. медленный select.
    #36675256
xneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть соврал... запрос следующий:
Код: 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
sqlite. медленный select.
    #36675409
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xneo, это могут быть:
1) погрешность измерения. Как мерил ?
2) разные PRAGMA установки после открытия БД. Что за библиотека доступа, какие прагмы ?
3) разные запрашиваемые кодировки строк, но наврядли ...
...
Рейтинг: 0 / 0
sqlite. медленный select.
    #36675622
xneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
sqlite. медленный select.
    #36738053
two2off
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG,

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

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

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


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