none
哪种查询速度更快些呢? RRS feed

  • 问题

  • --1
    select * from a where id in (select id from a inner join b on a.id = b.id where 1=1)
    
    --2
    select * from (select * from a inner join b on a.id = b.id where 1=1)
    
    --哪种方法查询更快?
    2010年6月12日 1:28

答案

  • 使用in的慢

    后面的查询可以改为:

    select * from a inner join b on a.id = b.id

    这个速度差别不大,sql server会自己优化的。

    查询避免使用exists和in

    in后面如果直接给值,如:in (1,2,3)还可能使用索引,如果是一个子查询,索引都用不到。

     


    family as water
    2010年6月12日 1:57
  • 两者的结果不同, 不应该直接比较

    第二个语句实际执行的时候会是错的, 因为用 select *, a/b都有id, 字段名重复, 会报错.

     抛开错误不管, 进一步分析, 第一个只返回a表结果, 第二个返回 a/b两个表的结果, 所以一般来说, 第二个的性能会差一些

    再抛开返回的列不一样多的问题, 如果 a/b 是一对多, 或者多对多的关系, 那么第一个返回的结果集一般小于第二个, 理论上来说也是第二个的性能差一些.

    如果上面那些差异都不管, 那么在查询优化器的作用下, 两者应该都差不多.

    2010年6月12日 4:36
  • Just compare cost in execution plans.
    2010年6月13日 16:33

全部回复

  • 使用in的慢

    后面的查询可以改为:

    select * from a inner join b on a.id = b.id

    这个速度差别不大,sql server会自己优化的。

    查询避免使用exists和in

    in后面如果直接给值,如:in (1,2,3)还可能使用索引,如果是一个子查询,索引都用不到。

     


    family as water
    2010年6月12日 1:57
  • select * from (select *,row_number() over(order by id) tid from a where id in (select id from a inner join b on a.id = b.id where 1=1)) c where tid between 1 and 5


    select * from (select *,row_number() over(order by id) tid from (select * from a inner join b on a.id = b.id where 1=1)) c where tid between 1 and 5

    这两种呢?在速度上,哪个快与慢?

    2010年6月12日 4:26
  • 两者的结果不同, 不应该直接比较

    第二个语句实际执行的时候会是错的, 因为用 select *, a/b都有id, 字段名重复, 会报错.

     抛开错误不管, 进一步分析, 第一个只返回a表结果, 第二个返回 a/b两个表的结果, 所以一般来说, 第二个的性能会差一些

    再抛开返回的列不一样多的问题, 如果 a/b 是一对多, 或者多对多的关系, 那么第一个返回的结果集一般小于第二个, 理论上来说也是第二个的性能差一些.

    如果上面那些差异都不管, 那么在查询优化器的作用下, 两者应该都差不多.

    2010年6月12日 4:36
  • 谢谢专家详细的讲解!

    select * from a where id in (select id from a inner join b on a.id = b.id where 1=1)

    select * from a inner join b on a.id = b.id where 1=1

    那么针对以上2种,进行分页的话哪种性能更好,用row_number()的方法。

     

    2010年6月12日 4:50
  • 如果分页和结果中只要 A 的, 那么一般用第一种, 否则第二种.

    对于更为复杂的情况, 一般是先尽量用最小的结果集分页, 再去关联其他与条件和分页无关的表取对应的列.

    2010年6月12日 4:57
  • select * from a inner join b on a.id = b.id where 1=1

    其实这里的1=1还包含其他可能存在的条件 这里已经把结果集 变小了一次,再对这个临时结果集分页。

    2010年6月12日 5:01
  • 方法二快,方法一已经出现两次from a,效率不佳。
    2010年6月13日 13:51
  • Just compare cost in execution plans.
    2010年6月13日 16:33