FROM子句中的嵌套select语句?内部联接声明?还是只是表名?

Roy*_*oyM 1 select nested-queries sql-server-2008r2-express

我正在构建一个需要来自5个表的数据的查询.过去,DBA告诉我,从某些性能/内存方面来看,指定列列表与获取所有列(*)是首选.我还被告知,当FROM子句中有一个表列表时,数据库会在幕后执行JOIN操作,以创建一个表(或视图).

现在的数据库目前只有非常少的数据,因为我们处于一个非常初始的阶段.所以不确定我能否在实践中衡量性能.我不是数据库专家.我可以得到我需要的数据.dillema是以什么价格出售的.

补充:目前我正在使用MS SQL Server 2008 R2.

我的问题是:

  1. 以下是否存在性能差异以及原因:a.SELECT ... FROM tbl1,tbl2,tbl3等为简单起见?(不知怎的,我觉得这可能会影响性能)b.SELECT ... FROM tbl1 inner join tbl2 on ... inner join tbl3 on ... etc(这会对服务器更加明确并节省性能/内存)吗?C.SELECT ... FROM(从tbl1中选择x,y,z)作为t1内连接...等(这会保存anythig吗?还是只是为服务器和我们创造更多工作的额外选择语句)?

  2. 有没有更好的方法来做到这一点?

下面是两个查询,它们都获得了我需要的数据片段.一个包含更多嵌套的select语句.

如果他们不是以标准形式编写或无助地过于复杂,我会道歉 - 希望你能破译.我尽量让他们保持井井有条.

洞察力也将受到最多的赞赏.谢谢你检查一下.

5个表:设备池,用户,旅行,TripTracker和订单

查询1(更多选择语句):

SELECT
      username, 
      base.devid devid, 
      tripstatus, 
      stops, 
      stopnumber, 
      [time], 
      [orderstatus], 
      [destaddress]

FROM    
((
 (  SELECT 
           username, 
           devicepool.devid devid,
           groupid
    FROM
           devicepool INNER JOIN users 
           ON devicepool.userid = users.userid 

     WHERE devicepool.groupid = 1
 ) 
 AS [base] 

 INNER JOIN

 (
      SELECT 
              tripid, 
              [status] tripstatus, 
              stops, 
              devid,
              groupid

      FROM 
              trips 
 ) 
 AS [base2]

 ON base.devid = base2.devid AND base2.groupid = base.groupid

 INNER JOIN

 (
     SELECT 
            stopnumber, 
            devid, 
            [time], 
            MAX([time]) OVER (PARTITION BY devid) latesttime 
     FROM 
            TripTracker
 ) 

 AS [tracker] 
 ON tracker.devid = base.devid AND [time] = latesttime)

 INNER JOIN

 (
      SELECT 
            [status] [orderstatus], 
            [address] [destaddress], 
            [tripid], 
            stopnumber orderstopnumber 
      FROM [order]
 ) 
 AS [orders] 

 ON orders.orderstopnumber = tracker.stopnumber)
Run Code Online (Sandbox Code Playgroud)

查询2:

SELECT
      username, 
      base.devid devid, 
      tripstatus, 
      stops, 
      stopnumber, 
      [time], 
      [orderstatus], 
      [destaddress]

FROM    
((
 (  SELECT 
           username, 
           devicepool.devid devid,
           groupid
    FROM
           devicepool INNER JOIN users 
           ON devicepool.userid = users.userid 

     WHERE devicepool.groupid = 1
 ) 
 AS [base] 

 INNER JOIN

     trips

 ON base.devid = trips.devid AND trips.groupid = base.groupid

 INNER JOIN

 (
     SELECT 
            stopnumber, 
            devid, 
            [time], 
            MAX([time]) OVER (PARTITION BY devid) latesttime 
     FROM 
            TripTracker
 ) 

 AS [tracker] 
 ON tracker.devid = base.devid AND [time] = latesttime)

 INNER JOIN

    [order]

 ON [order].stopnumber = tracker.stopnumber)
Run Code Online (Sandbox Code Playgroud)

Red*_*ter 5

以下是否存在性能差异以及原因:a.SELECT ... FROM tbl1,tbl2,tbl3等为简单起见?(不知怎的,我觉得这可能会影响性能)b.SELECT ... FROM tbl1 inner join tbl2 on ... inner join tbl3 on ... etc(这会对服务器更加明确并节省性能/内存)吗?C.SELECT ... FROM(从tbl1中选择x,y,z)作为t1内连接...等(这会保存anythig吗?还是只是为服务器和我们创造更多工作的额外选择语句)?

a)和b)应该产生相同的查询计划(尽管这是特定于db的).b)对于a)的便携性和可读性是非常优选的.c)是一个可怕的想法,会伤害可读性,如果有什么会导致更糟糕的表现.让我们再也不谈论它了.

有没有更好的方法来做到这一点?

b)是标准方法.通常,编写最简单的ANSI SQL将获得最佳性能,因为它允许查询解析器轻松了解您尝试执行的操作.试图通过技巧超越编译器可能在给定的情况下工作,但并不意味着当基数或数据量发生变化或数据库引擎升级时它仍然可以工作.所以,除非你绝对被迫,否则不要这样做.