powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / skip & left join
23 сообщений из 23, страница 1 из 1
skip & left join
    #38630580
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеем образно запрос:
Код: plsql
1.
2.
3.
select first 100 skip 1000000 A.FIELD1, B.FIELD1
from TABLE A
left join TABLE B on (B.FIELD1 = A.FIELD1)


Почему файр дергает TABLE B и для первых 1000000 записей?
Вроди логично насчитать и прыгать через лимон записей из А а потом начать джоинить и таблицу B чтоб выдать разалт сет.

Пользуюсь FB2.5. Будут улучшения в 3.0? Или я косячу и мыслю неправильно?
...
Рейтинг: 0 / 0
skip & left join
    #38630585
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociПочему файр дергает TABLE B и для первых 1000000 записей?
На случай если в ней по 100500 записей на каждую первую из А.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
skip & left join
    #38630596
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мда... спасибо, понял!
ошибся мыслю что если лефт и у меня одна запись из Б на каждую из A то должно быть чики пики.

обойдусь вложенным селектом наподобие
Код: sql
1.
2.
3.
select A.FIELD1, B.FIELD2
from (select first 100 skip 1000000 FIELD1 from TABLE) A
left join TABLE B on (B.FIELD1 = A.FIELD1)


или есть другие методы оптимизации (если из B надо несколько полей)?
...
Рейтинг: 0 / 0
skip & left join
    #38630604
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociВроди логично насчитать и прыгать через лимон записей из А а потом начать джоинить и таблицу B чтоб выдать разалт сет.Тогда и запрос должен быть другим. Типа такого:
Код: sql
1.
2.
3.
4.
5.
6.
select a.id, a.a, b.b
from(
    select first 10 skip 200 a.id, a.a
    from tmp_a a
) a
left join tmp_b b on a.a=b.b

(но у него, повторюсь, и результат будет СОВСЕМ другим! Ибо кляузы fired / rows применяются после к итоговому результату, который уже после всего получен).
...
Рейтинг: 0 / 0
skip & left join
    #38630605
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcociили есть другие методы оптимизации (если из B надо несколько полей)?"если из B надо несколько полей" - что мешает их перечислить в select-секции ?

зы. пардон, не увидел ваш же ответ на первый вопрос.
...
Рейтинг: 0 / 0
skip & left join
    #38630611
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но у него, повторюсь, и результат будет СОВСЕМ другим!
так мне этого и надо :), например выдать название города после чего выбрали маршруты:

Код: sql
1.
2.
3.
select A.ID, A.FDATE, B.NAME, B.POPULATION
from (select first 100 skip 1000000 ID, FDATE, CITY_ID from ROUTES) A
left join CITIES B on (B.ID = A.CITY_ID)
...
Рейтинг: 0 / 0
skip & left join
    #38630616
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что-то наподобие имеет смысл? (если бы поддерживал файрбирд) или бред?

Код: sql
1.
2.
3.
4.
select first 100 skip 1000000
  A.FIELD1, A.FIELD2,
  (select B.FIELD3, B.FIELD4 from TAB_B B where B.FIELD1 = A.FIELD3)
from TAB_A A
...
Рейтинг: 0 / 0
skip & left join
    #38630619
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociА что-то наподобие имеет смысл? (если бы поддерживал файрбирд) или бред?

Код: sql
1.
2.
3.
4.
select first 100 skip 1000000
  A.FIELD1, A.FIELD2,
  (select B.FIELD3, B.FIELD4 from TAB_B B where B.FIELD1 = A.FIELD3)
from TAB_A A

Получите облом вида multiple rows in singleton select, если только "B" не является родительской по отношению к "А".
...
Рейтинг: 0 / 0
skip & left join
    #38630631
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci> А что-то наподобие имеет смысл? (если бы поддерживал файрбирд) или бред?

1. Имеет смысл.
2. Это поддерживается уже сейчас.
3. Так можно вытащить только 1 запись из B, несколько не получится.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
skip & left join
    #38630679
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
один я вижу, что его запрос никак нельзя выполнить в ФБ?
...
Рейтинг: 0 / 0
skip & left join
    #38630696
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты про то, что более одного поля/записи не вытащить или о чём?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
skip & left join
    #38630781
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

именно про не более одного поля
...
Рейтинг: 0 / 0
skip & left join
    #38630862
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, Дмитрий!

Да, хотелось витащить именно несколько полей (или буду делать уже с нестед селект, как выше).
Тестирую на большую базу для одного веб проэкта где данные показываю постранично, тоесть с skip.
Если бы было возможность вытащить несколько полей из Б, было бы отлично, а не только одно поле как сейчас.

