嵌套查询语句中FROM子句? 内部联接语句? 或者只是表名?

我建设,从5桌需要数据的查询。 我已经在过去被告知由DBA的指定列VS让所有列(*)的列表是由一些性能/内存方面的首选。 我也被告知,数据库执行JOIN在幕后操作,当有表在FROM子句中的列表,创建一个表(或视图)。

现有数据库目前有很少的数据,因为我们正处于一个非常初始点。 所以不知道我可以衡量实际的性能命中。 我不是一个数据库亲。 我能得到我所需要的数据。 面临的困境是,以什么价格。

补充:在我与MS SQL Server 2008 R2的工作时刻。

我的问题是:

  1. 是否有性能差异,为什么,下面的操作:a。 SELECT ... FROM TBL1,TBL2,TBL3等为简单? (不知何故,我觉得这可能是一个性能命中。)A。 SELECT ... FROM TBL1内上...内部联接tbl2的加入TBL3上...等(这会是更加明确的服务器和存储性能/内存)? C。 SELECT ... FROM(选择X,Y,Z从TBL 1)为T1内加入...等(这将节省anythig?或只是额外的服务器,并为我们创造更多的工作select语句)?
  2. 有没有更好的方法来做到这一点?

下面是两个查询,无论获取数据的片,我需要。 一个包括多个嵌套select语句。

我道歉,如果他们不写在一个标准的形式或者过于复杂的无奈 - 希望你能破译。 我试图让他们有组织尽可能。

洞察将最欣赏为好。 感谢您检查了这一点。

5表:devicepool,用户,旅行,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)

问题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。 SELECT ... FROM TBL1,TBL2,TBL3等为简单? (不知何故,我觉得这可能是一个性能命中。)A。 SELECT ... FROM TBL1内上...内部联接tbl2的加入TBL3上...等(这会是更加明确的服务器和存储性能/内存)? C。 SELECT ... FROM(选择X,Y,Z从TBL 1)为T1内加入...等(这将节省anythig?或只是额外的服务器,并为我们创造更多的工作select语句)?

a)和b)应导致相同的查询计划(虽然这是分贝特异性)。 b)的多优选用于便携性和可读性过)。 C)是一个可怕的想法,那伤害可读性,如果有的话,将导致更糟糕的peformance。 让我们永远不再提起它。

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

b)是该标准的做法。 一般来说,写最朴素ANSI SQL将导致最佳的性能,因为它允许查询分析器很容易明白你正在尝试做的。 试图智取诡计编译器在特定情况下可以工作,但并不意味着,当基数或数据变化量或数据库引擎升级它仍然可以工作。 因此,应避免这样做,除非你绝对被逼的。

分类:选择 时间:2012-05-01 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.336 (s). 9 q(s)