SQL奇怪问题,某段数据Select比别的数据段速度慢!!
有相关表和字段
表A S_NO
表B S_NO、P_NO
表C P_NO、P_Date
里面有1~11月的相关数据
使用
select * from A表 where S_NO in(select S_NO from B表 where P_NO in (select P_NO from C表 where P_date between '2006-01-01' and '2006-11-30'))
这一个SQL语句得到结果的时间要比
select * from A表 where S_NO in(select S_NO from B表 where P_NO in (select P_NO from C表 where P_date between '2006-11-01' and '2006-11-30'))
这句得到结果的时间短得多.
不明白怎么回事
请各位指教一下.

解决方案 »

  1.   

    只有11月份C表的数据Select的时候速度慢
    其他月份不会慢
    奇怪的情况是
    1.如果Between '2006-10-01' and '2006-11-30'的话
      速度就很快了.时间花不了1秒.
    2.如果是 Between '2006-11-01' and '2006-11-30'的话,
      速度变慢.时间要花22秒
    3.如果把C表11月的数据改为12月或别的月.速度变快.时间花不了1秒
      先
      Update C set P_Date=P_Date+30 where P_Date Between '2006-11-01' and '2006-11-30'
      再
      select * from A表 where S_NO in(select S_NO from B表 where P_NO in (select P_NO from C表 where P_date between '2006-12-01' and '2006-12-30'))
      

  2.   

    1数据多少不一样百 这有什么可以解释的 
    2 可以采用这个方法能快很多
    select a.* from A表 a,B表 b,c表 c where a.S_NO=b.S_NO and b.P_NO=c.P_NO and c.P_date between '2006-01-01' and '2006-11-30'
      

  3.   

    不管是不是两个月的数据是否一样,你自己的sql语句写的有些复杂,楼上的是很简单sql了,你可以试试,如果是数据量根本不同,当然会出现你现在的现象
      

  4.   

    最好不要用in in執行的效率好像就不是很高 用子查詢看看
      

  5.   

    速度与 SQL 的结构不是绝对成反比。楼主的子查询嵌套是加快查询的方法之一,因为它可以缩小上一级查询搜索的范围。你试一下:
    select P_NO from C表 where P_date between '2006-01-01' and '2006-11-30'

    select P_NO from C表 where P_date between '2006-11-01' and '2006-11-30'
    是否速度差距很大。如果是,试试:

    如果你的如果字段是字符型,改为 DateTime 型。如果是 Access 数据库,between '2006-11-01' and '2006-11-30' 要同时改为 between #2006-11-01# and #2006-11-30#2 
    建立一个基于日期字段的索引
      

  6.   

    拿到查询分析器去分析一下
      
    *****************************************************************************
    欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码) 
    http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html