Opened 2 years ago

Closed 10 months ago

#20689 closed Bug (needsinfo)

Django 1.5.1: severe performance degradation on Oracle

Reported by: zakharov.vv@… 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 Changed 2 years ago by zakharov.vv@…

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset

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.

comment:2 Changed 23 months ago by wim@…

  • Triage Stage changed from Unreviewed to Accepted
  • Type changed from Uncategorized to 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 Changed 10 months ago by shaib

  • Resolution set to needsinfo
  • Status changed from new to 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).

Note: See TracTickets for help on using tickets.
Back to Top