我有一个包含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';

10-07 19:21