在link中,声明
将新SQL语句与现有,未使用的语句匹配的算法 缓存中的执行计划要求所有对象引用都是 完全合格。例如,这些SELECT语句中的第一个是 与现有计划不匹配,第二个匹配:
SELECT * FROM Person; SELECT * FROM Person.Person;
我不太明白这是什么意思。是否与模式名称和表名相同这一事实有关?为什么第一个与现有计划不匹配?
答案 0 :(得分:2)
完全限定名称(FQN)有助于更快地解析名称。如果没有明确的架构,SQL Server将首先查看与您的登录相关联的架构。
假设您有以下与架构相关联的登录
create schema test
create table test.schematest
(id int
)
select * from test.schematest
--create a login
CREATE LOGIN foo WITH
PASSWORD = 'foo',
CHECK_POLICY = OFF,
CHECK_EXPIRATION = OFF;
GO
--create schema
CREATE SCHEMA foo AUTHORIZATION dbo;
go
CREATE USER foo FOR LOGIN foo WITH DEFAULT_SCHEMA = foo;
GO
EXEC sp_addrolemember 'db_owner', 'foo';
GO
--now first create a table
--this will be created in dbo schema
create table test
(
id int
)
--now execute as user foo
execute as user='foo'
go
create table test
(
namee varchar(100)
)
insert into test
values
('foo schema')
select * from test--gives foo schema
现在计划缓存方面,即使存在轻微的变化,sql server也会为同一个查询生成一个新的计划(我记得读取这个与sql哈希查询文本有关并进行比较)
下面的查询是相同的,除了新行上的foo.test
dbcc freeproccache
select * from foo.test
select * from
foo.test
select txt.text,* From sys.dm_exec_query_stats ec
cross apply
sys.dm_exec_sql_text(ec.plan_handle) txt
where txt.text like '%foo.test%'
你可以看到有两个计划
因此,总结附加模式前缀总是有帮助的,但它与计划缓存没什么关系。
您提供的示例也属于我展示的示例