优化SQL ADO返回时间

时间:2017-05-22 15:18:13

标签: sql sql-server excel-vba ado vba

我尝试了以下查询,使用ADO将结果集返回给excel。

MAX

SELECT DISTINCT Term
FROM uSubjectivities 
WHERE account_no = '1172014'
    AND version_num = (SELECT max(Cast(version_num as Int)) from uSubjectivities 
                            WHERE account_no='1172014' 
                                AND SubjectivityID = '6472140') 
        AND SubjectivityID = '6472140'
        AND TermType = 'Common'

TOP(1)

SELECT DISTINCT Term
FROM uSubjectivities 
WHERE account_no = '1172014'
    AND version_num = (SELECT TOP (1) Cast(version_num as Int)
                        FROM uSubjectivities 
                        WHERE account_no='1172014' 
                            AND SubjectivityID = '6472140'
                        ORDER BY version_num DESC) 
    AND SubjectivityID = '6472140'
    AND TermType = 'Common'

更新 JOIN

SELECT DISTINCT Term
FROM uSubjectivities S
INNER JOIN 
(
    SELECT TOP (1) Cast(version_num as Int) v
    FROM uSubjectivities 
    WHERE account_no='1172014' 
        And SubjectivityID = '6472140'
    ORDER BY version_num DESC
) mv
ON mv.v = s.version_num
WHERE SubjectivityID = '6472140'
    AND TermType = 'Common'

然而,两者都比我(和我的用户)想要的时间长得多。

Max需要14秒才能返回15条记录(类型为varchar(max),因为它们可以是包含长文本字符串的字段)。前1名需要14秒。加入需要16秒

单引号内的任何参数最终都会传递给查询。我运行查询大约6次(但可能或多或少取决于参数)。在我的例子中,这部分代码在Max上花费42秒,在Top 1上花费37秒。加入时为40秒。

无论如何都要优化这个速度。目前,我们正在努力避免索引,因为数据库必须在路上重复索引。

此外,这两个查询在SQLServer内以纳秒运行,因此我不知道为什么它们在ADO中如此慢。

修改 我还将它加载到存储过程中,并从VBA调用它。没有帮助回归时间。

2 个答案:

答案 0 :(得分:1)

您可以尝试删除子查询,并在主选择中使用top的顺序:

SELECT TOP 1 Term
FROM uSubjectivities 
WHERE account_no = '1172014'
AND SubjectivityID = '6472140'
AND TermType = 'Common'
ORDER BY version_num desc

以下是 n 行的另一个选项:

SELECT Term
FROM (SELECT Term,
             RANK() over (ORDER BY version_num desc) AS RK
      FROM uSubjectivities 
      WHERE account_no = '1172014'
      AND SubjectivityID = '6472140'
      AND TermType = 'Common') A
WHERE RK = 1

答案 1 :(得分:0)

您遇到了一个名为Correlated subquery的问题:

  

在SQL数据库查询中,相关子查询(也称为   synchronized子查询)是一个子查询(嵌套在另一个子查询中的查询)   查询)使用外部查询中的值。因为子查询可能   对外部查询处理的每一行进行一次评估,它可以是   低效的。

另见这个例子:

<button class="grid"><img src="grid.png" alt="Grid View" /></button>
    <button class="landscape"><img src="grid-landscape.png" alt="Landscape View" /></button> 
    
    <section class="gallery">
     <div class="row">
      <div class="gallery-image col-md-4"><a href="2017/05/2014-044-192-819x1024.jpg" target="_blank" data-toggle="lightbox" data-gallery="gallery"><img src="2017/05/2014-044-192_500x500_acf_cropped.jpg" alt="" /></a></div>
      <div class="gallery-image col-md-4"><a href="2017/05/2014-002-086-1024x680.jpg" target="_blank" data-toggle="lightbox" data-gallery="gallery"><img src="2017/05/2014-002-086_500x500_acf_cropped.jpg" alt="" /></a></div>
      <div class="gallery-image col-md-4"><a href="/2017/05/2014-002-084-1024x680.jpg" target="_blank" data-toggle="lightbox" data-gallery="gallery"><img src="2017/05/2014-002-084_500x500_acf_cropped.jpg" alt="" /></a></div>
     </div>
    </section>

要解决此问题,您必须加入结果,而不是在第一个选择中进行另一个选择,请检查此答案here