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