Optimization 使用总计数和分页优化db2查询

Optimization 使用总计数和分页优化db2查询,optimization,pagination,db2,query-optimization,rowcount,Optimization,Pagination,Db2,Query Optimization,Rowcount,我有一个复杂的问题,为了更好地理解,我正在简化它 查询:该查询具有GROUPBY、ORDERBY、where子句以及与其他表的多个联接 SELECT FIRSTNAME, LASTNAME FROM CUSTOMERS ; 要求:需要优化的方法,获取一个大查询的记录总数以及分页 我的方法1:执行两个查询,首先查找count行,然后查找分页行 从客户中选择COUNT1 SELECT FIRSTNAME, LASTNAME, ROWNUMER FROM ( SELECT FIRSTNAME, LA

我有一个复杂的问题,为了更好地理解,我正在简化它

查询:该查询具有GROUPBY、ORDERBY、where子句以及与其他表的多个联接

SELECT FIRSTNAME, LASTNAME FROM CUSTOMERS ;
要求:需要优化的方法,获取一个大查询的记录总数以及分页

我的方法1:执行两个查询,首先查找count行,然后查找分页行 从客户中选择COUNT1

SELECT FIRSTNAME, LASTNAME, ROWNUMER FROM (
SELECT FIRSTNAME, LASTNAME, ROW_NUMBER() OVER(ORDER BY CUSTOMERCID) AS ROWNUMER FROM CUSTOMERS 
)WHERE ROWNUMER BETWEEN 10 AND 20;
我的方法2:在单个查询中查找总计数并获取所需的分页行

SELECT FIRSTNAME, LASTNAME, ROWNUMER, COUNTROWS FROM (
          SELECT FIRSTNAME, LASTNAME, ROW_NUMBER() OVER(ORDER BY CUSTOMERCID) AS ROWNUMER
          FROM CUSTOMERS 
) AS CUST, (SELECT COUNT(1) AS COUNTROWS   FROM CUSTOMERS ) AS COUNTNUM
WHERE ROWNUMER BETWEEN 10 AND 20;
我的方法3:创建第二种方法的视图


请建议我应该选择哪种方法?根据我的研究,与其他方法相比,第三种方法的优化程度更高,因为数据库视图更优化。

没有任何一种视图能自动使其比其中包含的查询更优化。查询优化器分解原始SQL,并经常在执行前将其重写为外观大不相同的语句


在执行RUNSTATS以确保表和索引具有准确的统计信息之后,DB2的内置解释工具,如db2expln实用程序、designadvisor db2advis、,IBM Data Studio中的Visual Explain工具提供了最好的机会,可以准确地理解为什么某个查询选项比另一个查询选项更好或更差。

分页的最佳性能是当最少的列进行分页时,然后按键列合并结果以获得更多数据。两列控制分页CustomerId,行编号1是已经索引的主键,因为我假设CustomerId是唯一的。customercid也在row_number函数中,因此这是最有效的分页

create view dancustomercid as 
SELECT CustomerCID, ROW_NUMBER() OVER(ORDER BY CUSTOMERCID) AS ROWNUMER FROM CUSTOMERS 
然后在视图的输出上进行连接注意,没有命令来减慢速度,只需在关键字段customercid上进行连接

SELECT FIRSTNAME, LASTNAME, ROWNUMBER from dancustomercid a join CUSTOMERCID AS b on
a.customercid = b.customercid where a.ROWNUMER  
BETWEEN 11 AND 20;

旁注:在db2中使用material view或物化查询表肯定有助于提高性能。