优化的db2查询,包括总计数和分页

时间:2015-02-20 17:05:34

标签: optimization pagination db2 query-optimization rowcount

我有复杂的查询,我正在简化以便更好地理解。

查询:该查询具有group by,order by,where子句以及与其他表的多个连接。

SELECT FIRSTNAME, LASTNAME FROM CUSTOMERS ;

要求: 需要优化的方法,获取BIG查询的记录总数以及分页。

我的方法1:执行两个查询以先查找计数然后再查找分页行     SELECT COUNT(1)FROM FROM CUSTOMERS;

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:创建第二种方法的视图。

请建议我应该选择哪种方法?根据我的研究,与其他方法相比,第三种方法将更加优化,因为DATABSE VIEWS更加优化。

2 个答案:

答案 0 :(得分:0)

没有任何关于自动使其更优化的视图"比其中包含的查询。查询优化器分解原始SQL,并经常在执行之前将其重写为一个看起来非常不同的语句。

执行RUNSTATS以确保您的表和索引具有准确的统计信息后,DB2的内置EXPLAIN工具(例如db2expln实用程序,Design Advisor(db2advis)) ,IBM Data Studio中的Visual Explain工具提供了理解特定查询选项为何比另一个更好或更差的最佳机会。

答案 1 :(得分:0)

分页的最佳性能是当最少数量的列正在进行工作(分页),然后通过键列加入结果以获取更多数据。两列控制分页customercid和rownumber one是已经索引的主键,因为我认为customercid是唯一的。 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;