-
D.
...
Рейтинг: 0 / 0
skip & left join
    #38631019
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, фича про вытаскивание нескольких полей подзапросом уже есть в трекере.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
skip & left join
    #38631021
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

есть, есть... это называется LATERAL JOIN CORE-3435
...
Рейтинг: 0 / 0
skip & left join
    #38631043
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> есть, есть... это называется LATERAL JOIN CORE-3435

ХЗ, лично мне не понравился ни сама фича, ни тикет и его обсуждение.
Я имел в виду несколько другое - обычный запрос с выборкой поля
(который есть сейчас), но ползволяющий выбрать более одного поля
(соответственно, "раздвигая" выборку в ширину):

Код: sql
1.
2.
3.
4.
5.
6.
Select
  A.F1,
  A.F2,
  (select B.F3, B.F4 - это сейчас нельзя from B where B.ID = A.ID)
  A.F5
From A



P.S. Что говорит на сей счёт стандарт - без понятия.

P.S.S. В трекере есть тикет именно с "моим" вариантом, IIRC.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
skip & left join
    #38631057
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

LATERAL JOIN есть в стандарте, уж на сколько он крив другой вопрос
...
Рейтинг: 0 / 0
skip & left join
    #38631070
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> LATERAL JOIN есть в стандарте

Только вот речь шла не о нём...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
skip & left join
    #38631078
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, поиск в трекере - это, конечно, ппц...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
skip & left join
    #38631312
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, было бы отлично научить оптимизатор пошаманить на натуре джоина.
Тоесть определить может ли джоин в принципе вернуть несколько записей или максимум одну.
Вот в селекте:
Код: sql
1.
2.
3.
select first 100 skip 1000000 A.FIELD1, B.FIELD1
from TAB_A A
left join TAB_B B on (B.FIELD1 = A.FIELD1)


Если B.FIELD1 первичный ключ (тоесть никак больше одного запись из B для каждой из A) то не надо сканировать еще и таблицу B при скипе милиона записей.
Это наверное отразится и на производительность обычных селектов без скипа. Искать еще записи после первой найденной или отбой.
...
Рейтинг: 0 / 0
skip & left join
    #38633022
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociА вообще, было бы отлично научить оптимизатор пошаманить на натуре джоина.
Тоесть определить может ли джоин в принципе вернуть несколько записей или максимум одну.
Вот в селекте:
Код: sql
1.
2.
3.
select first 100 skip 1000000 A.FIELD1, B.FIELD1
from TAB_A A
left join TAB_B B on (B.FIELD1 = A.FIELD1)


Если B.FIELD1 первичный ключ (тоесть никак больше одного запись из B для каждой из A) то не надо сканировать еще и таблицу B при скипе милиона записей.
Это наверное отразится и на производительность обычных селектов без скипа. Искать еще записи после первой найденной или отбой.

Код: sql
1.
2.
3.
4.
select first 100 skip 1000000 A.FIELD1, B.FIELD1
from TAB_A A
left join TAB_B B on (B.FIELD1 = A.FIELD1)
where b.field2>10


Понятно что это не совсем left join но всё же усложняет алгоритм действий для оптимизатора ( может быть и is null )?
...
Рейтинг: 0 / 0
skip & left join
    #38633255
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПонятно что это не совсем left join но всё же усложняет алгоритм действий для оптимизатора
Не понял мысль. where B.FIELD здесь ограничивает выборку из B, но суть вопроса не в том.

Вот в реальных сценариях есть куча (большенство?:) запросов связки "смежных" таблиц по первичному ключу. Это как-бы результат "нормализации" данных.
Тоесть "главная" выборка идет из "главной" таблицы а потом идут связки с дополнительные таблицы.

Например какой-то список документов
Код: sql
1.
2.
3.
4.
select D.ID, D.FDATE, D.AMOUNT, D.NAME as CLIENT_NAME, D.ADDRESS as CLIENT_ADDRESS, S.NAME as SERVICE_NAME
from DOCUMENTS D
left join CLIENTS C on (C.ID = D.CLIENT_ID)
left join SERVICES S on (S.ID = D.SERVICE_ID)


Имеем КЛИЕНТЫ и УСЛУГИ как косвенные таблицы, для показа дополнительной инфы юзеру.

Так вот, когда skip милион, движок сканирует еще и эти "ненужные" дополнительные таблицы что создает определенные тормоза.
...
Рейтинг: 0 / 0
skip & left join
    #38633713
Alex Truhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociТак вот, когда skip милион, движок сканирует еще и эти "ненужные" дополнительные таблицы что создает определенные тормоза.
Оптимизатор можно оптимизировать до бесконечности.
Если же смотреть на вещи реально, то данная ситуация примитивно обходиться с помощью DT.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / skip & left join
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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