我正在使用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()
答案 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/