7

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

这激起了我的好奇心,因为我以前从未见过它,也无法在谷歌搜索或确实搜索 SO 时找到它的参考。

有人可以解释一下这告诉我什么,如果可能的话,如何取消限制文本 - 我猜 SSMS 试图告诉我一些事情,但无论它试图告诉我什么都非常冗长并被替换为这个文本反而。

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

4

1 回答 1

14

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

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

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

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

结果:

在此处输入图像描述

起初我认为 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;
于 2013-09-03T16:49:27.770 回答