select t1.orderid,t1.userinfo,t2.total from 
(select o.orderid,c.customername+c.address as userinfo from ordertable o,customertable c where c.customerid=o.customerid) as T1
,
(select orderid,sum(goodprice*[count]) as total from goodtable,ordergood where goodtable.goodid=ordergood.goodid group by orderid) as T2
where t1.orderid=t2.orderid
(3 行受影响)
表 'CustomerTable'。扫描计数 3,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderTable'。扫描计数 3,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'GoodTable'。扫描计数 0,逻辑读取 24 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderGood'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
------------
select o.orderid,c.customername+c.address as userinfo, sum(goodprice*[count]) as total
from ordertable o 
left join customertable c on  c.customerid=o.customerid
left join ordergood d on d.orderid=o.orderid
left join goodtable e on d.goodid=e.goodid
group by o.orderid,c.customername+c.address(3 行受影响)
表 'GoodTable'。扫描计数 1,逻辑读取 13 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderGood'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'CustomerTable'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderTable'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

--------------------------数据库中的表
订单表orderTable 
id:主键,订单流水id 
customerId:下订单的客户id,客户表Id的外键 订单商品表ordergoods 
id:主键 
orderId:订单表id的外键 
goodsId:商品表id的外键 
count:商品数量 商品表goods: 
id:主键 
name:商品名 
price:单价 客户表customer: 
id:主键 
name:客户名 
address:客户地址 诸表建表语句 
create table customer( 
  id int(10) primary key not null, 
  name VARCHAR(255), 
  address VARCHAR(255) 
) create table goods( 
  id int(10) primary key not null,  
  name VARCHAR(255), 
  price DOUBLE(10,2) 
) create table orderTable( 
  id int(10) primary key not null, 
  customerid int(10) not null, 
  foreign key(customerid) references customer(id) 
) create table ordergoods( 
  id int(10) primary key not null, 
  orderid int(10) not null, 
  goodsid int(10) not null, 
  count  int(10), 
  foreign key(orderid) references orderTable(id), 
  foreign key(goodsid) references goods(id) 

插值语句 
insert into customer ( id, name, address ) values ( '1', '张三', '北京' ) 
insert into customer ( id, name, address ) values ( '2', '李四', '大连' ) 
insert into customer ( id, name, address ) values ( '3', '王五', '上海' ) insert into goods ( id, name, price ) values ( '11', '上衣', '240' ) 
insert into goods ( id, name, price ) values ( '12', '裤子', '300' ) 
insert into goods ( id, name, price ) values ( '13', '鞋子', '350' ) insert into ordertable ( id, customerid ) values ( '111', '1' ) 
insert into ordertable ( id, customerid ) values ( '112', '2' ) 
insert into ordertable ( id, customerid ) values ( '113', '3' ) insert into ordergoods ( id, orderid, goodsid, count ) values ( '1111', '111', '11', '20' ) 
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1112', '112', '11', '10' ) 
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1113', '112', '12', '15' ) 
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1114', '113', '11', '30' ) 
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1115', '113', '12', '45' ) 
insert into ordergoods ( id, orderid, goodsid, count ) values ( '1116', '113', '13', '60' ) ==================================================== 网上说join的效率非常低,为什么比我原现的SQL语句效率要高呢?针对这个查询还有更效的SQL语句吗?

解决方案 »

  1.   

    这个帖子是根据我的另一个帖子的思考
    http://topic.csdn.net/u/20090430/13/e83a8c85-d5e3-4f69-9cb1-48b97614ffcf.html
      

  2.   

    JOIN的连接字段有索引,效率就不会低,否量,数据量一大,效率必定很低.
      

  3.   

    LEFT JOIN 消耗的资源非常之多,因为它们包含与 NULL(不存在)数据匹配的数据。在某些情况下,这是不可避免的,但是代价可能非常高。LEFT JOIN 比 INNER JOIN 消耗资源更多,所以如果您可以重新编写查询以使得该查询不使用任何 LEFT JOIN,则会得到非常可观的回报。 字串4
      加快使用 LEFT JOIN 的查询速度的一项技术涉及创建一个 TABLE 数据类型,插入第一个表(LEFT JOIN 左侧的表)中的所有行,然后使用第二个表中的值更新 TABLE 数据类型。此技术是一个两步的过程,但与标准的 LEFT JOIN 相比,可以节省大量时间。一个很好的规则是尝试各种不同的技术并记录每种技术所需的时间,直到获得用于您的应用程序的执行性能最佳的查询。
    ----------
    网上说的join缺点
      

  4.   

    注意一下索引在某些场合下使用会失效:1.只要对列使用函数,该列的索引将不起作用,如:substring(aa,1,2)='xx' 
    2.只要对列进行计算,该列的索引将不起作用,如:aa+10=20 
    3.某些情况下的LIKE操作,该列的索引将不起作用,如:aa LIKE '%10%' 
    4.某些情况使用反向操作,该列的索引将不起作用,如:aa <>2 
    5.在WHERE中使用OR时,有一个列没有索引,那么其它列的索引将不起作用
      

  5.   

    网上的东西其实太多了,所以一定要保持思考,去伪存真,如果是微软开发数据库的专家说的,我会信的。注意这个措辞,红字部分。LEFT JOIN 消耗的资源非常之多,因为它们包含与 NULL(不存在)数据匹配的数据。在某些情况下,这是不可避免的,但是代价可能非常高。LEFT JOIN 比 INNER JOIN 消耗资源更多,所以如果您可以重新编写查询以使得该查询不使用任何 LEFT JOIN,则会得到非常可观的回报。 
      

  6.   

    网上说join的效率非常低,为什么比我原现的SQL语句效率要高呢?针对这个查询还有更效的SQL语句吗?网上有些人是胡说的,特别是在05中,SQL SERVER 的引擎更加智能化,且JOIN 也是其推荐的,在复杂语句中使用JOIN,SQL SERVER 引擎会智能的以最高效的速率执行的,我也是刚看完这方面的书,是一个微软MPV写的《T-SQL编程入门》,上面专门有这方面的讨论。
      

  7.   

    T-SQL编程入门???网上没有哦?请您给指个地址