FQN如何影响查询执行计划缓存?
问题描述:
在link,更说明FQN如何影响查询执行计划缓存?
的算法,以匹配新的SQL语句在缓存中现有的,未使用的 执行计划要求所有的对象引用是 完全合格。例如,第一,这些SELECT语句是 不能与现有的计划相匹配,而第二匹配:
SELECT * FROM Person; SELECT * FROM Person.Person;
我不太明白是什么意思。它与模式名称和表名称相同的事实有关吗?为什么第一个与现有计划不匹配?
答
完全限定名称(FQN's)有助于更快速地进行名称解析。如果没有显式模式,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将产生相同的查询一个新的计划,即使有轻微的变化(我remeber阅读本与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%'
你可以发EE有两个计划
因此,在总结附加架构前缀总是会有所帮助,但它有少做计划缓存。您还提供
例落入例如我发现
名称解析和默认模式。 'dbo.Person'对'Person.Person'。 – lad2025