2009-01-08 60 views
3

我正在對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版本中都使用了相同的日期範圍,並且已經將它們全部運行多次並獲得了相同的結果。

+0

祝你好運!也許我只是消息靈通,但我還沒有聽說過ProvideX。對於一個不太廣泛採用的數據庫這樣一個具體問題,您最好找到供應商提供的論壇。也許我錯了,有數百名SO用戶可以提供幫助。我有點懷疑它。 – 2009-01-08 19:02:08

+0

索引可能是這個問題,但只有當你有一個相當大的數據庫或大規模動力不足的服務器。是否可以計算髮票日期列而不是價值列?您可以查看服務器上的任務管理器/ Perfmon以查看它是否處於空閒狀態,抖動磁盤或刻錄CPU嗎? – 2009-01-08 20:45:18

回答

1

我仍然不確切知道爲什麼它如此緩慢,但是我們遇到了來自查詢結果的另一個問題(我們轉而使用OrderDate)。由於IM1表格的性質,我們沒有得到一些結果。

所以我加了一個左外連接,我找到了Providex的語法。由於某種原因,儘管我們仍然有3張桌子,但現在運行速度要快很多。

新的查詢條件是:

FROM "AR_InvoiceHistoryHeader" "AR_InvoiceHistoryHeader", 
{OJ "AR_InvoiceHistoryDetail" "AR_InvoiceHistoryDetail" 
LEFT OUTER JOIN "IM1_InventoryMasterfile" "IM1_InventoryMasterfile" 
ON "AR_InvoiceHistoryDetail"."ItemCode" = 
"IM1_InventoryMasterfile"."ItemNumber" } 
WHERE "AR_InvoiceHistoryDetail"."InvoiceNo" = 
"AR_InvoiceHistoryHeader"."InvoiceNo" AND 
"AR_InvoiceHistoryHeader"."SalespersonNo" = 'SMC' 
AND "AR_InvoiceHistoryHeader"."InvoiceDate" >= ? 
AND "AR_InvoiceHistoryHeader"."InvoiceDate" <= ? 

奇怪,但至少我在這個過程中學會了更多Providex SQL語句的世界。

0

我以前從未使用過providex。

關於創建索引的語法,搜索調出了this reference article

查看您的查詢,有三個表格和五個標準。的標準有兩個是「加盟標準」,和三個標準篩選標準:

AND "AR_InvoiceHistoryHeader"."SalespersonNo" = 'SMC' 
AND "AR_InvoiceHistoryHeader"."OrderDate" >= @p_dr 
AND "AR_InvoiceHistoryHeader"."OrderDate" <= @p_d2 

我不知道SalespersonNo有多好是限制返回的結果,但它可能是好上加一個索引。

0

我沒有使用過.NET,因此我的問題可能顯示無知,但在Access中,如果涉及多個表,則必須使用SQL傳遞查詢來從ProvideX中抽取任何結果。