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 **" ...

であることもわかり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 に対するクエリは 1 行 (コメントアウトされた参照を含む行) を返します。また、DBCC INPUTBUFFERの代わりに実行したクエリが表示されますNULL


クリーンアップすることを忘れないでください:

CLOSE SYMMETRIC KEY symKey1;
DROP SYMMETRIC KEY symKey1;
于 2013-09-03T16:49:27.770 に答える