我在COGNOS中查詢,這將獲取大量的數據。由於執行時間會更長,我想優化我的查詢。大家都知道查詢中的WHERE子句會先執行。執行查詢時,後端會發生什麼情況?
我的疑問是執行查詢時會先發生哪種情況?
JOIN在查詢中會先建立還是哪裏會有子句會先執行?
如果連接是成立之初,我應該指定DIMENSION第一,否則我就指定FACT第一的過濾器的過濾器。
請解釋一下。
在此先感謝。
我在COGNOS中查詢,這將獲取大量的數據。由於執行時間會更長,我想優化我的查詢。大家都知道查詢中的WHERE子句會先執行。執行查詢時,後端會發生什麼情況?
我的疑問是執行查詢時會先發生哪種情況?
JOIN在查詢中會先建立還是哪裏會有子句會先執行?
如果連接是成立之初,我應該指定DIMENSION第一,否則我就指定FACT第一的過濾器的過濾器。
請解釋一下。
在此先感謝。
SQL的思想是它是一種高級聲明性語言,這意味着你告訴它你想要什麼結果,而不是如何得到它們。在各種SQL實現中也有例外,例如Oracle中提示使用特定索引等,但作爲一般規則,這是正確的。
在幕後,RDBMS的優化器實現了關係代數,以對不同的潛在執行計劃進行基於成本的估計,並選擇它預測的最有效的計劃。關於這一點的好處是,您不必擔心自己寫的where子句的順序等,只要所有信息都在那裏,優化器應該選擇最有效的計劃。
這就是說,在數據庫中經常會出現這樣的情況,以提高查詢性能,例如在過濾條件或連接中經常使用的大型表中的列上構建索引。
另一個考慮是您是否可以使用並行提示來加快運行時間,但這取決於您的查詢,正在使用的執行計劃,您正在使用的RDBMS以及它所運行的硬件。
如果您發佈了查詢語法和您正在使用的RDBMS,我們可以檢查是否有任何明顯的可以在此情況下進行修改。
過濾器的順序絕對無關緊要。優化器會照顧到這一點。
至於過濾事實或維度表 - 你的意思是你在每個Cognos模型中暴露同一個字段(來自事實和產品維度的產品ID)?如果是這樣,那就不推薦。一般而言,您只應公開維度字段。
雖然這更多的是關於您的SQL環境的問題。我將從Report Studio中導出由Cognos生成的SQL(工具 - >顯示生成的SQL)。從那裏,希望你能夠與一個好的DBA一起工作,看看你的表中是否有明顯缺失的索引等。
Cognos中沒有很多選項可用於更改SQL生成。之前的海報提到了提示,如果編寫原生SQL可能會起作用,但這是Cognos未知的概念。實際上,你所能做的只是改變implict/explict連接語法,它只是控制連接是在ON語句還是在WHERE中發生。儘管WHERE方面非常難看,但它通常與ON編譯相同。
在數據庫運行時監視您對數據庫的查詢。獲取解釋計劃並查看它正在使用的索引。如果您需要更改標準或連接,這將爲您提供線索。 – Damienknight