Скажем, у меня есть некоторый оператор SELECT
:
SELECT id, name FROM people
ORDER BY name ASC;
У меня есть несколько миллионов строк в таблице people
и предложение ORDER BY
может быть намного сложнее, чем то, что я показал здесь (возможно, работая с дюжиной столбцов).
Я получаю только небольшое подмножество строк (скажем, строки 1..11), чтобы отобразить их в пользовательском интерфейсе. Теперь я хотел бы решить следующие задачи:
id
.id
.Задачу 2 легко решить, как только я решу задачу 1, так как я могу использовать что-то подобное, если я знаю, что элемент, который я искал, имеет номер строки 1000
в отсортированном наборе результатов ( это диалект SQL Firebird):
SELECT id, name FROM people
ORDER BY name ASC
ROWS 995 TO 1005;
Я также знаю, что могу найти рангстроки, подсчитав все строки, предшествующие той, которую я ищу, но это может привести к очень длинные предложения WHERE
с тоннами OR
и AND
в условии. И мне приходится делать это неоднократно. С моими тестовыми данными это занимает сотни миллисекунд, даже при использовании правильно проиндексированных столбцов, что слишком медленно.
Есть ли способ добиться этого с помощью некоторых функций SQL:2003 (например, row_number
, поддерживаемых в Firebird 3.0)? Я никоим образом не являюсь гуру SQL, и здесь мне нужны некоторые указатели. Могу ли я создать кешированное представление, в котором результат будет включать индекс ранга/плотного ранга/строки?