FROM子句中的嵌套select语句?内部连接语句?或者只是表名?

FROM子句中的嵌套select语句?内部连接语句?或者只是表名?,select,sql-server-2008r2-express,nested-queries,Select,Sql Server 2008r2 Express,Nested Queries,我正在构建一个需要来自5个表的数据的查询。 过去有一位DBA告诉我,从性能/内存的角度来看,指定列列表与获取所有列*是最好的选择。 我还被告知,当FROM子句中有一个表列表时,数据库会在后台执行连接操作,以创建一个表或视图 现有的数据库目前只有很少的数据,因为我们正处于一个非常初始的点。因此,我不确定我能否在实践中衡量绩效。 我不是数据库专家。我可以得到我需要的数据。难题是,代价是什么 补充:目前我正在与MS SQL Server 2008 R2合作 我的问题是: 以下各项之间是否存在性能差异及

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

现有的数据库目前只有很少的数据,因为我们正处于一个非常初始的点。因此,我不确定我能否在实践中衡量绩效。 我不是数据库专家。我可以得到我需要的数据。难题是,代价是什么

补充:目前我正在与MS SQL Server 2008 R2合作

我的问题是:

以下各项之间是否存在性能差异及其原因: A.选择为了简单起见,从tbl1、tbl2、tbl3等开始?不知怎的,我觉得这可能是一个性能的打击 B选择从tbl1内部连接到tbl2上。。。上的内部联接tbl3。。。等等,这会对服务器更明确,并节省性能/内存吗? C选择从tbl1中选择x、y、z作为t1内部联接。。。这能省下什么吗?或者只是额外的select语句为服务器和我们创建了更多的工作

还有更好的方法吗

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

我很抱歉,如果它们不是以标准的形式写的,或者过于复杂,希望你能破译。我尽量让他们有条理

我们也将非常感谢您的见解。 谢谢你检查这个

5个表:devicepool、用户、行程、TripTracker和订单

查询更多select语句:

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)
以下各项之间是否存在性能差异及其原因:a。 选择为了简单起见,从tbl1、tbl2、tbl3等开始?不知怎的,我觉得 这可能是一个性能冲击b。选择从tbl1内部 在…上加入tbl2。。。上的内部联接tbl3。。。等等,这会更多吗 显式到服务器并节省性能/内存?C选择 从tbl1中选择x、y、z作为t1内部联接。。。你会这样做吗 保存什么?或者只是额外的select语句创建了更多 为服务器和我们工作

a和b应该产生相同的查询计划,尽管这是特定于数据库的。与a相比,b在可移植性和可读性方面更受欢迎。c是一个可怕的想法,它损害了可读性,如果有任何东西会导致更糟糕的性能。让我们永远不要再提起它

还有更好的方法吗

b是标准方法。一般来说,编写最简单的ANSI SQL将获得最佳性能,因为它允许查询解析器轻松理解您要做的事情。在给定的情况下,试图用技巧胜过编译器可能会奏效,但这并不意味着当基数或数据量发生变化时,或者数据库引擎升级时,编译器仍能奏效。所以,避免这样做,除非你是绝对被迫的

以下各项之间是否存在性能差异及其原因:a。 选择为了简单起见,从tbl1、tbl2、tbl3等开始?不知怎的,我觉得 这可能是一个性能冲击b。选择从tbl1内部 在…上加入tbl2。。。上的内部联接tbl3。。。等等,这会更多吗 显式到服务器并节省性能/内存?C选择 从tbl1中选择x、y、z作为t1内部联接。。。你会这样做吗 保存什么?或者只是额外的select语句创建了更多 为服务器和我们工作

a和b应该产生相同的查询计划,尽管这是特定于数据库的。与a相比,b在可移植性和可读性方面更受欢迎。c是一个可怕的想法,它损害了可读性,如果有任何东西会导致更糟糕的性能。让我们永远不要再提起它

还有更好的方法吗


b是标准方法。一般来说,编写最简单的ANSI SQL将获得最佳性能,因为它允许查询解析器轻松理解您要做的事情。在给定的情况下,试图用技巧胜过编译器可能会奏效,但这并不意味着当基数或数据量发生变化时,或者数据库引擎升级时,编译器仍能奏效。所以,除非你绝对被迫这样做,否则不要这样做。

我绝对建议使用正确的连接语法-内部连接、左外部连接等等。这是一个ANSI标准,b对于其他阅读您的SQL代码的人来说,您想要做的事情更加清晰和明显,c您不会因为忘记了相关表之间的连接条件而意外引入笛卡尔积。这在SQLEXPRESS和代码上运行。目前我正在使用SQLEXPRESS作为数据库服务器。你能解释一下这和这个问题有什么关系吗?我刚检查过-看起来像SQL Server 2008 R2。我会再次更新。我一定会推荐
d使用正确的连接语法-内部连接、左外部连接等。这是一个ANSI标准,b对于其他阅读您的SQL代码的人来说,您想要做的事情更加清晰和明显,c您不会因为忘记了相关表之间的连接条件而意外引入笛卡尔积。这在SQLEXPRESS和代码上运行。目前我正在使用SQLEXPRESS作为数据库服务器。你能解释一下这和这个问题有什么关系吗?我刚检查过-看起来像SQL Server 2008 R2。我将再次更新。+1良好的指导!我当然也会选择b+1好的指导!我当然也会选择b!