1

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

现有数据库目前的数据非常少,因为我们处于非常初始的阶段。所以不确定我是否可以衡量实践中的表现。我不是数据库专家。我可以得到我需要的数据。困境是,以什么价格。

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

我的问题是:

  1. 以下之间是否存在性能差异以及原因:SELECT ... FROM tbl1、tbl2、tbl3 等为简单起见?(不知何故,我觉得这可能会影响性能) b。SELECT ... FROM tbl1 inner join tbl2 on ... inner join tbl3 on ... etc(这对服务器是否更明确并节省性能/内存)?C。SELECT ... FROM (select x,y,z from tbl1) as t1 inner join ... etc(这会节省任何东西吗?还是只是额外的选择语句为服务器和我们创造了更多的工作)?

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

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

如果它们没有以标准形式编写或过于复杂,我深表歉意-希望您能破译。我尽量让它们井井有条。

见解也将不胜感激。感谢您检查这一点。

5 个表:devicepool、users、trips、TripTracker 和 order

查询 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)

查询 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)
4

1 回答 1

5

以下之间是否存在性能差异以及原因:SELECT ... FROM tbl1、tbl2、tbl3 等为简单起见?(不知何故,我觉得这可能会影响性能) b。SELECT ... FROM tbl1 inner join tbl2 on ... inner join tbl3 on ... etc(这对服务器是否更明确并节省性能/内存)?C。SELECT ... FROM (select x,y,z from tbl1) as t1 inner join ... etc(这会节省任何东西吗?还是只是额外的选择语句为服务器和我们创造了更多的工作)?

a) 和 b) 应该产生相同的查询计划(尽管这是特定于 db 的)。b) 在可移植性和可读性方面优于 a)。c) 是一个可怕的想法,它会损害可读性,并且如果有任何事情会导致性能下降。让我们永远不再谈论它。

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

b) 是标准方法。一般而言,编写最简单的 ANSI SQL 将产生最佳性能,因为它允许查询解析器轻松理解您正在尝试执行的操作。在给定的情况下,试图用技巧来超越编译器可能会起作用,但并不意味着当基数或数据量发生变化或数据库引擎升级时它仍然可以工作。因此,除非您绝对被迫这样做,否则请避免这样做。

于 2011-12-22T15:28:05.263 回答