使用Django 1.3x.
我目前有一个非常非常非常非常活跃的Postgres数据集,其中一个重要的列索引为较低(列).
我刚刚意识到一些常见的查询非常慢,因为当我使用iexact来匹配该字段时,Django ORM正在为字段生成查询,因为blah = UPPER(列).
是否有一种简单的方法可以强制ORM使用lower()代替,或者我是否需要为这一个删除原始sql?
谢谢!
[评论的侧面问题:是否有一个很好的理由,被忽略了,在索引上使用了upper()而不是lower()?]
解决方法
有趣的情况在这里.我以前从来没有真正停下来想过这件事.似乎使用UPPER进行iexact搜索是在
revision 8536年引入的,以回应近三年前的
ticket 3575.在此之前,Django一直在使用ILIKE进行这些类型的搜索.
我查看了后端代码,我发现唯一能指出UPPER vs LOWER的任何原因似乎是Oracle在处理不区分大小写的数据时默认为大写.由于其他人是不可知的,似乎Django决定默认使用UPPER来覆盖所有基础.
我从查看源代码得到的另一个印象是你不会使用UPPER.它实际上遍布整个地方,而不仅仅是在实际查询数据库时. Python的上层字符串扩展也经常使用.
我要说的最好的办法就是简单地创建一个带有上部(列)的索引,或者代替,然后去喝一杯.