我有复杂的查询,我正在简化以便更好地理解。
查询:该查询具有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更加优化。
答案 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;