2014-10-31 48 views

回答

3

編輯:看來,這種解決方案需要更多的測試,因爲 oracle reference for optimizer hints說: 甲骨文忽略提示如果註釋包含3他們不遵循DELETE,SELECT或UPDATE關鍵字。(感謝@swstephe注意到這一點)。在這個解決方案中,第一個括號是額外的,因爲這可能優化器根本不會處理提示。

如果需要的話,你可以先檢查一下它的別名創建SQL時,Django使用:

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

這似乎並沒有工作。 Oracle優化器提示必須在「SELECT」關鍵字後立即出現。我檢查了一下我需要做的這個查詢,並且如果在一個值之後或者在這些括號內,提示被忽略。 – swstephe 2015-02-05 17:36:09

+0

感謝您檢查並注意到這一點。我需要做更多的測試。 – 2015-02-06 22:52:19

1

我也有類似的問題。最後發現,我只能用「原始」插入優化提示,(使用OP的例子):

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

但是,這意味着你不能用通常的方法,如「過濾器」或限行。你必須手動完成所有的事情。

這是我參考: https://docs.djangoproject.com/en/1.7/topics/db/sql/

+0

不錯,這看起來既快又簡單,但僅適用於簡單情況(qs.raw()限制)。 – 2015-02-06 17:48:10

+0

多玩一會,你只需要用它來選擇你定義的一張表。之後,Django仍然可以爲你處理外鍵表。 – swstephe 2015-02-06 20:15:20