如何在django查询中传递oracle优化提示

时间:2014-10-31 09:16:35

标签: python django oracle

我正在使用oracle 11g,需要在django查询中传递oracle hint

我需要在django中执行的sql是这样的:

select /*+ ORDERED USE_NL(cd) */ 
* 
from table1 d 
inner join table2 cd on cd.id=d.id;

我不想执行django raw sql query,但不知何故要集成到普通的django ORM查询中 - 例如:

Table1.objects.all()

2 个答案:

答案 0 :(得分:4)

编辑:似乎这种解决方案需要更多测试 oracle reference for optimizer hints说: 如果包含它们的注释不遵循DELETE,SELECT或UPDATE关键字,Oracle会忽略提示。(感谢@swstephe注意到这一点)。在这个解决方案中,第一个括号是额外的,因此可能优化器根本不会处理提示。

如果需要,您可以先检查django在创建sql时使用的别名:

qs = Table1.objects.all()

检查查询:

>>> print qs.query # or qs.query.sql_with_params()
SELECT "TABLE1"."ID",... FROM "TABLE1"

然后你可以添加"额外"使用django queryset extra method使用包含提示的列定义的虚拟列:

>>> qs = qs.extra(select={"dummy1" : '/*+ ORDERED USE_NL("TABLE1") */ 1 '}).all()

如果我们现在检查查询的外观 - 它看起来像这样:

>>> print qs.query

SELECT (/*+ ORDERED USE_NL("TABLE1") */ 1) AS "DUMMY1", "TABLE1"."ID", 
... FROM "TABLE1"

其他有用的参考:

答案 1 :(得分:1)

我有类似的问题。最后发现我只能使用" raw"(使用OP'示例)插入优化提示:

Table1.objects.raw("""\
    select /*+ ORDERED USE_NL(cd) */ 
    d.* 
    from table1 d 
    inner join table2 cd on cd.id=d.id
""").all()

但这意味着您无法使用常规方法,例如" filter"或限制行。你必须手动完成所有事情。

以下是我的参考: https://docs.djangoproject.com/en/1.7/topics/db/sql/