powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Долгая выборка с IS NULL
6 сообщений из 6, страница 1 из 1
Долгая выборка с IS NULL
    #39876825
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FB 3.0.4.33054.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Есть таблица, в которой 323 тысячи записей:
CREATE TABLE DOC$RECEIPT (
    TIMESTAMP_SENT               TIMESTAMP,
    TIMESTAMP_NEXT_REPEAT        TIMESTAMP,
    PRINT_RESULT                 VARCHAR(25000)
);

CREATE INDEX IDX_DOC$RECEIPT_TS_SENT_NEXT_RE ON DOC$RECEIPT (TIMESTAMP_SENT, TIMESTAMP_NEXT_REPEAT);



У индекса IDX_DOC$RECEIPT_TS_SENT_NEXT_RE статистика 0,0000031156239.

1. Выполняю запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT FIRST 1
    R.TIMESTAMP_NEXT_REPEAT,
    R.TIMESTAMP_SENT
FROM
    DOC$RECEIPT AS R
WHERE
    (R.TIMESTAMP_SENT <= '16.10.2019 8:45:38')


Код: plaintext
PLAN (R INDEX (IDX_DOC$RECEIPT_TS_SENT_NEXT_RE))

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Время подготовки запроса = 15ms
Время выполнения запроса = 16ms
Среднее время на получение одной записи = 16,00 ms
Current memory = 25 438 160
Max memory = 46 372 848
Memory buffers = 2 048
Reads from disk to cache = 342

Код: plaintext
1.
2.
3.
4.
5.
6.
Select Expression
    -> First N Records
        -> Filter
            -> Table "DOC$RECEIPT" as "R" Access By ID
                -> Bitmap
                    -> Index "IDX_DOC$RECEIPT_TS_SENT_NEXT_RE" Range Scan (upper bound: 1/3)

2. Добавляю условие:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT FIRST 1
    R.TIMESTAMP_NEXT_REPEAT,
    R.TIMESTAMP_SENT
FROM
    DOC$RECEIPT AS R
WHERE
    (R.TIMESTAMP_SENT <= '16.10.2019 8:45:38')
    AND (R.PRINT_RESULT IS NOT NULL)



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
План
PLAN (R INDEX (IDX_DOC$RECEIPT_TS_SENT_NEXT_RE))

------ Информация о производительности ------
Время подготовки запроса = 0ms
Время выполнения запроса = 16ms
Среднее время на получение одной записи = 16,00 ms
Current memory = 25 444 400
Max memory = 46 372 848
Memory buffers = 2 048
Reads from disk to cache = 342
Writes from cache to disk = 0
Чтений из кэша = 357

3. Меняю второе условие с IS NOT NULL на IS NULL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT FIRST 1
    R.TIMESTAMP_NEXT_REPEAT,
    R.TIMESTAMP_SENT
FROM
    DOC$RECEIPT AS R
WHERE
    (R.TIMESTAMP_SENT <= '16.10.2019 8:45:38')
    AND (R.PRINT_RESULT IS NULL)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
План
PLAN (R INDEX (IDX_DOC$RECEIPT_TS_SENT_NEXT_RE))

------ Информация о производительности ------
Время подготовки запроса = 0ms
Время выполнения запроса = 5s 922ms
Среднее время на получение одной записи = 5 922,00 ms
Current memory = 25 443 632
Max memory = 46 372 848
Memory buffers = 2 048
Reads from disk to cache = 195 688
Writes from cache to disk = 0
Чтений из кэша = 665 953

В статистике - 311 тысяч индексных чтений. План во всех случаях не меняется.
Что сделать, чтобы последний запрос работал быстро, как второй?
...
Рейтинг: 0 / 0
Долгая выборка с IS NULL
    #39876826
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавили поле PRINTED и добавили его в индекс. Теперь он из трех полей "TIMESTAMP_SENT, TIMESTAMP_NEXT_REPEAT, PRINTED".

Этот запрос выполняется мгновенно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT FIRST 1
    R.*
FROM
    DOC$RECEIPT AS R
WHERE
    (R.TIMESTAMP_SENT <= '16.10.2019 8:45:38')
    AND (R.PRINTED IS TRUE)


А запрос с IS FALSE - почти 5 секунд (и так же 311 тысяч индексных чтений):
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT FIRST 1
    R.*
FROM
    DOC$RECEIPT AS R
WHERE
    (R.TIMESTAMP_SENT <= '16.10.2019 8:45:38')
    AND (R.PRINTED IS FALSE)
...
Рейтинг: 0 / 0
Долгая выборка с IS NULL
    #39876828
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просьба к модераторам удалить данную тему. С проблемой разобрался.
...
Рейтинг: 0 / 0
Долгая выборка с IS NULL
    #39876831
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,

FIRST без ORDER BY? Что-то здесь не так.

Если трёшка поставлена как SS, то

Код: plaintext
Memory buffers = 2 048

не серьёзно
...
Рейтинг: 0 / 0
Долгая выборка с IS NULL
    #39876913
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисCyberMax,

FIRST без ORDER BY? Что-то здесь не так.



А если будет order by, то нужен индекс по дате в сортировке убывания.
...
Рейтинг: 0 / 0
Долгая выборка с IS NULL
    #39876968
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

да что тут нужно дело второе. Суть в том что без ORDER BY запрос c FIRST может вернуть не совсем то что ожидается.
Нет никакой гарантии что записи в таблице легли в порядке TIMESTAMP_SENT
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Долгая выборка с IS NULL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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