我现在要查询一个订单表,订单关联了客户,根据客户的所属人查询属于自己的订单,
from SalOrder where (customer in(select c from Customer as c where user.id = '1'))
我觉得这样查询效率比较低,在查询订单的时候还要查询客户表,想在订单表里加一个所属人外键,但那样在修改客户所属人时还要用触发器修改该客户下所有订单的所属人,比较麻烦,大家看看有没有什么好的解决办法

解决方案 »

  1.   

    感觉你给的SQL是错的,按照你的思路大概改了一下。
    另外在表上加个索引,也可以提高效率
    select a.* from SalOrder a, Customer b where a.customer = b.c and b.user.id = '1'
      

  2.   

    他那个sql应该是hibernate的hql吧。。一楼的很对。。可以加个索引。。sql用in效率会变低
      

  3.   

    最好不要用in 因为IN会使系统无法使用索引,而只能直接搜索表中的数据。from SalOrder where (customer in(select c from Customer as c where user.id = '1'))我理解的Customer表的id和SalOrder表中的customer是关联的。
    改成 from SalOrder a where EXISTS (select from Customer b where b.user.id = '1' and b.id = a.customer) 不过没试过hql里面能不能用exists。楼主可以试下。还有尽量where条件后面有索引的条件放到前面。如果hql不支持exists,楼主可以用查询器执行原生sql来解决这个问题。
      

  4.   

    select c from Customer as c where user.id = '1'
    不明白LZ所指的c是什么意思。如果写sql语句比较麻烦的话,可以考虑修改一下配置文件,级联查询,前提是你的项目是用了hibernate再就是考虑是使用即时加载还是延迟加载的问题。
      

  5.   

    1楼的sql和3楼用exists效率是不是差不多?
      

  6.   

    这个应该可以,Customer表创建索引(customer,userid)
    select a.* from SalOrder a, Customer b where a.customer = b.c and b.user.id = '1'
      

  7.   

    订单表里需不需要给customer加索引
      

  8.   

    customer字段不用加索引,加不加索引SalOrder表都要全部遍历一次。
    数据库搜索数据顺序:
    1,从SalOrder表取出一条数据。
    2,根据1中取出数据的customer字段从Customer表查询符合条件的记录。
      

  9.   

    用表连接的话会有重复数据的,感觉应该用exists会快点
      

  10.   

    还是用exists快点,快了大概1/3
      

  11.   

    不要用  in  换成  exists或者建立索引