使用Teradata和python,使用长时间运行的查询获取SQL连接重置错误 - 如何分页结果?

时间:2014-12-27 22:09:39

标签: sql teradata

我有一个查询,使用Teradata和Pythong ODBC从表中选择许多行。数据库不允许长时间运行的查询,因此我需要查询以减少每个查询的时间。 (这是一种罕见的异常情况,通常查询会立即返回1000行。)在每10k个运行查询的实例中,我需要它返回70k行,但是当我尝试这个时,它是:

(<class 'pyodbc.Error'>, Error('08S01', '[08S01] [WSock32 DLL] 10054 WSA E Conn
Reset: Connection reset by peer (10054) (SQLPrepare)'), <traceback object at 0x0
14611C0>)

我认为如果我可以将每行限制为10k,那么在这种奇怪的情况下它会正常工作。有没有办法做到这一点?我知道如何在oracle中做到这一点:

select * 
from ( select a.*, rownum rnum
       from ( SELECT b.ind from item_sales b where b.cat=? ) a
      where rownum <= MAX_ROWS )
where rnum >= MIN_ROWS

但是我不知道Teradata中的等价物,因为它没有rownumber。

2 个答案:

答案 0 :(得分:1)

Teradata没有关于运行时间或答案集大小的内置限制。

Connection reset by peer表示会话已中止,DBA可能已在工作负载管理中定义了一些规则,因此我将首先处理它们。

关于分页,虽然没有ROWNUM或LIMIT标准SQL,但ROW_NUMBER可以做同样的事情。但它需要唯一的ORDER BY列:

SELECT b.ind from item_sales b where b.cat=?
QUALIFY ROW_NUMBER() OVER (ORDER BY ...) BETWEEN MIN_ROWS and MAX_ROWS

如果您确实需要所有行,这是一个愚蠢的解决方法,所以最好与您的DBA交谈。

答案 1 :(得分:0)

我不确定Teradata + PyODBC的实际限制,但如果您绝对需要返回整个行集,您是否能够使用多个查询合并数据(使用返回的PK ID作为参考) /指针然后将数据合并为一个大型数据表??

如果您只需要限制返回的行数,在MySQL中应该是这样的:

SELECT col_name
FROM tbl_name
LIMIT 0,10000; //this returns rows 0-10,000 based on your choice of or lack of an ORDER BY clause

但是你需要知道要返回的WHK 10K行,如果你知道,你应该能够编写一个视图或存储过程,它首先返回一个更精炼的结果集并查询或执行它。

根据我的经验,如果您在从数据库中仅请求70K行时超时,则查询效率低下,应该重写。在查询的每个步骤中请求所需的绝对最小数据,并按名称检索每一列(例如:不要使用&#34; SELECT * FROM&#34;使用&#34; SELECT col_A,col_B,col_C FROM& #34;,特别是如果您的表包含大量VARCHAR(MAX)类型的列或列)