select ... rows

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
kas
Сообщения: 2
Зарегистрирован: 30 июл 2007, 16:50

select ... rows

Сообщение kas » 30 июл 2007, 19:12

IB 7.5

Есть две таблицы:
- объекты (имя-guid, type, label, данные в blob xml-ке);
- линки (type, src-guid, dst-guid).

Объекты хранятся все вместе, а связи между ними хранятся в отдельной таблице.

Нужно построить сложный отчет по нескольким типам. Он получается через join-ы (по два на каждый тип).

Живой пример. Есть объекты: человек, карта, выдача (связка человек-карта).
Выбрать все выдачи с человеком и картой:

Код: Выделить всё

select

  o1.flabel as issue,
  o2.flabel as owner,
  o3.flabel as card

from

  tobjectstorage o1

  left join tlinkstorage ls2 on (ls2.ftype='LUserIssue' and ls2.fdestobject=o1.fname) left join tobjectstorage o2 on (ls2.fsrcobject=o2.fname)

  left join tlinkstorage ls3 on (ls3.ftype='LIssueToCard' and ls3.fsrcobject=o1.fname) left join tobjectstorage o3 on (ls3.fdestobject=o3.fname)

where

  o1.ftypename='TCardIssue'
Теперь собственно вопрос. В select можно включать конструкцию rows. Хотелось ее использовать для постепенной выборки.

Тест: 25 тысяч объектов нужного типа (всего их под 100 тысяч), пытаюсь выбрать по 1000 за раз. Т.е. к select'у приписывается rows 1 to 1000 (1000 to 2000 и т.д.).
Использую isql.

Такое ощущение, что при возрастании интервала возрастает время выборки (как будто происходит fetch всех предыдущих записей).

Что я делаю не так?
:)

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: select ... rows

Сообщение WildSery » 30 июл 2007, 19:32

kas писал(а):как будто происходит fetch всех предыдущих записей.
Никаких "как будто". Как по-твоему сервер должен узнать, что вот эта запись именно 1000-я, а вот эта 999-я?
Только выбрав все предыдущие и посчитав их.

kas
Сообщения: 2
Зарегистрирован: 30 июл 2007, 16:50

Re: select ... rows

Сообщение kas » 31 июл 2007, 11:18

Понятно, спасибо.
Будем искать.
:)

Ответить