Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос - тормоз (или я?) / 11 сообщений из 11, страница 1 из 1
13.11.2014, 04:47
    #38804216
_Need Help_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - тормоз (или я?)
DDL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE VAL_BOOL (               -- Записей ~ 4 000 000
    ID       INTEGER NOT NULL,
    ID_TAG   INTEGER,
    ... );

CREATE INDEX VAL_BOOL_IDX2 ON VAL_BOOL (ID_TAG);

CREATE TABLE TAGS_E (                    -- Записей < 100 000
    ID           INTEGER NOT NULL,
    ...
    STATUS       CHAR(1),
    DESCRIPTION  VARCHAR(1000)
);


FB 2.5.2
Запрос
Код: sql
1.
2.
3.
SELECT DISTINCT V.ID_TAG, T.STATUS, T.DESCRIPTION
  FROM VAL_BOOL V
    LEFT JOIN TAGS_E T ON V.ID_TAG = T.ID

выполняется очень медленно, больше 6 минут
План
Код: sql
1.
PLAN SORT (JOIN (V NATURAL, T INDEX (PK_TAGS_E)))

Собственно вопросы:
1. Можно ли ускорить?
2. Почему по VAL_BOOL NATURAL, ведь есть же индекс VAL_BOOL_IDX2 (по ID_TAG)?

PS:
Запрос без джойна выполняется 20 секунд
Код: sql
1.
SELECT DISTINCT V.ID_TAG FROM VAL_BOOL V


PPS: погугливши нашел совет заменить лефт на иннер, правда для MSSQL. Не помогло.
...
Рейтинг: 0 / 0
13.11.2014, 06:49
    #38804234
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - тормоз (или я?)
а зачем ты прицепил таблицу VAL_BOOL, если для запроса все есть в TAGS_E?
...
Рейтинг: 0 / 0
13.11.2014, 06:54
    #38804237
CyberMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - тормоз (или я?)
А сколько выполняется этот запрос?
Код: sql
1.
SELECT V.ID_TAG FROM VAL_BOOL V GROUP BY V.ID_TAG


P.S. При DISTINCT в FB индексы не используются.
...
Рейтинг: 0 / 0
13.11.2014, 07:09
    #38804241
_Need Help_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - тормоз (или я?)
Не совсем так.
в таблице TAGS_E есть тэги, которые
1 - имеют статус A(ctive)
2 - имеют статус N(oActive)
3 - имеют статус N(oActive), но когда-либо были активны.

Когда тэг активен, его значения мониторятся и пишутся в VAL_BOOL.
Мне нужны тэги категорий 1 и 3.
Ясное кино, надо переделать табличку TAGS_E, но на то нужна воля божья и начальства.
Последнее труднопреодолимо, поэтому приходится как-то выкручиваться.
До сих пор получалось, а тут затык. Хотя... может быть это и поможет их сподвигнуть.
...
Рейтинг: 0 / 0
13.11.2014, 07:12
    #38804243
_Need Help_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - тормоз (или я?)
Пост про "не совсем так" для Tactical Nuclear Penguin
...
Рейтинг: 0 / 0
13.11.2014, 07:15
    #38804245
_Need Help_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - тормоз (или я?)
CyberMax,
Execute time = 1m 18s 188ms :(
...
Рейтинг: 0 / 0
13.11.2014, 07:55
    #38804257
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - тормоз (или я?)
_Need Help_FB 2.5.2
Запрос
Код: sql
1.
2.
3.
SELECT DISTINCT V.ID_TAG, T.STATUS, T.DESCRIPTION
  FROM VAL_BOOL V
    LEFT JOIN TAGS_E T ON V.ID_TAG = T.ID

выполняется очень медленно, больше 6 минут
План
Код: sql
1.
PLAN SORT (JOIN (V NATURAL, T INDEX (PK_TAGS_E)))

Собственно вопросы:
1. Можно ли ускорить?
2. Почему по VAL_BOOL NATURAL, ведь есть же индекс VAL_BOOL_IDX2 (по ID_TAG)?

С какого перепугу должен был использоваться индекс VAL_BOOL_IDX2 (по ID_TAG)???
Ведь ты ясно написал в запросе
Возьми все записи из VAL_BOOL к каждой из них прицепи записи из JOIN TAGS_E
и выбери не повторяющиеся сочетания

_Need Help_PS: Запрос без джойна выполняется 20 секунд]
Код: sql
1.
SELECT DISTINCT V.ID_TAG FROM VAL_BOOL V



