Sql server 2008 使用distinct和top子句执行查询需要更多时间

Sql server 2008 使用distinct和top子句执行查询需要更多时间,sql-server-2008,query-optimization,union-all,Sql Server 2008,Query Optimization,Union All,在这个过程中,我有两个结合了union all运算符的表。第一个表包含2000万条记录,第二个表包含100万条记录。 如果我单独使用Top子句而不使用distinct子句,它会给出输出,但当我使用Top子句和distinct子句时,它会在执行该查询而不完成后非常快地返回前800条记录。在同一查询中同时使用HDDISTINCT和Top是否正确 SELECT Distinct TOP 1000 TP.F_PRODUCT AS ID, TP.F_PROD

在这个过程中,我有两个结合了union all运算符的表。第一个表包含2000万条记录,第二个表包含100万条记录。 如果我单独使用Top子句而不使用distinct子句,它会给出输出,但当我使用Top子句和distinct子句时,它会在执行该查询而不完成后非常快地返回前800条记录。在同一查询中同时使用HDDISTINCT和Top是否正确

SELECT Distinct TOP 1000
            TP.F_PRODUCT AS ID,
            TP.F_PRODUCT_NAME AS [NAME],
            TP.F_LANGUAGE AS LANGCODE,
            TP.F_FORMAT AS FMTCODE,
            TP.F_CUSTOM1 AS TN,
            TP.F_CUSTOM2 AS CP,
        FROM 
            T_PDF TP WHERE TP.F_PRODUCT <>''
    UNION ALL

    SELECT Distinct TOP 1000
            TP.F_PRODUCT AS ID,
            TP.F_PRODUCT_NAME AS [NAME],
            TP.F_LANGUAGE AS LANGCODE,
            TP.F_FORMAT AS FMTCODE,
            TP.F_CUSTOM3 AS TN,
            TP.F_CUSTOM4 AS CP,
        FROM 
            T_HTML TP WHERE TP.F_PRODUCT <>''

使用TOP和DISTINCT并没有什么错,不管当前的所有构造是如何联合的。如果这是你需要的数据,那么这就是方法

但是,当您请求一个不同的值时,您需要意识到系统可能必须检查大量记录,以确保它获取足够的“原始数据”,以获得所请求的不同值的数量;最糟糕的情况是,它必须运行所有2000万条记录!MSSQL非常擅长通过利用手头数据的统计信息来猜测需要多少行

现在,您的统计数据可能“偏离”了,导致系统获取的记录“太少”,从而导致您获得800个“快速结果”,但从表中获取接下来的200个不同值需要花费大量时间

我建议尝试做两件事:

提出一个估计的计划,并学会解释它 更新所述表的统计信息,然后重试,查看估计的计划是否更改;特别是估计的行数应该是有趣的 祝你好运, 罗比


PS:请记住,当要求排名前n位时,您将获得整个数据的“随机选择”;无法保证您将从表中获得“前”n行!要达到这个目的,您需要显式地指定ORDERBY子句,这可能会给查询的执行增加很多额外的工作;同样,查询计划将显示这一点。您可以同时键入这两个查询,并要求提供估计的计划以查看差异。也就是说,当一个查询的成本为10%,另一个为90%时,这并不意味着一个查询的运行速度比另一个快9倍,成本与时间不一样,尽管两者之间确实存在联系,但不是线性的

正确。现在,存储过程中的select语句非常快地拾取910条记录,在那之后,完成执行需要更多的时间。我是否需要使用任何提示来快速完成执行,或者使用任何方法来快速拾取前1000条记录?嗯,有快速提示,但我不确定这是否是一个很好的匹配。查阅