栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用SQL搜索DB2进行分页的最快,最高效的方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用SQL搜索DB2进行分页的最快,最高效的方法

如果您要显示结果的总计数和分页计数(因此38中为‘0到25’),那么最好的选择是单独声明。我已经尝试了很多方法来获取各个行旁边的计数,但是性能(即使在中等测试数据库上)也很糟糕。

您可能应该做的是创建一个可以查询的视图,其中包含所有选择条件,然后将其包装为必需的行为即可:
Count:

SELECt COUNT(*)FROM view

排名行:

SELECt *FROM (SELECt *, ROW_NUMBER() OVER(ORDER BY item) as RANK      FROM view) as TEMPWHERe RANK BETWEEN 0 AND 25

您当然需要添加相对where条件,但这是视图要处理的事物类型。

如果您实际上不需要提前知道总行数,则只需将最终排名设置为开始排名加上一些偏移即可。然后,当您使用PHP显示结果时,只需编辑结尾显示值。

一些随机的注释:1)是否有

line
不是
upper()
d的原因?
2)仅仅因为所有的字符串操作/比较,此查询的性能几乎将受到影响,无论您做什么。是否有可能消除或忽略某些条件?除非已将用于各种字符串列的索引
upper
应用于它们(某些更高版本的DB2允许将某些标量函数应用于索引键),否则大多数索引将完全无用(这并不能帮助您“重新寻找
%ANYTHING%
毕竟)。


好的,有一种“棘手”的方法可以执行类似的操作,并且似乎可以获得良好的性能…尝试这样的操作(首先定义一个视图确实会有所帮助):

SELECt TEMP.*, CASE WHEN RANK = 0 THEN (SELECT COUNT(*)       FROM view)         ELSE 0 ENDFROM (SELECt *, ROW_NUMBER() OVER(ORDER BY item) as RANK      FROM view) as TEMPWHERe RANK BETWEEN 0 AND 25

当然,您仍然必须

where
在subselect中定义您的子句…



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/441466.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号