ALTER DATABASE [qstore_demo] SET AUTO_UPDATE_STATISTICS OFF
GO
ALTER DATABASE [qstore_demo] SET AUTO_CREATE_STATISTICS OFF
GO
ALTER DATABASE [qstore_demo] SET RECOVERY SIMPLE
GO
ALTER DATABASE [qstore_demo] SET QUERY_STORE = OFF
GO
我们创建一个AUTO_UPDATE_STATISTICS为OFF和AUTO_CREATE_STATISTICS为OFF的数据库尽可能少的优化。这只是出于演示目的。
我们现在还没有启用查询存储。该表会生成数据并且我们不想要昂贵的INSERT查询在查询存储中。
现在我们将创建表和存储过程。我们将生成表并且在数据库上启用查询存储:
USE qstore_demo
GO
-- create a table
CREATE TABLE dbo.db_store (c1 CHAR(3) NOT NULL, c2 CHAR(3) NOT NULL, c3 SMALLINT NULL)
GO
-- create a stored procedure
CREATE PROC dbo.proc_1 @par1 SMALLINT
AS
SET NOCOUNT ON
SELECT c1, c2 FROM dbo.db_store
WHERE c3 = @par1
GO
-- populate the table (this may take a couple of minutes)
SET NOCOUNT ON
INSERT INTO [dbo].db_store (c1,c2,c3) SELECT '18','2f',2
go 20000
INSERT INTO [dbo].db_store (c1,c2) SELECT '171','1ff'
go 4000
INSERT INTO [dbo].db_store (c1,c2,c3) SELECT '172','1ff',0
go 10
INSERT INTO [dbo].db_store (c1,c2,c3) SELECT '172','1ff',4
go 15000
-- enable Query Store on the database
ALTER DATABASE [qstore_demo] SET QUERY_STORE = ON
GO SQL Server 2016查询存储性能测试 测试1 – 表上没有索引
在我们的第一个测试中我们在没有任何索引的表上执行存储过程。然后我们会在SSMS查询存储报表中回顾结果。我们会运行存储过程20次只会为了生成足够的执行和I/O,以便更容易在查询存储的其他查询中找到:
EXEC dbo.proc_1 0
GO 20
在SSMS中“Query Store”数据库的容器下打开“Top Resource Consuming Queries”面板:
对于存储过程创建最后的,最优索引。
CREATE NONCLUSTERED INDEX NCI_3
ON dbo.db_store (c3)
INCLUDE (c1,c2)
如果你再次运行存储过程,你会注意到强制计划将会被再次使用而不是创建新的使用新索引的计划。
现在我们不强制计划#13并再次运行存储过程:
EXEC sp_query_store_unforce_plan @query_id = 1, @plan_id = 13
GO
EXEC dbo.proc_1 0
GO
这里是结果:
新的计划#23已经被创建和使用。它有最少的逻辑读。 注意:本文基于SQL Server 2016 CTP 2.2版本所写。一些截屏和行为在SQL Server 2016的最终版中可能会改变。
在接下来的文章中我们会提供大量针对查询存储运行的有用查询。 接下来
l 阅读关于查询存储的下一篇文章。
l 在这里阅读更多关于维护查询性能稳定性。
l 下载最新的SQL Server 2016评估版。
l 阅读SQL Server 2016联机帮助文档。
l 阅读如何使用查询存储监控性能。
l 阅读关于SQL Server 2016的其他文章。