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

Две таблицы

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

Как вариант можно попытаться задействовать индекс 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
24.08.2018, 14:17
    #39692997
flight-op
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No way?
Да, 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
24.08.2018, 14:30
    #39693007
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No way?
Про тормоза уточни:
1. без ORDER BY тоже тормоза?
2. Размеры таблиц какие? сколько записей в каждой?
3. В Syslog сколько записей с HostID=46?
...
Рейтинг: 0 / 0
24.08.2018, 14:45
    #39693014
flight-op
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No way?
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
24.08.2018, 15:35
    #39693040
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No way?
Если что-нибудь одно, то выборки не происходит, а просто находит первую запись результата.
Когда WHERE и ORDER BY делается полная выборка и сортировка.
130 тыс. записей многовато. Возможно результат в кэш не влазит и на диск свопиться начинает. Добавь кэшу памяти
Код: sql
1.
PRAGMA cache_size = 100000; 
...
Рейтинг: 0 / 0
24.08.2018, 17:59
    #39693093
flight-op
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No way?
Шаман
Помогло, кстати.
...
Рейтинг: 0 / 0
24.08.2018, 18:18
    #39693097
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No way?
flight-op,

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

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

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

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

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

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


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