SELECT * FROM xsd INNER JOIN ywry ON xsd.czry = ywry.ygbm 
where xsd.rq between '2012-10-10' and '2012-10-11'
用上面的语句查询很慢,5分钟还没有结果
select * from xsd where xsd.rq between '2012-10-10' and '2012-10-11'
只有约1000条记录
改为
SELECT (select ygxm from ywry where xsd.czry = ywry.ygbm ) as 操作人员 , * FROM xsd  where xsd.rq between '2012-10-10' and '2012-10-11'为什么呀?

解决方案 »

  1.   

    因为前者是先关联人员 然后筛选xsd里的符合日期段的数据。
    后者是先筛选日期段的数据后关联人员,所以速度就上去了。
      

  2.   

    环境是
    Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
    Jul  9 2008 14:43:34 
    Copyright (c) 1988-2008 Microsoft Corporation
    Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
      

  3.   

    dbcc checktable('xsd') 没有问题
    对象 'XSD' 的 78299 页中有 2051375 行。
    DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
      

  4.   

    ywry 这个表中只有几十条记录
      

  5.   

    (select ygxm from ywry where xsd.czry = ywry.ygbm ) 难道是这句中的ygxm有索引,所以...
      

  6.   

    表ywry中ygbm是主键,ygxm没有索引
      

  7.   

    因为你的ygxm.ygbm  表上没有索引 肯定也没有主键是吧
    在你的ygxm表上搞上主键+ygbm  索引 应该就解决你的问题了
    xsd.rq 这个日期字段上有索引吧优化器在处理的时候,应该是join 了两个表的所有数据 然后再筛选日期而第二个写法就是先删选出来在跟ygxm做嵌套查询。
      

  8.   

    表ywry中ygbm是主键,ygxm没有索引
      

  9.   

    ygxm  在这里无所谓的。
      

  10.   

    set statistics profile ,io on 贴一下执行计划看看
      

  11.   

    应该先用时间段条件选取后再关联ywry,否则若前表数据量大的时候,查询会非常慢的。
      

  12.   

    ywry  这个表中存在 LOB 对象,例如 image,text,varbinary。
    你将查询改为
    SELECT xsd.* FROM xsd INNER JOIN ywry ON xsd.czry = ywry.ygbm  
    where xsd.rq between '2012-10-10' and '2012-10-11'就没问题了
      

  13.   

    或者有很复杂的计算列,总之是犯了一个错误:select 子句只有一个 * 号
      

  14.   

    ywry没有text类型列,我只用ywry.ygxm也不行
      

  15.   

    1. 是什么版本的SQL?
    适当时候,再INNER JOIN增加JOIN的方式,如INNER LOOP JOIN、INNER MERGE JOIN
    2. 表字段的关联是否是主键或索引关联
    3. 条件过滤字段是否有索引
      

  16.   

    Quote: 引用 24 楼 hlj321 的回复:

    ywry没有text类型列,我只用ywry.ygxm也不行 quote]
    你有没有试过不引用ywry的列,如果不引用就快,看看ywry.ygxm是什么类型,如果不是大型数据列,
    那就是复杂的计算列