首页 > 解决方案 > FoxPro SELECT 语句降低网络性能

问题描述

SELECT数据库的语句很慢。数据库表有 95.000 条记录。

我有一个索引列表,其中包含索引标签。使用 VPN 测试了远程连接,所以我可以看到速度很慢。

SELECT * 
FROM CONTACT 
WHERE SUB_NR = 'LD96178117'

-> 需要 3 秒。

SELECT TOP 50 CONTACT.* 
FROM CONTACT 
ORDER BY SUB_NR

-> 需要 142 秒。

第二次在同一个 AdoConnection 中查询运行得更快。

PROVIDER=VFPOLEDB.1;Data Source=X:\Projects\FoxPro\ElvyTest\ADMSEGJN.DBC;Collating Sequence=machine;SourceType=dbf;Deleted=Yes;Mode=ReadWrite|Share Deny None;Mode=Share Deny None;DELETED=True;CODEPAGE=1252;MVCOUNT=16384;ENGINEBEHAVIOR=90;TABLEVALIDATE=0;REFRESH=5;VARCHARMAPPING=False;ANSI=True;REPROCESS=5;OLE DB Services = 0;

SELECT TOP 50 CONTACT.* 
FROM CONTACT 
ORDER BY SUB_NR

还测试了:

SET COLLATE TO "MACHINE"

或者

SET COLLATE TO "GENERAL"

在 FOXPRO 9.0 SP2 ATAGINFO() 中打开文件显示:

TAGNAME: SUB_NR, TAGTYPE: REGULAR,     
EXPRESSION: SUB_NR,FILTER, ORDER: ASCENDING, COLLATION: MACHINE

看起来 VFPOLEDB.1 正在 %TEMP% 文件夹中创建一个临时索引。

SYS(3054,12) 在 Foxpro 中显示 Rushmore 使用带有 select 语句的索引

SELECT * 
FROM CONTACT  
WHERE SUB_NR = 'LD96178117'

使用索引选项卡 Sub_nr rushmore 优化表联系 Rushmore 表联系优化级别:full

SELECT TOP 50 * 
FROM CONTACT 
ORDER BY SUB_NR

表联系人的 Rushmore 优化级别:无

标签: foxpro

解决方案


这个命令:

SELECT * from CONTACT WHERE SUB_NR='LD96178117' 

告诉 SQL 在索引中查找 SUB_NR,并返回该行中的所有数据。

这个命令:

SELECT TOP 50 CONTACT.* from CONTACT ORDER BY SUB_NR

告诉 SQL 按 SUB_NR 对表进行排序(很可能会生成临时表),一旦完成,就拉回前 50 条记录。VFP OLE 提供者如何选择优化这是任何人的猜测。TOP 在 2008 版中添加到 SQL Server。如果您使用的是旧的 OLE 提供程序,或者它没有针对 TOP 命令进行优化,您可能会看到不可预测的性能。

第一次运行查询后,后续运行相同查询将从内存缓存中提取,无需访问磁盘,从而获得更好的性能。此外,由于您在共享模式下打开文件,锁定可能是一个因素。此外,DELETED 设置意味着返回的记录必须检查已删除的标记


推荐阅读