Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用嵌套查询提高SQL查询性能_Sql_Vba_Ms Access - Fatal编程技术网

使用嵌套查询提高SQL查询性能

使用嵌套查询提高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

谁能帮我加快这个查询的速度?它目前需要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&

它们是:

    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