我正在构建一个需要来自 5 个表的数据的查询。过去,DBA 告诉我,从某些性能/内存方面来看,指定列列表与获取所有列 (*) 是首选。我还被告知,当 FROM 子句中有一个表列表时,数据库会在后台执行 JOIN 操作,以创建一个表(或视图)。
现有数据库目前的数据非常少,因为我们处于非常初始的阶段。所以不确定我是否可以衡量实践中的表现。我不是数据库专家。我可以得到我需要的数据。困境是,以什么价格。
补充:目前我正在使用 MS SQL Server 2008 R2。
我的问题是:
以下之间是否存在性能差异以及原因: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(这会节省任何东西吗?还是只是额外的选择语句为服务器和我们创造了更多的工作)?
有没有更好的方法来做到这一点?
下面是两个查询,它们都获得了我需要的数据片段。一个包括更多嵌套的选择语句。
如果它们没有以标准形式编写或过于复杂,我深表歉意-希望您能破译。我尽量让它们井井有条。
见解也将不胜感激。感谢您检查这一点。
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)