MS Access:检索已连接字段的DISTINCT组合的最佳索引策略

时间:2017-02-14 10:33:04

标签: sql ms-access indexing ms-access-2010

我在MS Access 2010中有两个表:

表格tblA:

idA AutoNumber
a Text(255)
b Text(255)
c Text(255)
x Text(255)
y Text(255)

表格tblB:

idB AutoNumber
fkA Long Integer
d Text(255)
e Text(255)
z Text(255)

...并且需要执行以下查询:

SELECT DISTINCT
  tblA.a
, tblA.b
, tblA.c
, tblB.d
, tblB.e
FROM tblA
INNER JOIN tblB
  on tblA.idA = tblB.fkA
;

两个表都非常大,我想知道什么是实现最快响应时间的最佳索引策略。 idA和idB是各自表的主键,fkA有自己的索引。 但是tblA.a,tblA.b,tblA.c,tblB.d,tblB.e呢?我应该在tblA.a,tblA.b,tblA.c和tblB.d,tblB.e上创建一个复合索引吗?或者每个字段是否应单独编制索引?

我尝试了两种选择,第一种似乎产生稍微好一点的结果,尽管两者在性能方面都不是很令人满意。我想更多地了解理论背景并欣赏每一个输入。

1 个答案:

答案 0 :(得分:1)

当您加入所有记录时,DBMS可能只是决定是否进行全表扫描以加入表格。

对于tblA(idA)tblB(fkA)上的索引,您可以让DBMS选择使用这些索引,但是由DBMS决定是否这样做(它会 - 希望 - 决定为了更快的方式,无论这个是什么)。

您还可以提供涵盖索引的DBMS。这意味着查询中使用的所有列都在该索引中,因此如果DBMS使用它,它不必另外访问该表,但可以从索引本身获取所有内容。由于您没有where子句,DBMS可能仍然希望逐行访问表,而不是运行索引。覆盖索引将是:

  • tblA(idA, a, b, c)
  • tblB(fkA, d, e)