如上当我们进行查询时总是会返回受影响的行数,这种消息只是对于我们调试SQL时有帮助,其他再无其他帮助,我们可以通过设置 SET NOCOUNT ON 来禁用这个特性,这将有显著的性能提升,有利于减少网络流量的传输。在存储过程中我们像如下设置。
CREATE PROC dbo.ProcNameASSET NOCOUNT ON;--Your Procedure codeSELECT [address], city, companyname FROM Sales.Customers-- Reset SET NOCOUNT to OFFSET NOCOUNT OFF;GO使用架构名称+对象名称
SELECT * FROM Sales.Customers -- 推荐-- 而不是SELECT * FROM Customers -- 避免--调用存储过程如下EXEC dbo.MyProc -- 推荐--而不是EXEC MyProc -- 避免存储过程名称禁止以sp开头
declare @message varchar(200),@name varchar(200)if exists(select * from students where 学号="1005")beginset @message="下列人员符合条件:"print @messageset @name=(select 姓名 from students where 学号="1005")print @nameendelsebeginset @message="没有人符合条件"print @messageendgo当判断一条记录是否在表中存在时我们使用IF EXISIS,如果在IF EXISTS中内部语句中有任何值返回则返回TRUE。如上述
if exists(select * from students where 学号="1005")此时将返回学号 = "1005"的这一行,而如果用1代替则不用返回满足条件的这一行记录,在查询时为了网络传输我们应该最小化处理数据,所以我们应该像如下做返回单值1.
IF EXISTS (SELECT 1 FROM Sales.CustomersWHERE [address] = "Obere Str. 0123")使用sp_executesql而不是使用EXECUTE
DECLARE @Query VARCHAR(100)DECLARE @contactname VARCHAR(50)SET @contactname = "Allen, Michael"SET @Query = "SELECT * FROM Sales.Customers WHERE contactname = " + CONVERT(VARCHAR(3),@contactname)EXEC (@Query)执行查询计划如下,如果再一次使用不同的@contactname值,此时查询执行计划将再次创建@contactname不会达到重用的目的
如果我们使用利用sp_executesql像如下查询,如果对于不同的@contactname值,此时查询执行计划将被会重用,将会达到提高性能的目的。
DECLARE @Query VARCHAR(100)SET @Query = "SELECT * FROM Sales.Customers WHERE contactname = @contactname"EXECUTE sp_executesql @Query,N"@contactname VARCHAR(50)",@contactname = "Allen, Michael"对于异常处理利用TRY-CATCH处理
USE tempdbGOCREATE TABLE TestCompression (col1 INT, col2 CHAR(50))GOINSERT INTO TestCompression VALUES (10, "压缩测试")GO 748接下来进行行压缩和页压缩来和原始未压缩进行比较看看。
-- 原始值EXEC sp_spaceused TestCompressionGO-- DATA_COMPRESSION = 设置行压缩ALTER TABLE TestCompressionREBUILD WITH (DATA_COMPRESSION = ROW);GOEXEC sp_spaceused TestCompressionGO-- DATA_COMPRESSION = 设置页压缩ALTER TABLE TestCompressionREBUILD WITH (DATA_COMPRESSION = PAGE);GOEXEC sp_spaceused TestCompressionGO-- DATA_COMPRESSION = 没有压缩ALTER TABLE TestCompressionREBUILD WITH (DATA_COMPRESSION = NONE);GOEXEC sp_spaceused TestCompressionGO结果如下:
压缩后数据显然变少了,如果数据量足够大页压缩比行压缩的数据会更少,从而减少IO提高性能,不知道看到本文的你是否在生产服务上是否已经应用过呢,下次可以试试。
以上所述是小编给大家介绍的SQL Server 聚焦存储过程性能优化、数据压缩和页压缩提高IO性能方法(一),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!