我在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上创建一个复合索引吗?或者每个字段是否应单独编制索引?
我尝试了两种选择,第一种似乎产生稍微好一点的结果,尽管两者在性能方面都不是很令人满意。我想更多地了解理论背景并欣赏每一个输入。
答案 0 :(得分:1)
当您加入所有记录时,DBMS可能只是决定是否进行全表扫描以加入表格。
对于tblA(idA)
和tblB(fkA)
上的索引,您可以让DBMS选择使用这些索引,但是由DBMS决定是否这样做(它会 - 希望 - 决定为了更快的方式,无论这个是什么)。
您还可以提供涵盖索引的DBMS。这意味着查询中使用的所有列都在该索引中,因此如果DBMS使用它,它不必另外访问该表,但可以从索引本身获取所有内容。由于您没有where子句,DBMS可能仍然希望逐行访问表,而不是运行索引。覆盖索引将是:
tblA(idA, a, b, c)
tblB(fkA, d, e)