FQN如何影响查询执行计划缓存?

时间:2017-08-24 08:49:45

标签: sql-server tsql

link中,声明

  

将新SQL语句与现有,未使用的语句匹配的算法   缓存中的执行计划要求所有对象引用都是   完全合格。例如,这些SELECT语句中的第一个是   与现有计划不匹配,第二个匹配:

SELECT * FROM Person;

SELECT * FROM Person.Person;

我不太明白这是什么意思。是否与模式名称和表名相同这一事实有关?为什么第一个与现有计划不匹配?

1 个答案:

答案 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%'

你可以看到有两个计划

enter image description here

因此,总结附加模式前缀总是有帮助的,但它与计划缓存没什么关系。

您提供的示例也属于我展示的示例

<强>参考文献:
Bad habits to kick : avoiding the schema prefix