このクエリのcode_list
CTE には、最終的に任意の数の引数を取る行コンストラクターがあります。CTEの列icd
はpatient_codes
、行コンストラクターが持つ 3 桁のコードよりも最もわかりやすい 5 桁の識別子です。テーブルicd_patient
には 1 億行あるので、パフォーマンスのために、このテーブルの行をファイリングしてから、さらに作業を進めたいと思います。私は持っている
;with code_list(code_list)
as
(
select x.code_list
from (values ('70700'),('25002')) as x(code_list)
),patient_codes
as
(
select distinct icd,pat_id,id
from icd_patient
where icd in (select icd from code_list)
)
select distinct pat_id from patient_codes
ただし、問題は、icd_patient テーブルではすべてのicd
列が 5 桁で、より説明的であることです。このクエリの実行計画を見ると、かなり合理化されています。私が行った場合
;with code_list(code_list)
as
(
select x.code_list
from (values ('70700'),('25002')) as x(code_list)
),patient_codes
as
(
select substring(icd,1,3) as icd,pat_id
from icd_patient2
where substring(icd,1,3) in (select * from code_list)
)
select * from patient_codes
where句の部分文字列式のため、このifコースはパフォーマンスに大きな影響を与えます。like in
インデックスを利用できるように、似たようなものはありますか?
icd_patient のインデックス
CREATE NONCLUSTERED INDEX [ix_icd_patient] ON [dbo].[icd_patient2]
(
[pat_id] ASC
)
INCLUDE ( [id],