select * from Schem.Customer
where cust='20' and cust_id >= '890127'
and rownum between 1 and 2 order by cust, cust_id;
执行时间约2分10秒
select * from Schem.Customer where cust='20'
and cust_id >= '890127'
order by cust, cust_id fetch first 2 rows only ;
执行时间约 00.069 ms
执行时间有很大差异,但结果是相同的。我的团队不会采用后来的一种。别问为什么。
那么 Rownum 和 fetch 前 2 行有什么区别,我应该做什么来改进或说服任何人采用。
数据库管理系统:DB2 LUW
尽管两个 SQL 最终都会给出相同的结果集,但这只发生在您的数据上。结果集很有可能会有所不同。让我解释一下原因。
我会让你的 SQL 更简单一些,以便于理解:
SELECT * FROM customer
WHERE ROWNUM BETWEEN 1 AND 2;
在此 SQL 中,您只需要第一行和第二行。没关系。 DB2 将优化您的查询,并且永远不会查找超出第 2 行的行。因为只有前 2 行qualify您的查询。
然后你添加ORDER BY
clause:
SELECT * FROM customer
WHERE ROWNUM BETWEEN 1 AND 2;
ORDER BY cust, cust_id;
在本例中,DB2 首先获取 2 行,然后按 cust 和 cust_id 对它们进行排序。然后发送给客户(您)。到目前为止,一切都很好。但是,如果您想先按 cust 和 cust_id 排序,然后请求前 2 行怎么办?他们之间有很大的区别。
这是本例的简化 SQL:
SELECT * FROM customer
ORDER BY cust, cust_id
FETCH FIRST 2 ROWS ONLY;
在此 SQL 中,所有行都符合查询条件,因此 DB2 获取所有行,然后对它们进行排序,然后将前 2 行发送到客户端。
在您的情况下,两个查询给出相同的结果,因为前 2 行已按 cust 和 cust_id 排序。但如果前 2 行具有不同的 cust 和 cust_id 值,则它将不起作用。
关于这一点的一个提示是FETCH FIRST n ROWS
comes afterorder by,这意味着 DB2 对结果进行排序,然后检索前 n 行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)