我有一个复杂的问题,为了更好的理解,我正在简化它。
查询:查询具有组by、order、where子句和与其他表的多个联接。
SELECT FIRSTNAME, LASTNAME FROM CUSTOMERS ;需求:需要优化的方法,获取大查询的记录总数以及分页。
我的方法1:首先执行两个查询以查找计数,然后分页行从客户中选择COUNT(1);
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;My 3:创建第二种方法的视图。
请建议我应该选择哪种方法?根据我的研究,随着数据库视图的优化,第三种方法将比其他方法更加优化。
发布于 2015-02-20 17:36:49
没有任何视图比包含在视图中的查询更能自动使其“优化”。查询优化器对原始SQL进行分解,并通常在执行之前将其重写为一个非常不同的语句。
在执行RUNSTATS以确保表和索引具有准确的统计信息之后,DB2内置的解释工具(如db2expln实用程序、Design (db2advis)和IBM中的Visual )提供了最佳的机会来准确理解为什么特定查询选项比另一个查询更好或更糟糕。
发布于 2015-02-21 00:06:53
分页的最佳性能是当最少的数列正在执行工作时(分页),然后通过键列加入结果以获得更多的数据。两个列控制分页、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;https://stackoverflow.com/questions/28634389
复制相似问题