有三个表,两个表内连接,还有一个表ETLState存放的是某个业务上次运行后的时间SELECT h.* FROM house h
INNER JOIN Building b ON h.BuildingKey = b.BuildingKey  
where h.UpdateDate >  (SELECT uploaddate  FROM ETLState WHERE tablename = 'house')
这样查询的话要20秒左右SELECT h.* FROM house h
INNER JOIN Building b ON h.BuildingKey = b.BuildingKey  
where h.UpdateDate >'2010-11-10 18:28:10.317'
如果直接把时间赋予它就一下子完成了.似乎 (SELECT uploaddate  FROM ETLState WHERE tablename = 'house')是在house表和building表关联查询完后才运行,所以非常慢,请问要怎么解决.

解决方案 »

  1.   

    ETLState 里面是house只有一个时间?
    SELECT h.* FROM house h
    INNER JOIN Building b ON h.BuildingKey = b.BuildingKey   
    where h.UpdateDate > (SELECT max(uploaddate) FROM ETLState WHERE tablename = 'house')
      

  2.   

    检查ETLState 表上是否存在uploaddate和tablename 的非聚集索引。sp_helpindex ETLState
      

  3.   


    declare @d varchar(20)
    select @d = uploaddate FROM ETLState WHERE tablename = 'house'SELECT h.* FROM house h
    INNER JOIN Building b ON h.BuildingKey = b.BuildingKey   
    where h.UpdateDate > @d
      

  4.   

    是的,SELECT uploaddate FROM ETLState WHERE tablename = 'house'只有一个值
    ETLState 的 tablename 有非聚集索引 
    cjzm83的方法试了一下,还是一样的很慢,杯具了,感觉很普通的一个查询,不知道怎么搞的,会这么慢
      

  5.   

    你单独查SELECT uploaddate FROM ETLState WHERE tablename = 'house'
    看要多长时间,估计单独查时间就很长
    与子查询无关
      

  6.   

    SELECT h.* FROM house h
    INNER JOIN Building b ON h.BuildingKey = b.BuildingKey  
    where h.UpdateDate > (SELECT uploaddate FROM ETLState WHERE tablename = 'house')
    改成
    DECLARE @DATE AS DATETIME
    SELECT @DATE=uploaddate FROM ETLState WHERE tablename = 'house'
    SELECT h.* FROM house h
    INNER JOIN Building b ON h.BuildingKey = b.BuildingKey  
    where h.UpdateDate > @DATE
      

  7.   

    只要连接table就会增加time,这个格外的开销跟直接给定值没有可比性。建议您忽略取date的耗时。
      

  8.   

    ETLstate一共就10条记录,用DECLARE @DATE AS DATETIME也是一样
    看来是没有什么办法了.
      

  9.   

    select h.* from  house h ,Building b,ETLState  e
    where 
    h.BuildingKey = b.BuildingKey   
    and 
    h.UpdateDate > e.uploaddate
    and 
    e.tablename = 'house')这样你试一实