Python 如何在django查询中传递oracle优化提示
我正在使用Oracle11g,需要传入django查询 我需要在django中执行的Sql如下: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
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"
其他有用参考:
- 德扬戈
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仍然可以为您处理外键表。