SQL 服务器:如何以编程方式检索性能指标;特别逻辑读取

SQL Server: how-to retrieve performance metrics programmatically; specifically logical reads

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

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

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

我想我想要的: 'Set statistics IO ON' 给了我我要找的东西,但信息显示在 'messages' 选项卡中。 有没有办法返回此信息,以便我的存储过程可以将这些值放入我的结果中table?

这是为测试我的存储过程而创建的查询示例。此代码示例生成 60 多次(每个测试过程每个参数集一次)。此特定迭代测试 'ORIGINAL' 存储过程,参数集编号为 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)

您想自动保存

的结果
 set statistic IO on

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