【发布时间】:2013-03-15 06:35:30
【问题描述】:
我的 Access 2003 数据库中有以下查询:
SELECT
Projet.OTP AS OTP,
NumeroDA,
SUM(Quantite*PrixReelCommande) AS PrixTotal,
FIRST(Fournisseur1) AS Fournisseur,
FIRST(Projet.NumeroCommandeReservation) AS NumeroCommande,
FIRST(Projet.GestionContrat) AS GestionContrat,
FIRST(Projet.Acheteur) AS Acheteur,
MIN(DateLivraisonContractuelle) AS DateLivraisonContrat,
MAX(DateFournisseurLivraison) AS DateLivraisonFournisseur,
FIRST(InfoProjet.NomInstallation) AS NomInstallation,
FIRST(InfoProjet.TitreMandat) AS TitreMandat
FROM Projet LEFT JOIN InfoProjet ON Projet.OTP=InfoProjet.OTP
WHERE NumeroDA Like "#*" And NumeroDA IN (
SELECT NumeroDA FROM Projet
WHERE NumeroCommandeReservation="" Or NumeroCommandeReservation Is Null Or NumeroCommandeReservation="0"
)
GROUP BY Projet.OTP, Projet.NumeroDA
ORDER BY Projet.OTP, Projet.NumeroDA
表格 Projet 有大约 2500 行,而 InfoProjet 只有 200 行。在 Access 中打开此表中的任何一个都需要不到 1 秒的时间。但是,执行上述查询需要超过 5 秒。
我想知道是否可以采取任何措施来提高此查询的性能。查询中是否有一些我应该避免性能方面的东西?或者我只是在访问限制下?我猜想在子查询中使用Like 并没有帮助,但一定有其他东西会减慢查询速度。
【问题讨论】:
-
两张表的 [OTP] 上都有索引吗?如果是这样,索引是否包括列 NumeroDA。你有关于 NumeroCommandeReservation 的索引,以及包括 NumeroDA 吗?
-
OTP 上没有索引,有多行具有相同的 OTP。但是我们可以在 Access 中设置非唯一索引,您认为在这种情况下会有所帮助吗?对于 NumeroDA 也是如此,有多个行具有相同的 NumeraDA 和 NumeroCommandeReservation。 PK 是 NumeroListe 和 NumeroArticle,两者都使用重复支持进行索引。
-
不一定要唯一,非唯一索引也可以帮助查询,如果可以创建复合索引或者覆盖索引,对你的帮助更大。
标签: sql ms-access query-performance