使用嵌套查询提高SQL查询性能
谁能帮我加快这个查询的速度?它目前需要17分钟才能运行,但会返回正确的数据,并在MS Access中填充子窗体。VBA其余部分中的函数被声明为尽可能长的函数,以提高速度 以下是完整的查询: 选择很多东西 来自ngstest 内连接患者 在ngstest.internalpatientid=patients.internalpatientid上 内部联接转介 在ngstest.referralid=referralid.referralid上 内部连接检查器 在ngstest.bookby=checker.check1id上 内连接板 在ngstest.ngspanelid=ngspanel.ngspanelid上 左连接ngspanel作为ngspanel_1 关于ngstest.ngspanelid_b=ngspanel_1.ngspanelid 内部联接状态 在ngstest.statusid=status.statusid上 内部联接dbo_患者_表 在患者身上。patientid=dbo\u patient\u table.patienttrustid 左连接dna 关于ngstest.dna=dna.dnanumber 内部联接状态为状态_1 在患者身上。s_statusoverall=状态_1.statusid 左连接gw_性别表 在dbo_patient_table.genderid=gw_gendertable.genderid上 左连接ngswesbatch 在ngstest.wesbatch=ngswesbatch.ngswesbatchid上 左连接检查器作为检查器_1 在ngstest.check1id=checker\u 1.check1id上 左连接检查器作为检查器_2 在ngstest.check2id=checker\u 2.check1id上 左连接检查器作为检查器_3 在ngstest.check3id=checker\u 3.check1id上 左连接ngspanel作为ngspanel_2 关于ngstest.ngspanelid_c=ngspanel_2.ngspanelid 左连接检查器作为检查器_4 在ngstest.check4id=checker\u 4.check1id上 ngstest.在哪里被引用 从“推荐”中选择“推荐” 其中grouptypeid=14 和ngstest.ngstestid IN 选择ngstest.ngstestid 来自ngsanalysis 内连接 关于ngsananalysis.ngstestid=ngstest.ngstestid 其中ngsanalysis.系谱=3302 和status.statusid=1202218800 按ngstest优先顺序排序, 请求的日期; 这两个嵌套查询是代码中其他地方的字符串,因此在vba中被称为&includeFerralls&And&ParentsStatusesFilter& 它们是:使用嵌套查询提高SQL查询性能,sql,vba,ms-access,Sql,Vba,Ms Access,谁能帮我加快这个查询的速度?它目前需要17分钟才能运行,但会返回正确的数据,并在MS Access中填充子窗体。VBA其余部分中的函数被声明为尽可能长的函数,以提高速度 以下是完整的查询: 选择很多东西 来自ngstest 内连接患者 在ngstest.internalpatientid=patients.internalpatientid上 内部联接转介 在ngstest.referralid=referralid.referralid上 内部连接检查器 在ngstest.bookby=che
ParentsStatusesFilter = "NGSTest.NGSTestID in
(SELECT NGSTest.NGSTestID
FROM NGSAnalysis
INNER JOIN NGSTest
ON NGSAnalysis.NGSTestID = NGSTest.NGSTestID
WHERE NGSAnalysis.Pedigree IN (3302,3303,3304)"
及
查询需要保持可读性,因此可以编辑,因此不能使用诸如Distinct、Group By或包含任何联合之类的内容。已尝试对嵌套查询使用Exists而不是In,但这会阻止它实际筛选结果
WHERE EXISTS (SELECT NGSTest.NGSTestID
FROM NGSAnalysis
INNER JOIN NGSTest
ON NGSAnalysis.NGSTestID = NGSTest.NGSTestID
WHERE NGSAnalysis.Pedigree IN (3302,3303,3304)
因此,您的exist子句没有绑定到外部查询,外部查询的运行方式类似于刚刚将1=1添加到where子句。我把你的where子句转换了。应该是这样的
WHERE EXISTS (
SELECT referralid
FROM referral
WHERE grouptypeid = 14 AND ngstest.referralid = referral.referralid)
AND EXISTS (
SELECT ngsanalysis.ngstestid
FROM ngsanalysis
WHERE ngsanalysis.pedigree IN (3302,3303,3304) AND ngstest.ngstestid = ngsanalysis.ngstestid
)
AND status.statusid = 1202218800
添加exists将使其速度加快一点,但速度慢的主要原因是左连接。Access不像SQL Server那样处理左连接。将所有连接更改为内部连接,您将看到查询运行得非常快。这显然并不理想,因为有些关系是可选的。我所做的就是添加一个默认记录来替换空关系
下面是您的情况:在checker表中,您可以添加一条表示空值的记录。因此,将check1id为-1或0的记录放入checker表。然后将ngstest上的默认check1id、check2id、check3id设置为-1或0。对于所有需要保持连接状态的表,您都需要执行这种操作。您知道哪些语句最慢吗?你能得到查询计划吗?最有可能的索引将是所需的。我不知道你为什么认为GROUP BY和UNION不可读,我希望任何有权编辑此类代码的人都应该理解这些基本函数,或者至少有必要查找它们。请格式化该查询,使其可读。该查询需要保持可读性,因此可编辑,因此不能使用Distinct,由任何联合组成或包含任何联合。-为什么这些东西不可读?它们是SQL语言中的工具。在MS Access中,您没有太多的性能选项。此查询会返回子窗体上勾选框的状态,如果用于填充子窗体的SQL中包含这些内容,则子窗体上的结果将不可编辑,这将删除选中和取消选中勾选框所需的一些功能。这将解释更多内容。非常感谢!我会试试这个:
WHERE EXISTS (
SELECT referralid
FROM referral
WHERE grouptypeid = 14 AND ngstest.referralid = referral.referralid)
AND EXISTS (
SELECT ngsanalysis.ngstestid
FROM ngsanalysis
WHERE ngsanalysis.pedigree IN (3302,3303,3304) AND ngstest.ngstestid = ngsanalysis.ngstestid
)
AND status.statusid = 1202218800