powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизировать (ускорить) запрос
20 сообщений из 20, страница 1 из 1
Оптимизировать (ускорить) запрос
    #38491198
Здравствуйте!
Не особый спец в SQL, поэтому прошу помощи.
Есть таблица состояний:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE STATES(
    ID       INTEGER NOT NULL,
    ID_UNIT  INTEGER,
    N_DATA   DATE,
    N_TIME   TIME,
    T_STATE  INTEGER);

CREATE DESCENDING INDEX STATES_IDX1 ON STATES (N_DATA, N_TIME);
CREATE INDEX STATES_IDX2 ON STATES(ID_UNIT);


Записей в таблице примерно 3 миллиона.
Требуется найти состояние некоего юнита на момент предшествующий заданному.
Запрос
Код: sql
1.
2.
3.
4.
SELECT FIRST 1 S.ID, S.T_STATE
    FROM STATES S
    WHERE (S.N_DATA < :DF) AND (S.ID_UNIT = :IDU)
    ORDER BY S.N_DATA DESC, S.N_TIME DESC


выполняется медленно (~350 мс)
Вопрос - как можно ускорить?

Firebird - 2.5.2.26539
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491200
При этом запрос на выборку состояний за интервал времени
Код: sql
1.
2.
3.
4.
SELECT S.ID,  S.N_DATA, S.N_TIME, S.T_STATE
    FROM STATES S
    WHERE (S.N_DATA BETWEEN :DF AND :DT) AND (S.ID_UNIT = :IDU)
    ORDER BY 2, 3 

выполняется практически мгновенно - ~ 15 мс
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491211
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это ничего, что сортировка в разные стороны в двух примерах?
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491214
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никогда не показывай планы запросов.
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491219
Да собственно, ничего, т.к.
1. есть еще индекс
Код: sql
1.
CREATE INDEX STATES_IDX3 ON STATES(N_DATA, N_TIME);


2. План для первого (медленного) запроса
Код: sql
1.
PLAN (S ORDER STATES_IDX1 INDEX (STATES_IDX2, STATES_IDX3))


План для второго (быстрого) запроса
Код: sql
1.
PLAN (S ORDER STATES_IDX3 INDEX (STATES_IDX2, STATES_IDX3))


При этом, если изменить во втором запросе
Код: sql
1.
ORDER BY 2, 3

на
Код: sql
1.
ORDER BY 2 DESC, 3 DESC

, то планы становятся одинаковыми, а времена выполнения не изменяются
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491220
Пардон, одинаковыми такими:
Код: sql
1.
PLAN (S ORDER STATES_IDX1 INDEX (STATES_IDX2, STATES_IDX3))
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491359
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Оптимизатор_,

Ты сказал не про все индексы. STATES_IDX3 - это кто?
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491368
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Оптимизатор_,

Код: sql
1.
2.
3.
4.
SELECT MAX(S.N_DATA),
           MAX(S.N_TIME)
FROM STATES S
WHERE (S.N_DATA < :DF) AND (S.ID_UNIT = :IDU)



Вот этот запрос сколько выполняется?
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491374
CyberMax_Оптимизатор_,

Ты сказал не про все индексы. STATES_IDX3 - это кто?
Не сразу, но про все. См. выше 15250407 :
Код: sql
1.
CREATE INDEX STATES_IDX3 ON STATES(N_DATA, N_TIME);
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491380
Симонов Денис_Оптимизатор_,
Код: sql
1.
2.
3.
4.
SELECT MAX(S.N_DATA),
           MAX(S.N_TIME)
FROM STATES S
WHERE (S.N_DATA < :DF) AND (S.ID_UNIT = :IDU)


Вот этот запрос сколько выполняется?

Execute time = 344ms
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491390
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Оптимизатор_Требуется найти состояние некоего юнита на момент предшествующий заданному.

