我正在對MAS90中使用的providex數據庫運行查詢。該查詢有三個表連接在一起,速度一直很慢,但並非難以忍受,每次運行需要大約8分鐘。該查詢在where子句中有相當多的條件:Providex查詢性能
我將忽略查詢的選擇部分,因爲它的長和簡單,只是三個表中的字段列表將用於結果。
但在8分鐘的運行時間版本的表和其中子句是:(第一個參數是下界用戶選擇的日期範圍的,第二個是上限)
FROM "AR_InvoiceHistoryDetail" "AR_InvoiceHistoryDetail",
"AR_InvoiceHistoryHeader" "AR_InvoiceHistoryHeader", "IM1_InventoryMasterfile"
"IM1_InventoryMasterfile"
WHERE "AR_InvoiceHistoryDetail"."InvoiceNo" = "AR_InvoiceHistoryHeader"."InvoiceNo"
AND "AR_InvoiceHistoryDetail"."ItemCode" = "IM1_InventoryMasterfile"."ItemNumber"
AND "AR_InvoiceHistoryHeader"."SalespersonNo" = 'SMC'
AND "AR_InvoiceHistoryHeader"."OrderDate" >= @p_dr
AND "AR_InvoiceHistoryHeader"."OrderDate" <= @p_d2
但是,事實證明,同一個表中的另一個日期字段需要與日期範圍進行比較的日期字段。所以我將WHERE子句末尾的Order Dates更改爲InvoiceDate。我還沒有成功運行查詢。我等了超過40分鐘。我無法控制索引,因爲這是一個MAS 90數據庫,我不相信我可以直接更改數據庫的特徵。
什麼可能導致如此大的(至少5倍)性能差異。是OrderDate可能已被索引,而InvoiceDate不是?我嘗試了BETWEEN子句,但它似乎不能用於提供方言。我在自定義報表引擎中使用.NET通過ODBC接口。我一直在調試報告,並且當我在VS 8分鐘報告等待的同一地點詢問VS Break All時,它正在數據庫執行點運行,所以它幾乎肯定是我的查詢或數據庫中的某些內容這是搞砸了。
如果它僅僅是InvoiceDates未被索引的情況,那麼我還可以在SQL的providex方言中做些什麼來優化這些查詢的性能?我應該改變我的標準順序嗎?本報告針對特定銷售人員獲得結果,這就是SMC條款存在的原因。先前的子句用於內部連接,最後一個子句用於日期範圍。
我在OrderDate和InvoiceDate版本中都使用了相同的日期範圍,並且已經將它們全部運行多次並獲得了相同的結果。
祝你好運!也許我只是消息靈通,但我還沒有聽說過ProvideX。對於一個不太廣泛採用的數據庫這樣一個具體問題,您最好找到供應商提供的論壇。也許我錯了,有數百名SO用戶可以提供幫助。我有點懷疑它。 – 2009-01-08 19:02:08
索引可能是這個問題,但只有當你有一個相當大的數據庫或大規模動力不足的服務器。是否可以計算髮票日期列而不是價值列?您可以查看服務器上的任務管理器/ Perfmon以查看它是否處於空閒狀態,抖動磁盤或刻錄CPU嗎? – 2009-01-08 20:45:18