Opened 11 years ago
Closed 10 years ago
#20689 closed Bug (needsinfo)
Django 1.5.1: severe performance degradation on Oracle
Reported by: | Owned by: | nobody | |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.5 |
Severity: | Normal | Keywords: | Oracle, cx_oracle, unicode |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
After migrating to Django 1.5.1, several queries takes thousands times more time comparing to Django 1.4.5.
Example query generated by ORM:
SELECT COUNT(*) FROM "TICKETS" WHERE ("TICKETS"."T_TYPE" IN (:arg0, :arg1, :arg2, :arg3) AND "TICKETS"."T_PARTNER_CODE" = :arg4 AND "TICKETS"."T_CHANEL" = :arg5 AND "TICKETS"."T_WORKER_CODE" = :arg6 AND "TICKETS"."T_CDATE" <= :arg7 AND "TICKETS"."T_CDATE" >= :arg8 )
Django 1.4.5: ~7ms
Django 1.5.1: ~193574ms (about 27000 times more!)
git bisect
points to this commit: https://github.com/django/django/commit/d194f290571f7e9dda7d2fd7a6f2b171120f2f14. Indeed, forcing convert_unicode
to be equal to force_bytes
solves the issue.
The only found difference is in params to query:
Django 1.4.5:
[1, 38, 76, 92, '777-61', 61, 'pupkin', '2013-07-03 00:00:00', '2013-06-01 00:00:00']
Django 1.5.1:
[1, 38, 76, 92, u'777-61', 61, u'pupkin', u'2013-07-03 00:00:00', u'2013-06-01 00:00:00']
Django 1.5.1 hangs on this string (django/db/backends/oracle/base.py:710):
return self.cursor.execute(query, self._param_generator(params))
Directly using cx_Oracle for this query shows no difference for two variants of query params.
Used versions:
- cx-Oracle 5.1.2
- instantclient 11.2.0.3.0 (same for instantclient 10.2.0.5)
- Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
Change History (3)
comment:1 by , 11 years ago
comment:2 by , 11 years ago
Triage Stage: | Unreviewed → Accepted |
---|---|
Type: | Uncategorized → Bug |
Accepted. If you would like to contribute and would like to submit a patch (or even a pull request), you are welcome to do so!
comment:3 by , 10 years ago
Resolution: | → needsinfo |
---|---|
Status: | new → closed |
Hi,
This ticket refers to versions of Django (1.5) and Oracle server (10g) which are no longer supported by their respective vendors, so I am closing it.
If the problem can be reproduced on newer versions (Oracle>=11 and Django>=1.7), please re-open.
(Although Django 1.7 nominally supports Oracle 10g, the core team has no access to an Oracle 10 server, which makes it very hard for us to solve problems against it).
It seems, that issue affects only large tables. Table from example in description has about 100 million records. For small tables (thousands records) query time doesn't change after upgrading to 1.5.1.