我尝试使用以下模型对oracle数据库进行查询:
class FCSTrunkValidation(Validation):
card_transaction = models.CharField(max_length=10, db_column='card_trnsctn_seq', primary_key=True)
card_number = models.CharField(max_length=16, db_column='card_num')
use_date = models.CharField(max_length=14, db_column='use_date')
device = models.ForeignKey('TrunkDevice', db_column='device_id')
agency_id = models.CharField(max_length=3, db_column='agency_id')
这个问题:
^{pr2}$当我qs.count()
我得到了这个:
...
File "/home/diegueus9/dev/odm/local/lib/python2.7/site-packages/django/db/models/query.py", line 93, in __repr__
data = list(self[:REPR_OUTPUT_SIZE + 1])
File "/home/diegueus9/dev/odm/local/lib/python2.7/site-packages/django/db/models/query.py", line 108, in __len__
self._result_cache.extend(self._iter)
File "/home/diegueus9/dev/odm/local/lib/python2.7/site-packages/django/db/models/query.py", line 317, in iterator
for row in compiler.results_iter():
File "/home/diegueus9/dev/odm/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 775, in results_iter
for rows in self.execute_sql(MULTI):
File "/home/diegueus9/dev/odm/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 840, in execute_sql
cursor.execute(sql, params)
File "/home/diegueus9/dev/odm/local/lib/python2.7/site-packages/django/db/backends/util.py", line 41, in execute
return self.cursor.execute(sql, params)
File "/home/diegueus9/dev/odm/local/lib/python2.7/site-packages/django/db/backends/oracle/base.py", line 717, in execute
six.reraise(utils.DatabaseError, utils.DatabaseError(*tuple(e.args)), sys.exc_info()[2])
File "/home/diegueus9/dev/odm/local/lib/python2.7/site-packages/django/db/backends/oracle/base.py", line 710, in execute
return self.cursor.execute(query, self._param_generator(params))
DatabaseError: ORA-02395: exceeded call limit on IO usage
但是,如果我用squirrelclient执行查询,我得到了数字,那么django可能会执行额外的查询,从而引发错误?我怎样才能让伯爵和django一起工作?在
我想使用原始sql,但是在转义LIKE
部分的%
时遇到了一个问题
软件包版本
Python==2.7.4 Django==1.5.4 cx Oracle==5.1.2 六==1.4.1
更新20131023
根据@alko的建议,我在第709行的django.db.backends.oracle.base
中添加了一个print语句,如下所示:
print query, self._param_generator(params)
然后我用squirrell中的这些参数执行查询,仍然得到了count的数量。在
我的手动查询是:
select count(*) from TBAAD300 where AGENCY_ID=201 and USE_DATE LIKE '20130930%'
django使用的查询是:
SELECT COUNT(*) FROM "TBAAD300" WHERE ("TBAAD300"."AGENCY_ID" = :arg0 AND "TBAAD300"."USE_DATE" LIKE TRANSLATE(:arg1 USING NCHAR_CS) ESCAPE TRANSLATE('\' USING NCHAR_CS) )
以[u'201', u'20130930%']
作为参数
然后我在squirrell中执行了相同的查询,结果是130410,但是当django执行时,也会产生同样的错误,print
语句打印的完整查询是:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA' []
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF' TIME_ZONE = 'UTC' []
SELECT 1 FROM DUAL WHERE DUMMY LIKE TRANSLATE(:arg0 USING NCHAR_CS) ESCAPE TRANSLATE('\' USING NCHAR_CS) [u'X']
SELECT COUNT(*) FROM "TBAAD300" WHERE ("TBAAD300"."AGENCY_ID" = :arg0 AND "TBAAD300"."USE_DATE" LIKE TRANSLATE(:arg1 USING NCHAR_CS) ESCAPE TRANSLATE('\' USING NCHAR_CS) ) [u'201', u'20130930%']
甲骨文是你的产品数据库吗?ORA-02395意味着IO限制,https://forums.oracle.com/thread/655458,似乎您的
count()
查询会导致对数据库中的大表进行完全扫描,并对每个查询的块读取进行限制。在我建议您重新考虑您的数据模型,您可以使用
DateField
作为use_date
字段,并将查询替换为filter(use_date__gte = ..., use_date___lte = ...)
?在这种情况下,您可以通过添加index on use_date字段来显著提高性能和IO使用率,因为count和类似查询可以在适当的情况下使用它。在更新(此处添加到精细格式SQL)
您的Oracle DBMS版本是什么?您是否在相同的用户凭据下运行语句?用户的资源限制是什么(this可以帮助)。在
要检查什么是资源消耗指标,还可以在sql客户端中运行以下命令:
执行计划也可能很方便
^{pr2}$如所述here
相关问题 更多 >
编程相关推荐