メモ:SQL Server 共通テーブル式でリードが減るかの確認 (減らない)

WITH common_table_expression (Transact-SQL) - SQL Server | Microsoft Docs

試したバージョンは

Microsoft SQL Server 2019 (RTM-GDR) (KB4517790) - 15.0.2070.41 (X64)   Oct 28 2019 19:56:59   Copyright (C) 2019 Microsoft Corporation  Developer Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 18363: ) (Hypervisor)

共通テーブル式で用意した名前付き結果セットを複数回呼んだ時に、実テーブルのリードは1回で済むのか呼んだ回数リードするのかの確認。
取り合えず適当にデータを用意

create table [注文明細] (
  [Id] bigint not null,
  [商品Id] bigint not null
)
create table [商品] (
  [Id] bigint not null,
  [名前] varchar(20) not null
)
;
begin tran
;
with [cte] ([seq]) as (select 1 as [seq] union all select [seq] + 1 from [cte] where [seq] < 2000 )

insert into [商品] 
select
  [seq]
  , cast([seq] as char)
from [cte]
where [seq] < 2000
option (maxrecursion 0)
;

with [cte] ([seq]) as (select 1 as [seq] union all select [seq] + 1 from [cte] where [seq] < 20000 )

insert into [注文明細] 
select
  [seq]
  , cast(([seq] * (rand() * 1000)) as int) % 2000
from [cte]
where [seq] < 20000
option (maxrecursion 0)

commit

んで、SET STATISTICS IO (Transact-SQL) - SQL Server | Microsoft Docs で確認

print(N'2回')
set statistics io on;

with cte (Id) as (select Id from 商品 where 名前 like '%8%')
select * from 注文明細 where 商品Id in (select Id from cte) or 商品Id in (select Id from cte)

set statistics io off

print(N'1回')

set statistics io on;

with cte (Id) as (select Id from 商品 where 名前 like '%8%')
select * from 注文明細 where 商品Id in (select Id from cte)

set statistics io off

結果

2回
テーブル 'Workfile'。スキャン数 0、論理読み取り数 0、物理読み取り数 0、ページ サーバー読み取り数 0、先読みの読み取り数 0、ページ サーバー先読みの読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB ページ サーバー読み取り数 0、LOB 先読みの読み取り数 0、LOB ページ サーバー先読みの読み取り数 0。
テーブル 'Worktable'。スキャン数 0、論理読み取り数 0、物理読み取り数 0、ページ サーバー読み取り数 0、先読みの読み取り数 0、ページ サーバー先読みの読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB ページ サーバー読み取り数 0、LOB 先読みの読み取り数 0、LOB ページ サーバー先読みの読み取り数 0。
テーブル '注文明細'。スキャン数 1、論理読み取り数 62、物理読み取り数 0、ページ サーバー読み取り数 0、先読みの読み取り数 0、ページ サーバー先読みの読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB ページ サーバー読み取り数 0、LOB 先読みの読み取り数 0、LOB ページ サーバー先読みの読み取り数 0。
テーブル '商品'。スキャン数 2、論理読み取り数 22、物理読み取り数 0、ページ サーバー読み取り数 0、先読みの読み取り数 0、ページ サーバー先読みの読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB ページ サーバー読み取り数 0、LOB 先読みの読み取り数 0、LOB ページ サーバー先読みの読み取り数 0。
1回
テーブル 'Workfile'。スキャン数 0、論理読み取り数 0、物理読み取り数 0、ページ サーバー読み取り数 0、先読みの読み取り数 0、ページ サーバー先読みの読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB ページ サーバー読み取り数 0、LOB 先読みの読み取り数 0、LOB ページ サーバー先読みの読み取り数 0。
テーブル 'Worktable'。スキャン数 0、論理読み取り数 0、物理読み取り数 0、ページ サーバー読み取り数 0、先読みの読み取り数 0、ページ サーバー先読みの読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB ページ サーバー読み取り数 0、LOB 先読みの読み取り数 0、LOB ページ サーバー先読みの読み取り数 0。
テーブル '注文明細'。スキャン数 1、論理読み取り数 62、物理読み取り数 0、ページ サーバー読み取り数 0、先読みの読み取り数 0、ページ サーバー先読みの読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB ページ サーバー読み取り数 0、LOB 先読みの読み取り数 0、LOB ページ サーバー先読みの読み取り数 0。
テーブル '商品'。スキャン数 1、論理読み取り数 11、物理読み取り数 0、ページ サーバー読み取り数 0、先読みの読み取り数 0、ページ サーバー先読みの読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB ページ サーバー読み取り数 0、LOB 先読みの読み取り数 0、LOB ページ サーバー先読みの読み取り数 0。

完了時刻: 2020-06-25T13:18:57.5887353+09:00

減らなさそうっすね。