首页 > 解决方案 > SQL Server:如何以编程方式检索性能指标;特别是逻辑读取

问题描述

背景:我有一个非常复杂的存储过程,它根据十个参数动态创建 SQL。最重要的是,它使用了一些视图,这些视图本身非常复杂。可以想象,在某些情况下,生成的 SQL 语句会生成相当多的(在最坏的情况下为数万亿次)逻辑读取。我有几个我正在研究的策略。

测试工具:我创建了一个诊断存储过程,它使用各种参数设置运行存储过程并将结果存储到表中。这记录了用于生成它的输出和参数集。

我缺少什么:我想以编程方式捕获性能指标。我不想运行每个测试然后把它们写下来。我有二十几个奇怪的参数集并且还在增长。我也在比较不同版本的存储过程。

我想我想要什么: “设置统计信息 IO ON”给了我我正在寻找的东西,但信息显示在“消息”选项卡中。有没有办法返回这些信息,以便我的存储过程可以将这些值放入我的结果表中?

这是为测试我的存储过程而创建的查询示例。此代码示例生成 60 多次(每个测试过程的每个参数集一次)。此特定迭代使用参数集编号 11 测试“原始”存储过程。

DECLARE @LSBA_table table (ViewStatementBalanceAllUid uniqueidentifier, AccountResponsiblePartyUid uniqueidentifier, FinancialCenterUid uniqueidentifier, FinancialCenterName varchar(255), Balance money, CycleTrigger BIT, LastStatementDate Date, AccountResponsiblePartyFullName varchar(255), LastName varchar(255), ExternalID varchar(25), PayerCreditBalance Money, StatementsByFinancialCenter bit, SendStatement bit);
INSERT INTO @LSBA_table EXEC LoadStatementBalanceAll_ORIGINAL  @nameRangeSearch = 'A-Bzzz',  @onDemand = 0, @daysBack=30, @financialCenterUid='7FAEF75C-914F-491F-8FE2-0A747FD84088;8709E580-13BC-4E4B-9325-D8F3AB1B2868', @minBalance=25.00
INSERT INTO CUS_LSBA_RESULTS (StoredProcName, ParameterId,ViewStatementBalanceAllUid,AccountResponsiblePartyUid,FinancialCenterUid,FinancialCenterName,Balance,CycleTrigger,LastStatementDate,AccountResponsiblePartyFullName,LastName,ExternalID,PayerCreditBalance,StatementsByFinancialCenter,SendStatement) (SELECT 'LoadStatementBalanceAll_ORIGINAL', 11, * FROM @LSBA_table)

标签: sql-serversqlperformance

解决方案


您想自动保存结果

 set statistic IO on

没有办法做到这一点。但是您可以通过创建分析器跟踪来获得所有结果,该跟踪器可以通过运行同一查询的不同版本来保存您想要的所有内容(每个可能的统计信息)。 https://docs.microsoft.com/en-us/sql/tools/sql-server-profiler/sql-server-profiler?view=sql-server-2017


推荐阅读