在研究一个不相关的主题时,我注意到在IBM知识中心网站上为Netezza使用了LIMIT ALL。我不清楚在这里指定LIMIT ALL的好处,我正在寻求澄清IBM的解释(引用如下)。我什么时候需要指定LIMIT ALL?
SELECT CASE WHEN rand = .1 THEN 'A' WHEN rand = .2 THEN 'B' ELSE 'C' END
FROM (SELECT random() rand FROM tblA LIMIT ALL) subset
来自IBM知识中心:
“子查询中的LIMIT ALL阻止它被提升到父查询中,并且对tblA的每一行只调用一次random()函数,因此在每个WHEN子句中测试相同的random()结果。”
BTW ......我的问题与IBM的例子中使用“random()”无关。
谢谢!
我的理解是支持LIMIT
的所有数据库,LIMIT ALL
与不使用LIMIT
相同。
在某些情况下,它可能用于“提示”查询优化器以某种方式创建查询计划。我相信上面的摘录来自Netezza 7.0文档。
我已经看到它在查询系统目录视图(那些以'_'开头)时经常使用,因为优化器提示会导致计划不将基础目录表的整个内容从主机上的(Postgres)数据库中拉出来并将其内容发送给SPU。一般来说,这是个好主意。