我尝试了以下查询,使用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调用它。没有帮助回归时间。
答案 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