MS Access:检索连接字段的 DISTINCT 组合的最佳索引策略
MS Access: Best indexing strategy for retrieving DISTINCT combinations of joined fields
我在 MS Access 2010 中有两个表:
Table tblA:
idA AutoNumber
a Text(255)
b Text(255)
c Text(255)
x Text(255)
y Text(255)
Table 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 上创建一个复合索引吗?或者每个字段应该单独索引?
我尝试了两种选择,第一种似乎产生了稍微好一点的结果,尽管两者在性能方面都不是很令人满意。我想了解更多有关理论背景的信息,并感谢您的每一次投入。
当您加入 所有 条记录时,DBMS 可能会简单地决定进行完整 table 扫描以加入 table 条记录。
对于 tblA(idA)
和 tblB(fkA)
上的索引,您可以让 DBMS 选择使用这些索引,但是是否使用它们取决于 DBMS(它会 - 希望 - 决定更快的方式,以哪个为准)。
您还可以提供覆盖索引的DBMS。这意味着查询中使用的所有列都在该索引中,因此如果 DBMS 使用它,它不必另外访问 table,而是可以从索引本身获取所有内容。由于没有 where 子句,DBMS 可能仍然更喜欢逐行访问 table,而不是通过索引访问 运行。覆盖索引将是:
tblA(idA, a, b, c)
tblB(fkA, d, e)
我在 MS Access 2010 中有两个表:
Table tblA:
idA AutoNumber
a Text(255)
b Text(255)
c Text(255)
x Text(255)
y Text(255)
Table 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 上创建一个复合索引吗?或者每个字段应该单独索引?
我尝试了两种选择,第一种似乎产生了稍微好一点的结果,尽管两者在性能方面都不是很令人满意。我想了解更多有关理论背景的信息,并感谢您的每一次投入。
当您加入 所有 条记录时,DBMS 可能会简单地决定进行完整 table 扫描以加入 table 条记录。
对于 tblA(idA)
和 tblB(fkA)
上的索引,您可以让 DBMS 选择使用这些索引,但是是否使用它们取决于 DBMS(它会 - 希望 - 决定更快的方式,以哪个为准)。
您还可以提供覆盖索引的DBMS。这意味着查询中使用的所有列都在该索引中,因此如果 DBMS 使用它,它不必另外访问 table,而是可以从索引本身获取所有内容。由于没有 where 子句,DBMS 可能仍然更喜欢逐行访问 table,而不是通过索引访问 运行。覆盖索引将是:
tblA(idA, a, b, c)
tblB(fkA, d, e)