Persisted Computed ColumnはComputed ColumnよりもSelectが本当に速いのか

本当に速いのか

前回の記事で、SQL ServerのComputed Columnについて、「Persisted Computed Columnの方が当然Selectは速くなる」と書きましたが、Webの情報を鵜呑みにして書いただけで未検証でした。

mrgchr.hatenablog.com

というわけで確認してみました。

前回作成したテーブル定義をそのまま利用します。
両方のテーブルにランダムなデータを10,000件入れておきます。

下記のクエリの実行計画を取得します。

SELECT [Id]
      ,[FirstName]
      ,[LastName]
      ,[LastNameComesFirst]
      ,[FullName]
  FROM [EmailDojo].[dbo].[Accounts]
GO
SELECT [Id]
      ,[FirstName]
      ,[LastName]
      ,[LastNameComesFirst]
      ,[FullName]
  FROM [EmailDojo].[dbo].[AccountsPersisted]

f:id:mrgchr:20170722020128p:plain

あれ?Persisted Computed Columnの方がコスト高く(61%)ないですか?

とりあえず、内訳を見てみましょう。

非Persistedのテーブルのインデックススキャン f:id:mrgchr:20170722020441p:plain

Persistedのテーブルのインデックススキャン f:id:mrgchr:20170722020350p:plain

非PersistedのテーブルのComputed Column(FullName計算) f:id:mrgchr:20170722021038p:plain

Estimated I/O Costの差が結果に如実に表れたようですね。

これくらいの計算であればPersisted Computed Columnを使うとI/Oのコストがバカにならないようです。

この例ではPersisted Computed Columnはまるでメリットがないようにも見えますが、インデックスが張れたりと使いようによっては便利になると思います。