1

このクエリのcode_listCTE には、最終的に任意の数の引数を取る行コンストラクターがあります。CTEの列icdpatient_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],

4

3 に答える 3

5

このはるかに単純なクエリは、既存のクエリよりも優れている (最悪の場合は同じ) はずです。

select pat_id
    FROM dbo.icd_patient
    where icd LIKE '707%'
       OR icd LIKE '250%'
GROUP BY pat_id;

sargability は、この列に実際にインデックスがある場合にのみ問題になることに注意してください。

別の方法 (ORオプティマイザが適合する場合があるため):

SELECT pat_id FROM 
(
  SELECT pat_id
    FROM dbo.icd_patient
    WHERE icd LIKE '707%'
  UNION ALL
  SELECT pat_id
    FROM dbo.icd_patient
    WHERE icd LIKE '250%'
) AS x
GROUP BY pat_id;

これをいくつかの OR 条件を超えて拡張できるようにするには、テーブル値パラメーター (TVP) を使用します。

CREATE TYPE dbo.StringPatterns AS TABLE(s VARCHAR(3) PRIMARY KEY);

次に、ストアドプロシージャは次のように言うことができます:

CREATE PROCEDURE dbo.whatever
  @sp dbo.StringPatterns READONLY
AS
BEGIN
  SET NOCOUNT ON;

  SELECT p.pat_id
    FROM dbo.icd_patient AS p
    INNER JOIN @sp AS sp
    ON p.pat_id LIKE sp.s + '%'
  GROUP BY p.pat_id;
END

DataTable次に、C# のまたはその他のコレクションから 3 文字の部分文字列のセットを渡すことができます。例としてT-SQLから:

DECLARE @p dbo.StringPatterns;
INSERT @p VALUES('707'),('250');
EXEC dbo.whatever @sp = @p;
于 2013-03-30T20:36:55.417 に答える