**在SQL Server Management Studio中查看执行计划时的受限文本**

bUK*_*eer 5 sql sql-server ssms sql-execution-plan

我正在审查执行计划,以了解存储过程为何运行缓慢.但是在执行计划窗口而不是Missing Indexes我得到的有用文本** Restricted Text **.

这让我好奇,因为我以前没见过它,也找不到谷歌搜索或者搜索SO的参考.

有人可以解释这是告诉我的,如果可能的话,如何不限制文本 - 我猜SSMS试图告诉我一些东西,但不管它试图告诉我的是非常冗长并被这个文本取代代替.

SQL Server Management Studio执行计划 - 受限制的文本

Aar*_*and 12

在某些情况下,客户端工具会在不同的工具中对查询文本进行模糊处理,具体取决于版本:

  1. 指某东西的用途 sp_password
  2. 创建登录 WITH PASSWORD
  3. WITH ENCRYPTION选项
  4. 某些加密/解密功能

感谢@Lamak,看到这个并试试这个:

CREATE LOGIN Lamak WITH PASSWORD = 'W0W, L@m@k is $m@rt!';
Run Code Online (Sandbox Code Playgroud)

根据版本的不同,SSMS会为您提供一个计划** Restricted Text **来代替您编写的实际命令,或者根本不给您一个计划.我认为现代版本根本不打算暴露DDL的计划,因为,为什么呢?你打算怎么处理这些信息?优化CREATE LOGIN?添加索引sys.server_principals?你不能做任何这些事情来优化DDL.

但是,即使用此混淆替换查询文本,也不应阻止任何丢失的索引显示.这是被阻止的查询文本,而不是缺少的索引建议.以下是使用您最喜欢的AdventureWorks副本的证据:

USE AdventureWorks;
GO
CREATE SYMMETRIC KEY SymKey1 WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = 'abcd1234$%^&';

OPEN SYMMETRIC KEY symKey1 DECRYPTION BY PASSWORD = 'abcd1234$%^&';
Run Code Online (Sandbox Code Playgroud)

现在,转向实际执行计划:

SELECT TOP (10) DecryptByKey(CreditCardApprovalCode),
SalesOrderID, PurchaseOrderNumber, CreditCardApprovalCode
FROM Sales.SalesOrderHeader
WHERE PurchaseOrderNumber LIKE 'PO147%';
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

起初我认为SSMS模糊了文本,但不是,这是在计划XML中,所以它是SQL Server本身阻止实际文本出来.可能感觉有必要模糊文本,以便显示可能敏感密码的批处理部分不会在以后传输给其他用户(如果您保存showplan并将其传递,则可能会发生这种情况).您可以自己检查XML以查看:

<Batch>
  <Statements>
    <StmtSimple ... StatementText="** Restricted Text **" ...
Run Code Online (Sandbox Code Playgroud)

你也可以看到,INPUTBUFFERNULL.关闭实际执行计划,再次运行查询,并从另一个窗口运行:

DBCC INPUTBUFFER(<spid from first window>);
Run Code Online (Sandbox Code Playgroud)

Event Info栏目将是NULL.您还将看到查询计划未存储:

SELECT * FROM sys.dm_exec_query_stats AS s
  CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) AS t
  WHERE t.text LIKE '%Decrypt'+'ByKey(%';
Run Code Online (Sandbox Code Playgroud)

现在,再次运行查询,但这次注释掉了DecryptByKey一下:

SELECT TOP (10) --DecryptByKey(CreditCardApprovalCode),
  SalesOrderID, PurchaseOrderNumber, CreditCardApprovalCode
  FROM Sales.SalesOrderHeader
  WHERE PurchaseOrderNumber LIKE 'PO147%';
Run Code Online (Sandbox Code Playgroud)

现在,针对上述DMV的查询将返回一行:具有注释掉的引用的行.此外,DBCC INPUTBUFFER将显示您运行的查询而不是NULL.


别忘了清理:

CLOSE SYMMETRIC KEY symKey1;
DROP SYMMETRIC KEY symKey1;
Run Code Online (Sandbox Code Playgroud)

  • 是lamook tyvm (2认同)