Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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 使用DISTINCT的查询耗时较长_Sql_Sql Server_Ms Access - Fatal编程技术网

Sql 使用DISTINCT的查询耗时较长

Sql 使用DISTINCT的查询耗时较长,sql,sql-server,ms-access,Sql,Sql Server,Ms Access,我正在使用Microsoft Access 2003。我项目中的一个表单需要很长时间才能显示给用户 这是适用的查询: SELECT DISTINCT tb_KonzeptDaten.DFCC ,tb_KonzeptDaten.OBD_Code AS Konzept_Obd ,tb_bauteile.* ,FehlerCodes_akt_Liste.VAG_Code ,FehlerCodes_akt_Liste.OBD_Code ,FehlerCodes_akt_Liste.F_Klasse_EU

我正在使用Microsoft Access 2003。我项目中的一个表单需要很长时间才能显示给用户

这是适用的查询:

SELECT DISTINCT tb_KonzeptDaten.DFCC
,tb_KonzeptDaten.OBD_Code AS Konzept_Obd
,tb_bauteile.*
,FehlerCodes_akt_Liste.VAG_Code
,FehlerCodes_akt_Liste.OBD_Code
,FehlerCodes_akt_Liste.F_Klasse_EU
,FehlerCodes_akt_Liste.F_Klasse_US
,FehlerCodes_akt_Liste.CDT AS CdtNr
,FehlerCodes_akt_Liste.Pfad_Bezeichnung
,FehlerCodes_akt_Liste.Fehlerpfad AS PfadName
,FehlerCodes_akt_Liste.Fehlerunterpfad
,tb_bauteile_Tools.Tool AS Tool_
FROM (
    (
        tb_bauteile LEFT JOIN FehlerCodes_akt_Liste ON tb_bauteile.OBD2_Plaus = FehlerCodes_akt_Liste.ID
        ) LEFT JOIN tb_bauteile_Tools ON tb_bauteile.Tool = tb_bauteile_Tools.ID
    )
LEFT JOIN tb_KonzeptDaten ON FehlerCodes_akt_Liste.Fehlerpfad = tb_KonzeptDaten.DFC;
如果我删除DISTINCT,然后运行查询,性能将得到提高 (从9秒到2秒)。此外,我还对必要字段设置了索引


如何更改查询(可能没有DISTINCT)以提高性能?

DISTINCT的使用本质上是按
分组,因此只能获得“唯一”记录。如果您没有任何重复记录,则不需要这样做


我将把重点放在您的联接上,而不是
distinct
子句。

我建议获取distinct ID,然后在列查询中获取所需的列

像这样的

Select (select Fehlerpfad from FehlerCodes_akt_Liste where id=A.id ) as col1, ...
from
(
   Select distinct ids from table
   .........
) A

请尝试分组,然后告诉我结果。重复记录来自何处?它们是否存在于主表(tb_KonzeptDaten)中,或者它们是由连接引起的?@Remou如果我没有弄错您的问题,我不确定,但是如果我删除两列(DFCC,Konzept_obd)的不同值,结果是它们都来自tb_KonzeptDaten表,使用DISTINCT,我在这两列中看不到任何值当您在没有查询的情况下查看表时,是否存在重复项?哪张桌子最大?好的,从那里开始。创建一个查询
从tb_KonzeptDaten中选择不同的DFCC,OBD_代码为Konzept_OBD
,保存查询并在此查询中使用该查询而不是tb_KonzeptDaten。如果它运行得更快,则可以用派生表替换查询。另外,你确定你有合适的索引吗?我有重复的记录,即使用Distinct这个查询返回我c.a 3000条记录,但没有Distinct c.a 15000条记录。我已将左连接更改为内连接,性能有所提高,但只有一秒钟。你有更好的主意吗?