powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / No way?
20 сообщений из 20, страница 1 из 1
No way?
    #39692714
flight-op
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем.

Две таблицы

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE [Syslog](
  [MessageID] INTEGER PRIMARY KEY ON CONFLICT REPLACE, 
  [Facility] INTEGER, 
  [Severity] INTEGER, 
  [HostID] INTEGER, 
  [ProcessID] INTEGER, 
  [DateTimeSend] DATETIME, 
  [Message] VARCHAR(4096), 
  [Alert] BOOLEAN, 

CREATE INDEX [idxDateTimeSend] ON [Syslog]([DateTimeSend] DESC);
CREATE INDEX [idxProcessIDSyslogMessages] ON [Syslog]([ProcessID]);
CREATE INDEX [idxAlert] ON [Syslog]([Alert]);
CREATE INDEX [idxHostIDSyslogMessages] ON [Syslog]([HostID]);
CREATE INDEX [idxFacilityIDSyslogMessages] ON [Syslog]([Facility]);
CREATE INDEX [idxSeverityIDSyslogMessages] ON [Syslog]([Severity]);



и

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE Firewalls (
  [MessageID] INTEGER REFERENCES Syslog(MessageID) ON DELETE CASCADE ON UPDATE CASCADE ,
  [inInterface] VARCHAR(255),
  [outInterface] VARCHAR(255));

CREATE INDEX idxMessageIDFirewalls ON Firewalls(MessageID);
CREATE INDEX idxinInterfaceFirewalls ON Firewalls(inInterface);
CREATE INDEX idxoutInterfaceFirewalls ON Firewalls(outInterface);



Связь по MessageID.

Запрос - объединить и отсортировать по полю присоединенной таблицы :

Код: sql
1.
2.
3.
4.
SELECT Firewalls.*
FROM Firewalls
LEFT JOIN Syslog ON Firewalls.MessageID=Syslog.MessageID
ORDER BY Syslog.HostID



EXPLAIN QUERY PLAN:
Код: sql
1.
2.
3.
SCAN TABLE Firewalls
SEARCH TABLE Syslog USING INTEGER PRIMARY KEY (rowid=?)
USE TEMP B-TREE FOR ORDER BY



Естественно, медленно. Есть шансы?
...
Рейтинг: 0 / 0
No way?
    #39692818
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flight-opЕстественно, медленно. Есть шансы?
Думаю что нет. Надо сделать копию таблицы Firewalls с добавлением Syslog.HostID, а затем ее отсортировать.
...
Рейтинг: 0 / 0
No way?
    #39692907
flight-op
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прискорбно. Это фундаментальное ограничение или есть СУБД, которые такое могут?
...
Рейтинг: 0 / 0
No way?
    #39692925
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фундаментально нет никаких правил как выполнять запрос, каждая СУБД работает по своим внутренним алгоритмам.

Как вариант можно попытаться задействовать индекс idxHostIDSyslogMessages. Так дополнительная сортировка не потребуется.
Судя по структуре БД LEFT JOIN можно заменить на JOIN
Код: sql
1.
2.
3.
SELECT Firewalls.*
FROM Syslog JOIN Firewalls ON Syslog.MessageID=Firewalls.MessageID
ORDER BY Syslog.HostID
...
Рейтинг: 0 / 0
No way?
    #39692997
flight-op
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, INNER JOIN тут более уместен, спасибо.

Идем дальше - фильтруем по HostID, и по чём-нибудь сортируем

Код: sql
1.
2.
3.
4.
SELECT Firewalls.*, Syslog.*
FROM Firewalls INNER JOIN Syslog ON Firewalls.MessageID=Syslog.MessageID
WHERE HostID=46 
ORDER BY Syslog.DateTimeSend



Опять получаем тормоза

Код: sql
1.
2.
3.
SEARCH TABLE Syslog USING INDEX idxHostIDSyslogMessages (HostID=?)
SEARCH TABLE Firewalls USING INDEX idxMessageIDFirewalls (MessageID=?)
USE TEMP B-TREE FOR ORDER BY



Или тут вообще другой какой-то подход нужен?
...
Рейтинг: 0 / 0
No way?
    #39693007
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про тормоза уточни:
1. без ORDER BY тоже тормоза?
2. Размеры таблиц какие? сколько записей в каждой?
3. В Syslog сколько записей с HostID=46?
...
Рейтинг: 0 / 0
No way?
    #39693014
flight-op
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Без ORDER BY всё нормально, равно как и с ORDER BY, но без фильтрации

Код: sql
1.
2.
3.
4.
5.
6.
EXPLAIN QUERY PLAN SELECT Firewalls.*, Syslog.*
FROM Firewalls INNER JOIN Syslog ON Firewalls.MessageID=Syslog.MessageID
WHERE HostID=46 

SEARCH TABLE Syslog USING INDEX idxHostIDSyslogMessages (HostID=?)
SEARCH TABLE Firewalls USING INDEX idxMessageIDFirewalls (MessageID=?)



2. Syslog ~150000 записей, Firewalls ~130000 записей. Это тестовые данные, вообще предполагается количество записей в миллионы.
3. Записей с HostID=46 в Syslog ~130000 - это один тестовый маршрутизатор сгенерировал.
...
Рейтинг: 0 / 0
No way?
    #39693040
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если что-нибудь одно, то выборки не происходит, а просто находит первую запись результата.
Когда WHERE и ORDER BY делается полная выборка и сортировка.
130 тыс. записей многовато. Возможно результат в кэш не влазит и на диск свопиться начинает. Добавь кэшу памяти
Код: sql
1.
PRAGMA cache_size = 100000; 
...
Рейтинг: 0 / 0
No way?
    #39693093
flight-op
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шаман
Помогло, кстати.
...
Рейтинг: 0 / 0
No way?
    #39693097
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flight-op,

А если ещё индексы убрать - ваще круто будет.
...
Рейтинг: 0 / 0
No way?
    #39693099
flight-op
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShSergeflight-op,

А если ещё индексы убрать - ваще круто будет.

Хм?
...
Рейтинг: 0 / 0
No way?
    #39693101
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flight-op,

Попробуйте дроп индекс.
...
Рейтинг: 0 / 0
No way?
    #39693103
flight-op
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Который?
...
Рейтинг: 0 / 0
No way?
    #39693107
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flight-opКоторый?
Все.
...
Рейтинг: 0 / 0
No way?
    #39693109
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flight-opКоторый?
Я так понял что все
...
Рейтинг: 0 / 0
No way?
    #39693111
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С одной стороны выборка 90% таблицы по индексу медленнее чем простой скан таблицы. С другой у нас в запросе есть JOIN, а без индекса это огромный тормоз.
И не факт что в продакшене этот запрос вернет 90% таблицы. 5-10% быстрее получить с индексом.
Индексы это отчасти гарантия что по мере наполнения БД прога не станет жутко тормозить. Поэтому индексы не надо удалять.
...
Рейтинг: 0 / 0
No way?
    #39693118
flight-op
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, фокус не получился - время выполнения запроса подскочило в ~5 раз, с ~2000 мс до ~10000.
...
Рейтинг: 0 / 0
No way?
    #39693121
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Пускай попробует. Мне кажется, что он таки перегнул палку.
...
Рейтинг: 0 / 0
No way?
    #39693124
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flight-opНет, фокус не получился - время выполнения запроса подскочило в ~5 раз, с ~2000 мс до ~10000.
Оставь только поля, где форин кей и примари. Попробуй. У меня по размеру такая же база. Нмкаких индексов не делал. Работает.
...
Рейтинг: 0 / 0
No way?
    #39693126
flight-op
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TС одной стороны выборка 90% таблицы по индексу медленнее чем простой скан таблицы.

90% - это частный случай, особенности тестовых данных. Реально - единицы процентов.
Вообще, подход надо как-то менять, выдавать сотни тысяч записей человеку кажется не очень хорошей идеей.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / No way?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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