我有一个包含5000万条记录的表,但是结构紧凑(id,int1,int1,int2,int3)。所有相关索引均已实现。
我需要为每个用户互动查询约50次。使用针对数据库服务器的常规预备查询,这大约需要5秒钟。所有查询都是简单选择。
我的问题是:即使显着增加内存,我该怎么办才能加快速度?用于查询的“定位”方法不够灵活,直接在查询中使用过滤器很慢。
我正在运行的主要查询是
select knowledge_id, knowledge_family_id, tag_level, tag_order,
total_title_direct_words, total_title_parenthesis_words from knowledge_tags
where dictionary_word_id = XX order by tag_level, tag_order
有人可以提出策略吗? TVirtualTable会增加速度吗?
最佳答案
我认为,将整个数据加载到TClientDataSet
并使用FINDKEY
查找这些记录会更快。
要使用FindKey()
,您必须定义如下索引:
Cds.IndexDefs.ADD('IDX1', 'FieldA;FieldB',[]);
Cds.IndexName := 'IDX1';
if Cds.FindKey([A,B]) then begin
//Do something
end;
您还可以创建多个索引,并在需要时使用它:
Cds.IndexDefs.ADD('IDX1', 'FieldA;FieldB',[]);
Cds.IndexDefs.ADD('IDX2', 'FieldD;FieldB',[]);
Cds.IndexDefs.ADD('IDX3', 'FieldA;FieldC',[]);
if SeekAB then
Cds.IndexName := 'IDX1'
else if SeekDB then
Cds.IndexName := 'IDX2'
else
Cds.IndexName := 'IDX3';