Re: issue with Unicode parameters
"Amaury Forgeot d'Arc" <[email protected]> Fri, 3 Jun 2016 17:00:28 +0200
| Newsgroups | gmane.comp.python.db.cx-oracle |
|---|---|
| Message-ID | <CAGmFida4ycyvL_KyckjXaDv+VdBGgLDtsxX=7yBGA2vvtqBsQg@mail.gmail.com> |
Hi, There is probably an index on this column, and for some reason it is not used when the data is unicode (= NVARCHAR on server-side). My guess is that since the "=" comparison receives different types, Oracle needs to do a conversion before it can compare the operands. By default this conversion cannot be unicode->str (because this would lose information), so it has to be str->unicode for each value in the table. In this case the index cannot be used... My suggestion is force the unicode->str comparison somehow: - either in Python, with .encode(), this will crash if the value has non-ascii characters - or in SQL, with F.LOGICAL_FILE_NAME = TO_CHAR(:logical_file_name), this can return wrong results, because the conversion can lose characters and collide with other existing data. 2016-06-03 16:39 GMT+02:00 Valentin Kuznetsov <[email protected]>: > Hi, > I identified a problem with cx_Oracle driver and would like to understand > how > it can be resolved. Basically, I observed a huge latencies with query if > I pass unicode string as binded parameter value. Below a stand-alone > code which reproduce a problem with our Oracle. > > We run CERN Scientific Linux distribution (SLC 6.8), the code runs on > x86_64 platform with gcc493 and cx_Oracle 5.2.1 > > import cx_Oracle > def test_cx_oracle(uname, pwd, host, sql, params): > time0 = time.time() > connection = cx_Oracle.connect(uname, pwd, host) > cursor = connection.cursor() > cursor.execute(sql, **params) > lfn = params['logical_file_name'] > print("lfn type=%s, cursor execute %s sec" % (type(lfn), > time.time()-time0)) > for row in cursor: > print row > cursor.close() > > def main(): > # read password from a file > ppp = open('ppp').readline().replace('\n','').replace('oracle://', '') > line = ppp.split('@') > host = line[-1] > uname, pwd = line[0].split(':') > sql = 'SELECT F.LOGICAL_FILE_NAME FROM > cms_dbs3_int_global_owner.FILES F WHERE F.IS_FILE_VALID <> -1 AND > F.LOGICAL_FILE_NAME = :logical_file_name' > lfn = > '/store/generator/Summer11/ZZTo4e_7TeV_mll8_mZZ95-160-powheg15-pythia6/GEN/START311_V2-v2/00000/BA1D37D5-93EE-E211-ADCF-003048F174AC.root' > params = {'logical_file_name': lfn} > test_cx_oracle(uname, pwd, host, sql, params) > params = {'logical_file_name': u'%s' % lfn} > test_cx_oracle(uname, pwd, host, sql, params) > > if __name__ == '__main__': > main() > > The output of this program is the following: > > lfn type=<type 'str'>, cursor execute 0.0578980445862 sec > > ('/store/generator/Summer11/ZZTo4e_7TeV_mll8_mZZ95-160-powheg15-pythia6/GEN/START311_V2-v2/00000/BA1D37D5-93EE-E211-ADCF-003048F174AC.root',) > > lfn type=<type 'unicode'>, cursor execute 144.633666992 sec > > ('/store/generator/Summer11/ZZTo4e_7TeV_mll8_mZZ95-160-powheg15-pythia6/GEN/START311_V2-v2/00000/BA1D37D5-93EE-E211-ADCF-003048F174AC.root',) > > As you can see using string parameter we quickly get results from Oracle > in 0.06 sec, while using unicode we see huge latency 144sec. > > Any suggestions why unicode parameters such poorly behaves and where the > time is spent on? > > Thanks, > Valentin. > > > > > > ------------------------------------------------------------------------------ > What NetFlow Analyzer can do for you? Monitors network bandwidth and > traffic > patterns at an interface-level. Reveals which users, apps, and protocols > are > consuming the most bandwidth. Provides multi-vendor support for NetFlow, > J-Flow, sFlow and other flows. Make informed decisions using capacity > planning reports. https://ad.doubleclick.net/ddm/clk/305295220;132659582;e > _______________________________________________ > cx-oracle-users mailing list > cx-oracle-users-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org > https://lists.sourceforge.net/lists/listinfo/cx-oracle-users > -- Amaury Forgeot d'Arc ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports. https://ad.doubleclick.net/ddm/clk/305295220;132659582;e _______________________________________________ cx-oracle-users mailing list cx-oracle-users-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/cx-oracle-users