Как у вас дела LIMIT
с DB2 для iSeries?
У меня есть таблица с более чем 50 000 записей, и я хочу вернуть записи от 0 до 10 000 и записи от 10 000 до 20 000.
Я знаю, что в SQL вы пишете LIMIT 0,10000
в конце запроса от 0 до 10000 и LIMIT 10000,10000
в конце запроса от 10000 до 20000.
Итак, как это делается в DB2? Какой код и синтаксис? (приветствуется полный пример запроса)
db2
limit
ibm-midrange
охладиться
источник
источник
Ответы:
Использование
FETCH FIRST [n] ROWS ONLY
:http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.perf/db2z_fetchfirstnrows.htm
Чтобы получить диапазоны, вам нужно будет использовать
ROW_NUMBER()
(начиная с v5r4) и использовать это вWHERE
предложении: (украдено отсюда: http://www.justskins.com/forums/db2-select-how-to-123209.html )источник
ROW_NUMBER
не является допустимым ключевым словом. Но спасибо за ссылку, это дало мне идею, и она работает.Разработал этот метод:
Вам НУЖНА таблица с уникальным значением, которую можно заказать.
Если вам нужны строки от 10 000 до 25 000, а ваша таблица имеет 40 000 строк, сначала вам нужно получить начальную точку и общее количество строк:
int start = 40000 - 10000;
int total = 25000 - 10000;
А затем передайте их по коду в запрос:
источник
Поддержка OFFSET и LIMIT была недавно добавлена в DB2 for i 7.1 и 7.2. Для получения этой поддержки вам потребуются следующие уровни групп DB PTF:
Смотрите здесь для получения дополнительной информации: OFFSET и LIMIT документации , DB2 для я Enhancement Wiki
источник
Вот решение, которое я придумал:
Инициализируя LASTVAL значением 0 (или '' для текстового поля), а затем устанавливая его на последнее значение в самом последнем наборе записей, это будет проходить через таблицу кусками по N записей.
источник
N
он меньше, чем количество идентичных значений в столбце (хотя это верно и при использованииROW_NUMBER()
). Начальные значения также следует выбирать с осторожностью -0
очевидно, это будет проблематично, если столбец содержит отрицательное значение. С нулевыми значениями потребуется осторожность. Не будет работать, если страницы будут пропущены.Решение @elcool - разумная идея, но вам нужно знать общее количество строк (которое может даже измениться во время выполнения запроса!). Поэтому я предлагаю модифицированную версию, которая, к сожалению, требует 3 подзапроса вместо 2:
где
{last}
следует заменить на номер последней нужной мне записи и{length}
заменить на количество строк, которое мне нужно, рассчитанное какlast row - first row + 1
.Например, если мне нужны строки от 10 до 25 (всего 16 строк),
{last}
будет 25 и{length}
будет 25-10 + 1 = 16.источник
Вам также следует рассмотреть предложение OPTIMIZE FOR n ROWS. Подробнее обо всем этом можно прочитать в документации DB2 LUW в разделе Рекомендации по ограничению операторов SELECT :
источник
Попробуй это
источник
Есть 2 решения для эффективной разбивки на страницы в таблице DB2:
1 - метод, использующий функцию row_number () и предложение OVER, которое было представлено в другом посте («SELECT row_number () OVER (ORDER BY ...)»). На некоторых больших столах я иногда замечал снижение производительности.
2 - техника с использованием прокручиваемого курсора. Реализация зависит от используемого языка. Этот метод кажется более надежным на больших столах.
Я представил 2 метода, реализованные в PHP, на семинаре в следующем году. Слайд доступен по этой ссылке: http://gregphplab.com/serendipity/uploads/slides/DB2_PHP_Best_practices.pdf
Извините, но этот документ только на французском языке.
источник
Доступны следующие варианты: -
источник