使用動態SQL手動構建查詢可能由於許多原因(可擴展性,可維護性和可重用性)我們會變得更糟,但性能方面僅受限於您自己的SQL查詢編寫能力。這意味着在某些情況下,它會比使用Cognos模型更快。使用動態SQL沒有速度上的缺點。
這就是說,如果您沒有利用該模型,就會錯過Cognos的諸多好處。動態SQL將嚴重降低您保持一致性,進行廣泛更改而不重寫報表並快速生成新報表的能力。
如果您的環境很小,動態sql可能會滿足您的需求。特別是對於使用與您的其他報告無關的表格和關係的奇數一次性報告。或者,如果您希望強制使用索引的特定方式,則可以使用動態sql來實現。
編輯:重要的是要注意,Report Studio篩選器中建立的條件直到檢索到數據之後纔會傳遞到動態SQL查詢中。對於大型數據集,這可能效率極低。爲了從提示中將標準傳遞到動態SQL中,請使用#prompt('yourPromptVariableNamehere')#或#promptmany('yourMultiSelectPromptVariablehere')##。經驗法則是,在Cognos之外運行Dynamic SQL查詢並查看返回的數據量。如果您有一個巨大的銷售詢問,至少需要在日期或分支上過濾,請在提示頁面中放置提示以強制用戶選擇特定的日期/時間段/日期範圍/分支/等。插入到提示中,並使用提示/ promptmany語法將條件添加到動態SQL語句中。在Report Studio查詢中仍然可以將提示用作常規過濾器,但如果您在不使用prompt/promptmany的情況下使用動態查詢,則在從數據庫返回結果集之後過濾所有條件。
對我有很多負面影響。你不能強制任何一致性。什麼能阻止我以與你完全不同的方式加入同一張桌子?維護是一場噩夢。如果數據庫中的某些內容發生變化,則必須在每個報告中更改它,而不是在模型中更改一次。我相信這也會阻止您利用Cognos中的一些新功能(DQM,動態多維數據集)。 – Andrew 2014-11-14 20:04:05
@Andrew - 感謝您的評論。我完全同意你在維護方面的問題,但從性能的角度來看,我真的只是在考慮這一點,並且在使用動態SQL時有任何性能缺陷。 – 2014-11-17 14:02:39
如果存在性能問題,則需要在模型中解決這些問題。 Cognos根據您創建的模型確定如何生成其SQL,因此如果出現問題,您可能需要投入一些時間來識別和解決模型中的問題。 執行您的建議實際上可能會進一步損害性能,因爲Cognos會發出元數據調用以檢索每次執行時查詢的每個列的詳細信息,正如Andrew所說,某些功能將失敗。 – chsh 2014-11-17 15:02:19