1

编辑:我知道这SELECT *是不好的做法,但在这里使用它只是为了将示例 SQL 集中在 table 语句上,而不是查询的其余部分。如果您愿意,可以将其换成一些列名。

给定一个数据库服务器MyServer(我们目前在 SSMS 中连接到该服务器),具有多个数据库MyDb1MyDb2MyDb3和默认模式dbo,以下等效查询中的任何一个(它们都将返回完全相同的结果集)比其他查询更“最优” ?

SELECT * FROM MyServer.MyDb1.dbo.MyTable

有人告诉我,此方法(明确提供包括服务器名称在内的完整数据库名称)将MyServer其视为链接服务器并导致查询运行速度变慢。这是真的?


SELECT * FROM MyDb1.dbo.MyTable

服务器名称不是必需的,因为我们已经连接到它,但是这会比上面的运行“更快”吗?


USE MyDb1
GO

SELECT * FROM dbo.MyTable

说明我们最初使用的数据库。我无法想象这对于单个查询比以前的查询更好,但是对于同一数据库上的后续查询(即,如果我们SELECT在此下面有更多相同格式的语句)会更优化吗?


USE MyDb1
GO

SELECT * FROM MyTable

如上所述,但省略了默认模式。我不认为这有什么区别。可以?

4

1 回答 1

0

如果您未指定完全限定名称,SQL Server 将始终在当前“上下文”中查找您指定的对象。

一个比另一个快,当然,与硬盘驱动器上的文件名相同,“这是一个非常长的文件名,但只要它低于 254 就可以.txt”会占用更多的硬盘 -驱动器(目录)空间比“x.txt”。你会注意到它吗,不!

至于“USE”关键字,这只是为您设置上下文,因此您不必完全限定对象名称。“USE”关键字不是 sql,您不能在另一个应用程序(如 vb/c# 应用程序)或存储过程中使用,但它类似于“GO”关键字,因为它告诉 SSMS 做某事,更改上下文.

于 2013-09-20T18:53:11.143 回答