我正在运行一个针对我们在MAS 90中使用的providex数据库的查询。该查询有三个连接在一起的表,并且速度很慢但并非难以忍受,每次运行大约需要8分钟。该查询在where子句中有相当多的条件:
我将省略查询的选择部分作为其冗长而简单的,只是要在结果中使用的三个表中的字段列表。
但是8分钟运行时版本中的表格和where子句是:
(第一个参数是用户选择的日期范围的下限,第二个参数是上限。)
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倍)性能差异。在InvoiceDate不是时,OrderDate可能已被编入索引吗?我尝试了BETWEEN条款,但它似乎不适用于providex方言。我在自定义报表引擎中通过.NET使用ODBC接口。我一直在调试报告,它正在数据库执行点运行,当时我要求VS全部中断,在8分钟报告等待的同一地点,所以几乎可以肯定我的查询中的某些东西或数据库中的某些东西这搞砸了。
如果只是InvoiceDates未编入索引的情况,我还可以在SQL的providex方言中做些什么来优化这些查询的性能?我应该更改标准的顺序吗?此报告获取特定销售人员的结果,这就是SMC子句存在的原因。先前的子句用于内部连接,最后一个子句用于日期范围。
我在OrderDate和InvoiceDate版本中使用了相同的日期范围,并且已经多次运行它们并得到相同的结果。
答案 0 :(得分:2)
我仍然不知道为什么它如此缓慢,但我们在查询结果中遇到了另一个问题(我们切换回使用OrderDate)。由于IM1表的性质,我们没有得到一些结果。
所以我添加了一个Left Outer Join,一旦我弄清楚了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的世界。
答案 1 :(得分:0)
我以前从未使用过providex。
搜索结果显示this reference article有关创建索引的语法。
查看您的查询,有三个表和五个条件。其中两个标准是“加入标准”,三个标准是过滤标准:
AND "AR_InvoiceHistoryHeader"."SalespersonNo" = 'SMC'
AND "AR_InvoiceHistoryHeader"."OrderDate" >= @p_dr
AND "AR_InvoiceHistoryHeader"."OrderDate" <= @p_d2
我不知道SalespersonNo对于限制返回结果有多好,但最好在其上添加一个索引。
答案 2 :(得分:0)
我没有使用.NET,所以我的问题可能会显示无知,但在Access中,如果涉及多个表,则必须使用SQL Pass-Through查询来从ProvideX中获取任何结果。