Sql dbo。数据库对象名称中的前缀,我可以忽略它吗?

Sql dbo。数据库对象名称中的前缀,我可以忽略它吗?,sql,sql-server,Sql,Sql Server,我正在寻找处理.dbo前缀的性能默认策略 我意识到dbo。前缀不仅仅是语法噪音,但是我在过去8年基于MS的开发中跳过了键入dbo。并忽略其功能 除了存储过程编译锁的性能问题外,在SQLqueries和存储过程中跳过键入“.dbo”是否还有缺点 进一步的背景:我所有的开发都是基于web中间层的,集成了基于中间层服务帐户的安全性。大多数时候你可以忽略它。有时你必须打字。有时,当您必须键入它时,您只需键入一个额外的“.”: SELECT * FROM [LinkedServer].[Database]

我正在寻找处理.dbo前缀的性能默认策略

我意识到dbo。前缀不仅仅是语法噪音,但是我在过去8年基于MS的开发中跳过了键入dbo。并忽略其功能

除了存储过程编译锁的性能问题外,在SQLqueries和存储过程中跳过键入“.dbo”是否还有缺点


进一步的背景:我所有的开发都是基于web中间层的,集成了基于中间层服务帐户的安全性。

大多数时候你可以忽略它。有时你必须打字。有时,当您必须键入它时,您只需键入一个额外的“.”:

SELECT * FROM [LinkedServer].[Database]..[Table]
如果您开始更多地使用额外的模式,那么您需要开始关注它,因为在同一个数据库中可能有两个模式,它们都具有相同名称的表。

“但是,在过去8年的基于MS的开发中,我跳过了键入dbo.prexfix而忽略了它的功能。”


这是你的答案。如果您的数据库表现良好,您就可以了。最佳实践不会取代实际系统上的实际测试。如果您的性能良好且维护正常,那么最好将您的时间花在其他地方,这样您可以获得更好的回报。

在oracle世界工作后,我建议不要跳过模式声明。现在请记住,7.0之后的SQL server版本支持每个数据库有多个模式-区分它们以确保获取正确的表非常重要


如果可以确保每个数据库永远不会有两个单独的模式名称空间,那么可以忽略它。dbo。前缀本身不应该影响性能——解析是SQL查询的一小部分,因此无关紧要

主要问题不是安全性,而是名称冲突解决,因为您的应用程序将与数据库中使用相同名称的另一个应用程序并行部署

如果您包装和销售您的产品,为了您的客户,我强烈建议您使用模式。如果你为一个特定的商店开发,那么就不那么重要了。

[dbo].[xxx]

SQL Server引擎总是将查询分解为多个部分,如果您不使用前缀,它会在使用[dbo]之前与不同的用户搜索具有类似名称的对象。我建议您遵循前缀机制,不仅是为了满足最佳实践,也是为了避免性能问题,并使代码具有可伸缩性


我不知道我是否回答了您的问题,但这些只是我的知识共享

是的,如果您从未创建过(默认)“dbo”模式之外的任何内容,您可以忽略大部分内容。调用存储函数时,有一个地方您不能忽略它—它必须始终具有“两部分”符号:

select * from dbo.myFunc
但是,始终使用“dbo.”前缀(或其他模式前缀,如果您的数据库有多个模式)被认为是最佳实践


马克

好的,我想我明白了。但是,现在我对(1)“dbo.”作为模式名称空间机制,(2)SQL Server数据库所有者角色和(3)可能映射到模式前缀和/或成为数据库所有者角色成员的用户之间的关系感到困惑。但是,从上下文看,如果组/角色/用户拥有对象,那么他没有理由拥有/成为dbo的成员。它们仅在需要对对象的权限进行多样化时才创建模式。希望有帮助。我认为这不是最好的做法。一些主机提供商将dbo更改为愚蠢的东西。。然后呢?将所有dbo更改为其愚蠢的前缀。谁知道为什么。。但他们做到了,我们无法改变;是的。1)SQL Server不允许架构重命名。2) 默认情况下会创建
dbo
模式。因此,使用它通常是相当安全的(我敢说99.9999%的时间使用
dbo
模式正是您想要的)。。。我完全不同意。。。最佳实践正是言外之意。虽然你是对的,你可能会“逃之夭夭”,但它仍然是草率的业余编程。这难道不是不使用dbo的理由吗。你所有的代码中都有前缀吗?如果你省略了dbo。前缀,则应用程序可以轻松地在不同的模式下运行。如果所有表名都显式限定为dbo.x,那么在不搜索和替换整个代码库的情况下,就不能更改为其他模式。因此,如果两个不同的应用程序都使用显式dbo。前缀,它们不能并排部署而不存在名称冲突的风险。