Ну тогда попробуй

Код: sql
1.
2.
3.
SELECT  W.ID_TAG, T.STATUS, T.DESCRIPTION
  FROM (SELECT DISTINCT V.ID_TAG FROM VAL_BOOL V) W
    LEFT JOIN TAGS_E T ON W.ID_TAG = T.ID



Запрос должен отработать быстрее чем первоначальный,
ну хотя-бы за счет того что к TAGS_E будет меньше обращений
...
Рейтинг: 0 / 0
13.11.2014, 07:59
    #38804258
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - тормоз (или я?)
_Need Help_Не совсем так.
в таблице TAGS_E есть тэги, которые
1 - имеют статус A(ctive)
2 - имеют статус N(oActive)
3 - имеют статус N(oActive), но когда-либо были активны.

Когда тэг активен, его значения мониторятся и пишутся в VAL_BOOL.
Мне нужны тэги категорий 1 и 3.
Ясное кино, надо переделать табличку TAGS_E, но на то нужна воля божья и начальства.
Последнее труднопреодолимо, поэтому приходится как-то выкручиваться.
До сих пор получалось, а тут затык. Хотя... может быть это и поможет их сподвигнуть.
Ну и если "Мне нужны тэги категорий 1 и 3" то почему этого не видно в исходном запросе???
...
Рейтинг: 0 / 0
13.11.2014, 08:08
    #38804262
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - тормоз (или я?)
_Need Help_,
Чем больше смотрю на запрос, тем больше вопросов, что-же на самом деле надо

и создалось впечатление что надо вот это

Код: sql
1.
2.
3.
4.
SELECT  T.ID_TAG, T.STATUS, T.DESCRIPTION
  FROM TAGS_E T 
where exists (select * from VAL_BOOL V where  V.ID_TAG = T.ID)
and t.status in (1,3)
...
Рейтинг: 0 / 0
13.11.2014, 09:21
    #38804310
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - тормоз (или я?)
попробуй
Код: sql
1.
2.
3.
4.
SELECT DISTINCT T.ID, T.STATUS, T.DESCRIPTION
  FROM TAGS_E T
    JOIN VAL_BOOL V ON V.ID_TAG = T.ID
WHERE T.STATUS in (1,3)
...
Рейтинг: 0 / 0
13.11.2014, 09:28
    #38804319
_Need Help_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - тормоз (или я?)
m7mНу тогда попробуй
Код: sql
1.
2.
3.
SELECT  W.ID_TAG, T.STATUS, T.DESCRIPTION
  FROM (SELECT DISTINCT V.ID_TAG FROM VAL_BOOL V) W
    LEFT JOIN TAGS_E T ON W.ID_TAG = T.ID


Запрос должен отработать быстрее чем первоначальный,
ну хотя-бы за счет того что к TAGS_E будет меньше обращений
Да. Те же 20 сек, что и запрос без джойна. Зер гут, спасибо.
m7m...и создалось впечатление что надо вот это
Код: sql
1.
2.
3.
4.
SELECT  T.ID_TAG, T.STATUS, T.DESCRIPTION
  FROM TAGS_E T 
where exists (select * from VAL_BOOL V where  V.ID_TAG = T.ID)
and t.status in (1,3)

Нет статуса 3. (надо бы, но на то воля не моя, а начальников)
Есть статус 1 и 2, но часть тех, у которых 2, побывали в статусе 1, и от них остались записи в таблице VAL_BOOL.
СПАСИБО ЗА селект фром селект...
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос - тормоз (или я?) / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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