powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по соединению с GTT
4 сообщений из 4, страница 1 из 1
Вопрос по соединению с GTT
    #39457298
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть три таблицы. Одна постоянная, две других GTT с DELETE ROWS. Эти GTT присоединяются к первой через INNER JOIN. В одной GTT миллион строк, в другой - одна строка. Как FB определяет, какую из них использовать как мастер-таблицу, ведь статистика по индексам нулевая?
...
Рейтинг: 0 / 0
Вопрос по соединению с GTT
    #39457599
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что план говорит?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопрос по соединению с GTT
    #39460746
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DIR$ABONENT$ABONENT - постоянная таблица. FIL$DIR$ABONENT$ABONENT и FIL$DIR$HOUSE$HOUSE - GTT с DELETE ROWS ON COMMIT.

Подготавливаю запрос:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT
    ABONENT.ID
FROM
    DIR$ABONENT$ABONENT AS ABONENT
    INNER JOIN FIL$DIR$ABONENT$ABONENT ON ABONENT.ID = FIL$DIR$ABONENT$ABONENT.ID
    INNER JOIN FIL$DIR$HOUSE$HOUSE ON ABONENT.ID_HOUSE = FIL$DIR$HOUSE$HOUSE.ID


План:
Код: plaintext
PLAN JOIN (FIL$DIR$ABONENT$ABONENT NATURAL, ABONENT INDEX (PK_DIR$ABONENT$ABONENT), FIL$DIR$HOUSE$HOUSE INDEX (PK_FIL$DIR$HOUSE$HOUSE))

Здесь все очевидно - перебираем FIL$DIR$ABONENT$ABONENT натуралом, а так как она все равно пустая, то отбирается 0 записей.
Но непонятен момент - у IBExpert'а в статистике пусто - то есть как бы не было вообще никаких чтений, хотя NIR должны были быть по таблице FIL$DIR$ABONENT$ABONENT.

Запускаем запрос:
Код: sql
1.
INSERT INTO FIL$DIR$ABONENT$ABONENT (ID) SELECT ID FROM DIR$ABONENT$ABONENT A WHERE A.ID_GROUP_DISTRICT = 2

Код: plaintext
99184 записей было добавлено в таблицу FIL$DIR$ABONENT$ABONENT

Снова подготавливаем первый запрос и план меняется на:
Код: plaintext
PLAN JOIN (FIL$DIR$HOUSE$HOUSE NATURAL, ABONENT INDEX (FK_DIR$ABONENT$ABONENT_HOUSE), FIL$DIR$ABONENT$ABONENT INDEX (PK_FIL$DIR$ABONENT$ABONENT))

Делаю по-другому.
Код: sql
1.
INSERT INTO FIL$DIR$ABONENT$ABONENT (ID) SELECT FIRST 1000 ID FROM DIR$ABONENT$ABONENT A WHERE A.ID_GROUP_DISTRICT = 2

Код: plaintext
1000 записей было добавлено в таблицу FIL$DIR$ABONENT$ABONENT

План:
Код: plaintext
PLAN JOIN (FIL$DIR$HOUSE$HOUSE NATURAL, ABONENT INDEX (FK_DIR$ABONENT$ABONENT_HOUSE), FIL$DIR$ABONENT$ABONENT INDEX (PK_FIL$DIR$ABONENT$ABONENT))

Тут логично - в таблице фильтрации домов нет строк, поэтому надо идти через нее.

Код: sql
1.
INSERT INTO FIL$DIR$HOUSE$HOUSE (ID) SELECT ID FROM DIR$HOUSE$HOUSE WHERE ID_GROUP_DISTRICT = 2

Код: plaintext
10087 записей было добавлено в таблицу FIL$DIR$HOUSE$HOUSE

План:
Код: plaintext
PLAN JOIN (FIL$DIR$ABONENT$ABONENT NATURAL, ABONENT INDEX (PK_DIR$ABONENT$ABONENT), FIL$DIR$HOUSE$HOUSE INDEX (PK_FIL$DIR$HOUSE$HOUSE))

То есть сервер каким-то образом увидел, что в таблице FIL$DIR$ABONENT$ABONENT меньше строк, а значит, идти надо через нее.

Добавляем еще строк:
Код: sql
1.
INSERT INTO FIL$DIR$ABONENT$ABONENT (ID) SELECT SKIP 1000 ID FROM DIR$ABONENT$ABONENT A WHERE A.ID_GROUP_DISTRICT = 2

Код: plaintext
98184 записей было добавлено в таблицу FIL$DIR$ABONENT$ABONENT
и план становится
Код: plaintext
PLAN JOIN (FIL$DIR$HOUSE$HOUSE NATURAL, ABONENT INDEX (FK_DIR$ABONENT$ABONENT_HOUSE), FIL$DIR$ABONENT$ABONENT INDEX (PK_FIL$DIR$ABONENT$ABONENT))

Но если запустить
Код: sql
1.
DELETE FROM FIL$DIR$ABONENT$ABONENT

, то план не меняется.

Вот мне и не понятно, как сервер определяет план в соединениях с GTT. У меня часть таких запросов тормозит из-за неправильного плана, другая часть отрабатывает мгновенно. Логику найти не могу.
...
Рейтинг: 0 / 0
Вопрос по соединению с GTT
    #39460750
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сервер знает (прикидочно) размеры таблиц. Но он при этом не учитывает видимость. Т.е. после delete для него записей осталось столько же.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по соединению с GTT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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