Sql Providex查询性能

Sql Providex查询性能,sql,database,Sql,Database,我正在对我们在MAS 90中使用的providex数据库运行查询。该查询有三个表连接在一起,虽然速度很慢,但也不是不可忍受的,每次运行大约需要8分钟。查询在where子句中有许多条件: 我将省略查询中的select部分,因为它既长又简单,只是结果中要使用的三个表中的字段列表 但是8分钟运行时版本中的表和where子句是: (第一个参数是用户选择的日期范围的下限,第二个是上限。) 来自“应收发票历史明细”“应收发票历史明细”, “应收账款发票历史记录头”“应收账款发票历史记录头”“IM1\U库存主

我正在对我们在MAS 90中使用的providex数据库运行查询。该查询有三个表连接在一起,虽然速度很慢,但也不是不可忍受的,每次运行大约需要8分钟。查询在where子句中有许多条件:

我将省略查询中的select部分,因为它既长又简单,只是结果中要使用的三个表中的字段列表

但是8分钟运行时版本中的表和where子句是:

(第一个参数是用户选择的日期范围的下限,第二个是上限。)

来自“应收发票历史明细”“应收发票历史明细”,
“应收账款发票历史记录头”“应收账款发票历史记录头”“IM1\U库存主文件”
“IM1\U目录主文件”
其中“AR_InvoiceHistoryDetail”。“InvoiceNo”=“AR_InvoiceHistoryHeader”。“InvoiceNo”
和“AR_InvoiceHistoryDetail”。“ItemCode”=“IM1_InventoryMasterfile”。“ItemNumber”
和“AR_InvoiceHistoryHeader”。“SalesorsonNo”=“SMC”
和“AR_InvoiceHistoryHeader”。“OrderDate”>=@p_dr

还有“AR_InvoiceHistoryHeader”、“OrderDate”我以前从未使用过providex

搜索出现在创建索引的语法上

查看您的查询,有三个表和五个条件。其中两个条件是“连接条件”,三个条件是筛选条件:

AND "AR_InvoiceHistoryHeader"."SalespersonNo" = 'SMC'
AND "AR_InvoiceHistoryHeader"."OrderDate" >= @p_dr
AND "AR_InvoiceHistoryHeader"."OrderDate" <= @p_d2
和“AR_InvoiceHistoryHeader”。“SalesorsonNo”=“SMC”
和“AR_InvoiceHistoryHeader”。“OrderDate”>=@p_dr

还有“AR_InvoiceHistoryHeader”。“OrderDate”我仍然不知道它为什么这么慢,但是我们在查询结果中遇到了另一个问题(我们切换回使用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" <= ?
来自“应收发票历史记录头”“应收发票历史记录头”,
{OJ“AR_发票历史详细信息”“AR_发票历史详细信息”
左外联接“IM1\U InventoryMasterfile”“IM1\U InventoryMasterfile”
在“应收发票历史详细信息”上,“项目代码”=
IM1\U InventoryMasterfile.“ItemNumber”}
其中“AR_发票历史详情”。“发票编号”=
“应收账款发票历史记录头”“发票编号”和
“应收发票历史抬头”。“销售人员编号”=“SMC”
和“AR_InvoiceHistoryHeader”。“InvoiceDate”>=?

和“AR_InvoiceHistoryHeader”。“InvoiceDate”我没有使用.NET,因此我的问题可能会显示出无知,但在Access中,如果涉及多个表,您必须使用SQL传递查询从ProvideX中写入任何结果。

祝您好运!也许我只是消息不灵通,但我还没有听说过ProvideX。对于一个不太广泛采用的数据库,有了这样一个特定的问题,您最好找到供应商提供的论坛。也许我错了,有成百上千的SO用户可以提供帮助。我有点怀疑。索引可能是个问题,但前提是你有一个相当大的数据库或是服务器性能严重不足。是否发票日期列是计算的而不是值列?您可以查看服务器上的任务管理器/Perfmon,看看它是空闲的、磁盘抖动的还是CPU烧坏的吗?Sage Software的MAS 90/200记帐软件除了使用SQL server版本外,还使用providex。我查一下。从未想过测试资源消耗。这是一个中等规模的企业会计系统,因此表中有大量但数量不多的记录。我已经致电我们的一位顾问,他经常与Sage/Providex合作,因此如果他明天有答案,我将在这里分享。在providex中,查询性能有一段时间存在问题,因此可能是db平台没有那么好。我认为需要
providex
标记。我试着补充,但由于名声不好,无法补充。这将是很好的,如果有人与声誉1500+可以添加它。谢谢不幸的是,我没有能力为MAS90系统添加索引。然而,问题已经解决了,尽管一开始速度如此之慢仍然是个谜。他们似乎已经记下了David B提到的文章。您在哪里找到JOIN语句的语法?我正试图像您一样将头文件加入到详细文件中,但我没有任何运气。我有一本providex参考手册,可以在下次工作时找到。语法很奇怪。字段名必须使用双引号,而不是[]。但我也发现了这个。inneroj tableref内部联接tableref ON boolean | tableref内部联接inneroj ON boolean oj tableref左外部联接tableref ON boolean | tableref左外部联接oj ON boolean | inneroj
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" <= ?