我正在查看执行计划,以了解存储过程为何运行缓慢。但是,在执行计划窗口而不是有用的Missing Indexes
文本中,我得到了** Restricted Text **
。
这让我好奇,因为我以前没见过它,也找不到谷歌搜索或搜索SO的参考。
有人可以解释一下这告诉我什么,如果可能的话,如何取消限制文本 - 我猜SSMS试图告诉我一些事情,但无论它试图告诉我什么都非常冗长并被替换用这个文字代替。
?
答案 0 :(得分:12)
在某些情况下,客户端工具会在不同的工具中对查询文本进行模糊处理,具体取决于版本:
sp_password
WITH PASSWORD
WITH ENCRYPTION
选项归功于@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%';
结果:
起初我认为SSMS模糊了文本,但不是,这是在计划XML中,所以它是SQL Server本身阻止实际文本出来。可能感觉有必要模糊文本,以便显示可能敏感密码的批处理部分不会在以后传输给其他用户(如果您保存showplan并将其传递,则可能会发生这种情况)。您可以自己检查XML以查看:
<Batch>
<Statements>
<StmtSimple ... StatementText="** Restricted Text **" ...
您还可以看到INPUTBUFFER
是NULL
。关闭实际执行计划,再次运行查询,然后从另一个窗口运行:
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;