优化查询(删除子查询)

时间:2017-01-18 11:00:48

标签: sql sql-server

您能帮我优化一下这个查询吗?我需要删除子查询,因为性能很差。

<div id="input1" style="margin-bottom: 50px">
    <div class="pull-left" style="width: 250px;">
        <select class="selectpicker" data-live-search="true" id="s1"> 
        </select>

问题是我可以在相同的DATE和HOUR中拥有两个服务,因此我无法编写一个避免子查询的等效SQL。

查询在Legacy数据库上运行,我无法修改其元数据,并且它根本没有任何索引。这就是寻找可以避免相关查询的解决方案的原因。

谢谢。

1 个答案:

答案 0 :(得分:4)

您可以使用ROW_NUMBER()表达查询,而无需相关子查询。尝试以下查询,看看性能如何:

SELECT t.LICENSE, t.SERVICE_KEY
FROM
(
    SELECT t1.LICENSE, t1.SERVICE_KEY
           ROW_NUMBER() OVER (PARTITION BY t1.LICENSE
                          ORDER BY t2.DATE DESC, t2.HOUR DESC) rn
    FROM VEHICLE t1
    INNER JOIN SERVICES t2
        ON t1.LICENSE = t2.LICENSE
) t
WHERE t.rn = 1

此查询的性能除其他外,还取决于在两个表的连接列上有索引。