在SQL Server中编写SQL语句时,我如何删除表名中的dbo前缀?
出现的原因:
问题的提问者认为目前的回答没有提供足够详细的信息,并且没有真正解答如何从SQL Server中的SQL语句中删除表名前的“dbo”前缀或将其更改为其他内容。
解决方法:
在SQL Server中,“dbo”是一个模式(schema)。不能从表中删除模式,但可以修改它。以下是一个示例:How do I move a table into a schema in T-SQL。
在SQL Server中,保留dbo.前缀实际上是有益的 - 毕竟,你可以在SQL Server中拥有几个模式("dbo."是其中之一),它们都有相同的表名,例如dbo.MyTable,joe.MyTable,frank.MyTable。
如果你发出一个SELECT (字段列表) FROM MyTable的查询,SQL Server首先必须确定你真正要使用的"MyTable"表是哪一个 - 这需要时间,如果你一开始就明确指定你想要的是"dbo.MyTable",将会节省时间。
好吧,对于单个查询来说节省的时间不多 - 但SELECT查询是相当频繁的,所有这些都会累积起来!
Marc
原因:在SQL Server中,可以有多个具有相同表名的模式,如果不指定模式的话,SQL Server需要花费时间确定要使用的是哪个模式下的表。
解决方法:在编写SQL语句时,明确指定表名的模式,例如使用dbo.MyTable来代替MyTable。这样可以节省SQL Server确定表的模式的时间。
从上述内容可以得出以下结论:
问题的出现原因:
- dbo.前缀的存在是为了指定表的架构,以便在查询执行时优化器不必查找架构。这样可以提高查询的执行速度。
解决方法:
- 不建议删除dbo.前缀,因为这可能会影响查询的性能。
- 如果确实需要删除dbo.前缀,可以通过以下方法解决:
1. 使用脚本或工具批量替换所有的dbo.前缀。
2. 使用 ALTER SCHEMA 语句将表从dbo架构移动到其他架构,然后在查询中不再使用dbo.前缀。
值得注意的是,尽管现代的优化器可能能够猜测查询只会引用一个特定的架构,但删除dbo.前缀仍可能导致SQL脚本在更改架构时出现错误。
参考链接:[Performance Impact of Procedure Calls without Owner Qualification](https://web.archive.org/web/20090409015944/http://sqlblog.com/blogs/linchi_shea/archive/2007/06/30/performance-impact-of-procedure-calls-without-owner-qualification.aspx)