Ваш запрос выполняет не совсем то. Ибо момент в моём понимании это это время (точнее дата-время). У вас же момент отсекается только по дате.
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491397
Симонов Денис_Оптимизатор_Требуется найти состояние некоего юнита на момент предшествующий заданному.
Ваш запрос выполняет не совсем то. Ибо момент в моём понимании это это время (точнее дата-время). У вас же момент отсекается только по дате.
Ну да, формулировка несколько...
Однако запрос выполняет то, что мне необходимо. :).
Он возвращает последнее состояние юнита перед указанной датой.
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491410
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Оптимизатор_,

в оптимизаторе 2.x есть косяк с навигацией по индексу (исправлено в трёшке, но та ещё в состоянии Альфа)

Возможно один из запросов будет работать быстрее

Код: sql
1.
2.
3.
4.
SELECT FIRST 1 S.ID, S.T_STATE
    FROM STATES S
    WHERE (S.N_DATA+0 < :DF) AND (S.ID_UNIT = :IDU)
    ORDER BY S.N_DATA DESC, S.N_TIME DESC



или

Код: sql
1.
2.
3.
4.
SELECT FIRST 1 S.ID, S.T_STATE
    FROM STATES S
    WHERE (S.N_DATA < :DF) AND (S.ID_UNIT = :IDU)
    ORDER BY S.N_DATA+0 DESC, S.N_TIME+0 DESC
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491429
Симонов Денис_Оптимизатор_,

в оптимизаторе 2.x есть косяк с навигацией по индексу (исправлено в трёшке, но та ещё в состоянии Альфа)Пичялька... Увы, на тройку в обозримом будущем перехода не будет.
Симонов ДенисВозможно один из запросов будет работать быстрееПроверил: первый за 768 мс, второй за те же 344 мс.
Впал в уныние.
Решил проверить (с перепугу?)
Код: sql
1.
2.
3.
4.
SELECT FIRST 1 S.ID, S.T_STATE
    FROM STATES S
    WHERE (S.N_DATA+0 < :DF) AND (S.ID_UNIT = :IDU)
    ORDER BY S.N_DATA+0 DESC, S.N_TIME+0 DESC

,и вот оно счастье:
Execute time = 16ms
Всем спасибо огромное.
Симонов Денис, вам респект и уважуха!
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491437
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Оптимизатор_,

я бы не стал так радоваться. Возможно вам просто повезло, что для конкретного юнита мало данных. Со временем это может измениться и запрос стать не эффективным. Кстати статистика свежая?
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491452
Симонов Денис_Оптимизатор_,

я бы не стал так радоваться. Возможно вам просто повезло, что для конкретного юнита мало данных. Со временем это может измениться и запрос стать не эффективным. Кстати статистика свежая? Эх...
Данных не много, да. Select count выдал 19683. Но это за 3 года. хочется надеяться, что еще года 3 продержится, а там...
или ишак или падишах.
А статистика свежая, да.
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491468
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Оптимизатор_вот оно счастьеПлан "счастья" покажи
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491475
hvlad,

PLAN SORT ((S INDEX (STATES_IDX2)))
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38491494
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой индекс должен быть оптимальным:
Код: sql
1.
CREATE DESCENDING INDEX ... ON STATES(ID_UNIT, N_DATA, N_TIME);

Если STATES_IDX1 создавался именно под этот запрос - попробуй его заменить на этот
...
Рейтинг: 0 / 0
Оптимизировать (ускорить) запрос
    #38493572
hvlad,

Да, с таким индексом все работает быстро, если есть хотя бы одна запись, удовлетворяющая условию.
Когда таких записей нет (примерно для 25-30% юнитов, статистика по которым ведется с 01 ноября),
и если :DF меньше или равно 01.11.2013, время выстреливает до 500 мс, в то время как в варианте с +0 все замечательно.
Само собой, с течением времени частота появления таких запросов будет стремиться к нулю, поэтому решил пока оставить вариант с +0, а ч-з некоторое время, если это начнет тормозить, плюсНоль отключу.
Спасибо. :)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизировать (ускорить) запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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