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

Python 如何在django查询中传递oracle优化提示,python,django,oracle,Python,Django,Oracle,我正在使用Oracle11g,需要传入django查询 我需要在django中执行的Sql如下: select /*+ ORDERED USE_NL(cd) */ * from table1 d inner join table2 cd on cd.id=d.id; Table1.objects.all() >>> print qs.query SELECT (/*+ ORDERED USE_NL("TABLE1") */ 1) AS "DUMMY1", "TABL

我正在使用Oracle11g,需要传入django查询

我需要在django中执行的Sql如下:

select /*+ ORDERED USE_NL(cd) */ 
* 
from table1 d 
inner join table2 cd on cd.id=d.id;
Table1.objects.all()
>>> print qs.query

SELECT (/*+ ORDERED USE_NL("TABLE1") */ 1) AS "DUMMY1", "TABLE1"."ID", 
... FROM "TABLE1"
我不想执行,但要以某种方式集成到普通的django ORM查询中—即,在类似这样的情况下:

select /*+ ORDERED USE_NL(cd) */ 
* 
from table1 d 
inner join table2 cd on cd.id=d.id;
Table1.objects.all()
>>> print qs.query

SELECT (/*+ ORDERED USE_NL("TABLE1") */ 1) AS "DUMMY1", "TABLE1"."ID", 
... FROM "TABLE1"
编辑:这种解决方案似乎需要更多的测试 说: 如果包含提示的注释没有遵循删除、选择或更新关键字,Oracle将忽略提示。(感谢@swstephe注意到这一点)。在这个解决方案中,第一个括号是额外的,因此优化器可能根本不会处理提示

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

qs = Table1.objects.all()
使用以下选项检查查询:

>>> print qs.query # or qs.query.sql_with_params()
SELECT "TABLE1"."ID",... FROM "TABLE1"
然后,您可以使用包含提示的with列定义添加“额外”伪列:

>>> qs = qs.extra(select={"dummy1" : '/*+ ORDERED USE_NL("TABLE1") */ 1 '}).all()
如果我们现在检查查询的外观,它如下所示:

select /*+ ORDERED USE_NL(cd) */ 
* 
from table1 d 
inner join table2 cd on cd.id=d.id;
Table1.objects.all()
>>> print qs.query

SELECT (/*+ ORDERED USE_NL("TABLE1") */ 1) AS "DUMMY1", "TABLE1"."ID", 
... FROM "TABLE1"
其他有用参考:

  • 德扬戈
编辑:似乎这种解决方案需要更多的测试,因为 说: 如果包含提示的注释没有遵循删除、选择或更新关键字,Oracle将忽略提示。(感谢@swstephe注意到这一点)。在这个解决方案中,第一个括号是额外的,因此优化器可能根本不会处理提示

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

qs = Table1.objects.all()
使用以下选项检查查询:

>>> print qs.query # or qs.query.sql_with_params()
SELECT "TABLE1"."ID",... FROM "TABLE1"
然后,您可以使用包含提示的with列定义添加“额外”伪列:

>>> qs = qs.extra(select={"dummy1" : '/*+ ORDERED USE_NL("TABLE1") */ 1 '}).all()
如果我们现在检查查询的外观,它如下所示:

select /*+ ORDERED USE_NL(cd) */ 
* 
from table1 d 
inner join table2 cd on cd.id=d.id;
Table1.objects.all()
>>> print qs.query

SELECT (/*+ ORDERED USE_NL("TABLE1") */ 1) AS "DUMMY1", "TABLE1"."ID", 
... FROM "TABLE1"
其他有用参考:

  • 德扬戈

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

      但这意味着您不能使用“筛选”或限制行等常用方法。你必须手工做每件事

      以下是我的参考资料:
      我也有类似的问题。最后发现我只能使用“raw”插入优化提示(使用OP的示例):

      但这意味着您不能使用“筛选”或限制行等常用方法。你必须手工做每件事

      以下是我的参考资料:

      这似乎不起作用。Oracle optimizer提示必须紧跟在“SELECT”关键字之后。我用一个查询进行了检查,我需要在上面执行此操作,如果在值之后或括号内,则忽略提示。谢谢检查并注意到这一点。我需要做更多的测试。这似乎不起作用。Oracle optimizer提示必须紧跟在“SELECT”关键字之后。我用一个查询进行了检查,我需要在上面执行此操作,如果在值之后或括号内,则忽略提示。谢谢检查并注意到这一点。我需要做更多的测试。很好,这看起来很快也很简单,但只适用于简单的情况(qs.raw()限制)。再使用它一点,您只需要使用它来选择您定义的一个表。Django在那之后仍然可以为您处理外键表。很好,这看起来很快也很简单,但只适用于简单的情况(qs.raw()限制)。再使用它一点,您只需要使用它来选择您定义的一个表。在那之后,Django仍然可以为您处理外键表。