結合しながら絞り込む

PostgreSQLでクエリ性能を改善する

Amy McCarty

Instructor

結合の再確認

 

結合(JOIN)

  • 少なくとも1つの共通フィールドでテーブルを関連付ける
SELECT * 
FROM TABLE_A AS A
INNER JOIN TABLE_B AS B 
  ON A.NAME = B.NAME

 

データ結合のための結合

  • 複数テーブルから
  • 内部結合と外部結合

データ抽出のための結合

  • 内部結合
  • 非リンク条件を含む外部結合
PostgreSQLでクエリ性能を改善する

患者と予約データ

Appointments(予約)
visit_id reason patient_id
01 checkup 999
02 infection 888
Patients(患者)
patient_id name sex
999 Lotte Smith F
888 Zhang Wei M
777 Amelia Hernandez F
PostgreSQLでクエリ性能を改善する

内部結合でのフィルタ

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id

Visits の 999 は Patients の 999 と、Visits の 888 は Patients の 888 とリンク。Patients の 777 はリンクなし。

PostgreSQLでクエリ性能を改善する

内部結合でのフィルタ

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id
出力
visit_id reason patient_id name sex
01 checkup 999 Lotte Smith F
02 infection 888 Zhang Wei M
PostgreSQLでクエリ性能を改善する

外部結合でのフィルタ

SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'

Patients テーブルを男性でフィルタすると、患者 888 Zhang Wei M が丸で強調されます。これは唯一の男性レコードで、Visits テーブルの patient_id と結合される唯一の行です。

PostgreSQLでクエリ性能を改善する

外部結合でのフィルタ

SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
出力
visit_id reason patient_id name sex
01 checkup 999
02 infection 888 Zhang Wei M
PostgreSQLでクエリ性能を改善する

フィルタの落とし穴

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'

1) FROM Visits の 999 は Patients の 999 と、Visits の 888 は Patients の 888 とリンク。Patients の 777 はリンクなし。

 

 

 

 

2) WHERE 888 Zhang Wei の訪問と患者情報の行と、999 Lotte Smith の行(こちらは打ち消し)を示すテーブル。

PostgreSQLでクエリ性能を改善する

フィルタの落とし穴

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
出力
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M
PostgreSQLでクエリ性能を改善する

フィルタの落とし穴

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
出力
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M
SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
visit_id reason patient_id name sex
01 checkup 999
02 infection 888 Zhang Wei M
PostgreSQLでクエリ性能を改善する

落とし穴の改善例

 

SELECT *
FROM appointments a
INNER JOIN patients p
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M

 

SELECT *
FROM appointments a
INNER JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
PostgreSQLでクエリ性能を改善する

Passons à la pratique !

PostgreSQLでクエリ性能を改善する

Preparing Video For Download...