我有一个检索大量数据的查询。
<cfsetting requesttimeout="9999999" >
<cfquery name="randomething" datasource="ds" timeout="9999999" >
SELECT
col1,
col2
FROM
table
</cfquery>
<cfdump var="#randomething.recordCount#" /> <!---should be about 5 million rows --->
我可以使用 python 的 cx_Oracle 成功检索数据,并sys.getsizeof
在 python 列表中使用返回 22621060,即大约 21 兆字节。
ColdFusion 不会在页面上返回错误,而且我在任何日志中都找不到任何内容。为什么cfdump
不显示行数?
附加信息
这样做的原因是因为我有大约 8000 个较小的查询要针对该randomthing
查询运行。换句话说,当我对数据库运行这 8000 个查询时,该过程需要几个小时才能完成。我怀疑这是因为我正在与其他几个数据库用户竞争,并且数据库陷入了困境。
8000 个较小的查询在 col2 期间获得 col1 的计数。
SELECT
count(col1) as count
WHERE
col2 < 20121109
AND
col2 > 20121108
cflog 提示查询未完成。
我尝试
在代码和CFIDE/管理员中更改查询超时,显然 CF9 不再尊重 timeout 属性,无论我尝试什么,我都无法让查询超时。
我也开始玩弄这个maxrows
属性,看看我是否能以这种方式辨别任何信息。
- 当 maxrows 设置为 1300000 时一切正常
- 当 maxrows 为 1400000 或更大时,我收到此错误
- 当 maxrows 是 2000000 我观察到我原来的问题
更新
所以这不是 cfquery 的限制。通过使用QueryNew
then 循环它来添加数据,我可以毫无问题地超过 200 万大关。
我还使用这个问题中的信息创建了一个 ThinClient 数据源,我没有观察到任何行为变化。
数据库端的消息是
来自客户端的 SQL*Net 消息
和
SQL*Net 向客户端发送更多数据
我刚刚发现,通过使用瘦客户端,blockfactor1="100"
我可以检索更多行(appx. 3000000)。