Sql server 优化SQL Server查询的短部分

Sql server 优化SQL Server查询的短部分,sql-server,min,isnull,Sql Server,Min,Isnull,我有一个子查询,需要一点到很长的时间。有人知道我如何修改它以便更快吗 ISNULL(ISNULL( (select top 1 CONVERT(VARCHAR(11), qq.startdate , 111) from (select a.startdate, a.ownerid from wfassignment a where a.ownertable='PM' /*order by a.startdate*/)qq where qq.ownerid

我有一个子查询,需要一点到很长的时间。有人知道我如何修改它以便更快吗

  ISNULL(ISNULL(
(select top 1 CONVERT(VARCHAR(11), qq.startdate , 111) 
 from (select a.startdate, a.ownerid 
       from wfassignment a
       where a.ownertable='PM' /*order by a.startdate*/)qq 
 where qq.ownerid=pm.pmuid ),
(select min(w.reportdate) 
from workorder w where w.pmnum=pm.pmnum 
                 and w.siteid=pm.siteid 
                 and w.orgid= pm.orgid)
),CONVERT(DATETIME,'01-02-2015 00:00:00'))
在oracle中,它比SQL Server快得多。我还想确定Top1是否等同于oracle的rownum=1。
谢谢:)

我假设您在第一个子查询中需要最小起始日期,所以我计算出:

    select   top 1 [sq].[pm_date]
    from
    (
        select  convert(tinyint, 1) as [priority]
              , min(a.startdate) as [pm_date]
        from    wfassignment a
        where   a.ownertable = 'PM'
                and a.ownerid = pm.pmuid

        union all

        select  2
              , min(w.reportdate)
        from    workorder w
        where   w.pmnum = pm.pmnum
                and w.siteid = pm.siteid
                and w.orgid = pm.orgid

        union all

        select  3
              , convert(datetime, '2015-02-01 00:00:00') 
              /* use yyyymmdd format to avoid confusion when casting datetime values */
    ) as sq
    where    [sq].[pm_date] is not null
    order by [sq].[priority] asc

不过,您需要将外部引用添加到[pm]别名,但您的问题中没有给出该部分,因此我只是这样计算出来。

寻求性能帮助的问题应包括执行计划等详细信息,所涉及的表的模式和重新测试:多个需求可能最终生成具有相同结构的查询-而不是期望通过直觉了解此查询背后的意图,您是否可以解释一下。示例数据和预期结果会有很大帮助。在Oracle中不会更快。这是一个完全不同的查询,在一个完全不同的数据库上,使用不同的索引。如果索引不同,查询的文本形状并不重要。