sql - Providex 查询性能

标签 sql database

我正在对我们在 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 倍)的性能差异。 OrderDate 是否可能已编入索引而 InvoiceDate 未编入索引?我试过 BETWEEN 子句,但它似乎在 providex 方言中不起作用。我在自定义报表引擎中通过 .NET 使用 ODBC 接口(interface)。我一直在调试报告,当我要求 VS 全部中断时,它正在数据库执行点运行,在 8 分钟报告等待的同一位置,所以几乎可以肯定它是我的查询中的某些内容或数据库中的某些内容搞砸了。

如果只是 InvoiceDates 没有索引,我还能在 SQL 的 providex 方言中做些什么来优化这些查询的性能?我应该更改标准的顺序吗?此报告获取特定销售人员的结果,这就是存在 SMC 条款的原因。前面的子句用于内部联接,最后一个子句用于日期范围。

我在 OrderDate 和 InvoiceDate 版本中使用了相同的日期范围,并多次运行它们并得到相同的结果。

最佳答案

我仍然不知道为什么它这么慢,但是我们在查询结果方面遇到了另一个问题(我们切换回使用 OrderDate)。由于 IM1 表的性质,我们没有得到一些结果。

因此,在弄清楚 Providex 的语法后,我添加了一个 Left Outer Join。出于某种原因,即使我们仍然有 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 的世界。

关于sql - Providex 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/425382/

相关文章:

sql - 是否有任何纯 sql 方法可以通过以下方式从日志表中删除数据

java - 连接池不会重用空闲连接

sql - 如何使sql在snowflake的show命令中评估字符@

sql - 什么是对 SQLite 数据库(仅模式)进行版本控制的好方法(或工具)?

mysql - OpenSuse - 在 mysql 上设置时区

javascript - 如何在 GraphQL 中进行简单的连接?

android - 如何在 Android 的 Eclipse Debug模式下查看 SQL 数据库

php - 选择自定义结果

mysql - 带通配符的 DISTINCT/GROUP BY。数据库

sql - 无法在子查询的 where 子句中引用聚合函数的别名