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

标签 sql sql-server ssms sql-execution-plan

我正在检查执行计划以了解存储过程运行缓慢的原因。然而,在执行计划窗口中,我得到的是 ** Restricted Text **,而不是有用的 Missing Indexes 文本。

这激起了我的好奇心,因为我以前没有见过它,也无法通过谷歌搜索或确实搜索找到它的引用。

有人可以解释一下这告诉我什么吗?如果可能的话,如何取消限制文本 - 我猜 SSMS 试图告诉我一些事情,但它试图告诉我的任何事情都非常冗长并且被替换改为使用此文本。

SQL Server Management Studio Execution Plan - Restricted Text

最佳答案

在某些情况下,客户端工具会在不同的工具中混淆查询文本,具体取决于版本:

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

感谢@Lamak,see this并尝试这个:

CREATE LOGIN Lamak WITH PASSWORD = 'W0W, L@m@k is $m@rt!';

根据版本的不同,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$%^&';

现在,打开实际执行计划:

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

结果:

enter image description here

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

<Batch>
  <Statements>
    <StmtSimple ... StatementText="** Restricted Text **" ...

您还可以看到 INPUTBUFFERNULL。关闭实际执行计划,再次运行查询,然后从另一个窗口运行:

DBCC INPUTBUFFER(<spid from first window>);

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(%';

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

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

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

<小时/>

不要忘记清理:

CLOSE SYMMETRIC KEY symKey1;
DROP SYMMETRIC KEY symKey1;

关于sql - ** 在 SQL Server Management Studio 中查看执行计划时的受限文本 **,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18596952/

相关文章:

sql-server - "The notification message type <MessageType> was unexpected."由 SSBEA 记录,我的应用程序从未被调用

sql-server - 我该如何通过2个连接来进行 "FOR JSON"

sql - 将 GUID 转换为 varchar(32)

sql - 更改复制数据库向导的默认目标文件夹

mysql - 使用自动生成列的值进行后续查询

sql-server - 无法找到哪一行导致转换错误

sql - 'taking it offline' 进程失败后数据库无法访问

sql - 有免费的SQL Server Mgmt Studio自动完成加载项吗?

sql - SQL Server 2008 R2 HASHBYTES SHA2返回null

mysql - 从表列中计算并选择不同的日期格式类型