0

今天是个好日子,

我最近不得不从 Access JET 引擎转移到 UcanAccess 引擎,我对“标准”SQL 查询不是很熟悉,没有使用“INNER JOIN”函数。我根据我之前从关于 DELETE 子句的问题中得到的一个答案编写了以下 SQL 查询,但是这个查询:

SELECT TreatmentRecords.DateGiven, TreatmentRecords.TimeGiven, SInformation.Surname, SInformation.FirstNames, SInformation.CampusCode, TreatmentRecords.Treatment, TreatmentRecords.[AmountGiven], TreatmentRecords.Diagnosis
FROM TreatmentRecords, SInformation
WHERE (((YEAR(TreatmentRecords.DateGiven)) =2015) AND ((MONTH(TreatmentRecords.DateGiven))=03) AND ((TreatmentRecords.SID)<= 70000))
GROUP BY TreatmentRecords.DateGiven, TreatmentRecords.TimeGiven, SInformation.Surname, SInformation.FirstNames, SInformation.CampusCode, TreatmentRecords.Treatment, TreatmentRecords.[AmountGiven], TreatmentRecords.Diagnosis
ORDER BY TreatmentRecords.DateGiven, SInformation.Surname, SInformation.FirstNames;

似乎什么都不做。我确实发现它可以将我的 CPU 提高到 96%,并将我的 RAM 提高到 1GB 以上,但这就像一个递归循环。

我想请你知道

a) 查询有什么问题 b) 在什么情况下查询会对您的处理器和内存执行上述操作

此查询(以 JET 格式)运行良好,整个查询只应返回 100-200 个结果。

任何帮助将不胜感激。谢谢

4

2 回答 2

3

您的查询在GROUPING 之前执行笛卡尔积 (CROSS JOIN) ,因此它可能会详细说明大量出现,因为您没有指定 TreatmentRecords 和 SInformation 之间的任何连接条件

例如,如果您有 10000 条 SInformation 记录和 1000 条涉及 2015 年 3 月的 SID<70000 的 TreatmentRecords,则将为 GROUP BY 详细说明 1000 万条记录。显然这没有意义。

即使 Jet 引擎可能会解释您查看最终分组的意图,并通过不执行整个笛卡尔积来实施替代策略和执行计划,的查询对于大多数 DBMS(即 Hsqldb)来说还是很糟糕的。

重写这个错误的查询,将具有附加值。

于 2015-03-21T10:55:13.703 回答
2

除了 jamadei 的答案,请尝试使用 INNER JOIN 来避免笛卡尔积的查询:

SELECT 
    TreatmentRecords.DateGiven, TreatmentRecords.TimeGiven, 
    SInformation.Surname, SInformation.FirstNames, SInformation.CampusCode, 
    TreatmentRecords.Treatment, TreatmentRecords.[AmountGiven], TreatmentRecords.Diagnosis
FROM TreatmentRecords INNER JOIN SInformation
    ON TreatmentRecords.SID = SInformation.SID
WHERE TreatmentRecords.DateGiven >= #2015-03-01# 
    AND TreatmentRecords.DateGiven < #2015-04-01# 
    AND TreatmentRecords.SID <= 70000
GROUP BY 
    TreatmentRecords.DateGiven, TreatmentRecords.TimeGiven, 
    SInformation.Surname, SInformation.FirstNames, SInformation.CampusCode, 
    TreatmentRecords.Treatment, TreatmentRecords.[AmountGiven], TreatmentRecords.Diagnosis
ORDER BY 
    TreatmentRecords.DateGiven, SInformation.Surname, SInformation.FirstNames;

它还使用sargable WHERE 条件TreatmentRecords.DateGiven,如果该列上有索引,则可以避免表扫描。

于 2015-03-22T14:08:04.400 回答