foxpro - 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 优化级别:无
解决方案
这个命令:
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 设置意味着返回的记录必须检查已删除的标记
推荐阅读
- autosys - 如何将 autosys 作业开箱即用?
- c - 结构中动态数组的内存损坏?
- node.js - Redis 的 EVAL atomic wrt 是连接还是整个数据存储?
- regex - 匹配不在括号内的浮点数
- ssis - SSIS 数据源 - 忽略随机格式错误的行
- javascript - 在 React 中 useEffect 在值从其他组件更改后不会更新
- r - R:根据两个条件创建一个变量
- c# - c#错误cs0117'System.Diagnostics.Debug'不包含'Log'的定义
- python - 使用 docker 容器在生产中运行 celery 工人是否被认为是一种好习惯?
- json - 在从 HttpClient 请求获得的对象转换新类型之前,如何使用 rxjs 映射来改变对象中的数据?