上回说到:先回顾上篇
卫中提到,“按这种三层嵌套查询,如果要查第十万至十万零五的数据,它首先查询并排序,然后查出前十万零五条数据,然后再查询出十万条后的数据,这样取出想要的数据,性能会受影响吧?”卫中已做出部分实验,在sqlserver中根据row_number排号,并查询betweent某两行号之间的数据,查询百条数据时间为0ms级别。
我提到的三层嵌套分页查询,是用的Oracle的rounum.他的想法是row_number+between可能会快一些。所以我在此做个对比。为了有可比性,当然要同一个数据库。so,都通过Oracle做对比。
rownum:
1.从16389条数据中,查询第3至13条。
SELECT
rn, ID
FROM
(
SELECT
ROWNUM rn,
STUDENT."ID"
FROM
STUDENT
WHERE
ROWNUM <= 13
)s
WHERE
rn > 3 时间:
2.从16389条数据中,查询第16370条至16380条
SELECT
rn, ID
FROM
(
SELECT
ROWNUM rn,
STUDENT."ID"
FROM
STUDENT
WHERE
ROWNUM <= 16380
)s
WHERE
rn > 16370 时间:
通过rownum本身的对比,说明确实取后面的数据,比取前面的数据要用较多的时间。
row_number:
1.从16389条数据中,查询第3至13条。
SELECT
rn,
ID
FROM
(
SELECT
ROW_NUMBER () OVER (ORDER BY ID) AS RN,
ID
FROM
STUDENT
)
WHERE
rn BETWEEN '3'
AND '13'时间:
2.从16389条数据中,查询第16370条至16380条
SELECT
rn,
ID
FROM
(
SELECT
ROW_NUMBER () OVER (ORDER BY ID) AS RN,
ID
FROM
STUDENT
)
WHERE
rn BETWEEN '16370'
AND '16380'时间:
总结:
取前面11条数据的时间:rownum
取后面11条数据的时间:rownum
rownum:取前面11条数据的时间
row_number():取前面11条数据的时间
相对取出11条数据(无论前后),rownum比row_number()大概节省一半的时间。
Ok,这就是对比的结果,看来,经典的分页查询,通过rownum还是很有道理的。因为它比row_number节省一半时间呢。咔咔~~