あなたが書くSQLと実行されるSQLは違う

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

Amy McCarty

Instructor

代数の演算順序

 

  • 字面どおり(書いたとおり)
  • 論理順(実行順)

 

PEMDAS BODMAS
括弧 (Parentheses) 角括弧 (Brackets)
べき乗 (Exponents) 順序 (Order)
乗算/除算 除算/乗算
加算/減算 加算/減算
PostgreSQLでクエリ性能を改善する

演算順序の適用

 

字面どおり:

$$ x = 2 + (8 + 4) \div 2 $$

$$ x = 10 + 4) \div 2 $$

$$ x = 14 \div 2 $$

$$ x = 7 $$

 

論理順:

$$ x = 2 + (8 + 4) \div 2 $$

$$ x = 2 + \frac{12}{2} $$

$$ x = 2 + 6 $$

$$ x = 8 $$

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

SQL の論理的な実行順序

順序 目的
1 FROM 参照するテーブル(JOINがあれば複数)を指定
2 WHERE レコードを絞り込み
3 GROUP BY レコードを分類
4 SUM(), COUNT() など 集計
5 SELECT 返す列を指定
SELECT COUNT(*) FROM tableA WHERE col1 = 77
PostgreSQLでクエリ性能を改善する

GROUP BY と集計

event_location storm elements days
Russia blizzard water 1
Argentina tornado water 1
Argentina tornado wind 1
Australia tornado wind 1
Kuwait haboob wind 2
USA haboob wind 2
SELECT elements, storm, COUNT(*)
FROM weather_events
GROUP BY elements

 

出力なし - 
コードでエラーが発生しました

列 "storm" は、
GROUP BY 句に含めるか、
集計関数を使う必要があります
PostgreSQLでクエリ性能を改善する

GROUP BY と集計の実行順序

SELECT elements, storm, COUNT(*)
FROM weather_events
GROUP BY elements
順序 SQL句 利用可能な列
1 FROM weather_events すべて
3 GROUP BY elements elements
4 COUNT elements
PostgreSQLでクエリ性能を改善する

GROUP BY は集計と一致させる

SELECT elements, storm, COUNT(*)
FROM weather_events
GROUP BY elements, storm
PostgreSQLでクエリ性能を改善する

GROUP BY は集計と一致させる

SELECT elements, storm, COUNT(*)
FROM weather_events
GROUP BY elements, storm

結果

elements storm count
water blizzard 1
water tornado 1
wind tornado 2
wind haboob 2
PostgreSQLでクエリ性能を改善する

SQL の論理的な実行順序(続き)

順序 目的
...
5 SELECT 返す列を指定
6 DISTINCT 重複を除去
7 ORDER BY 並べ替え
8 LIMIT 行を制限
PostgreSQLでクエリ性能を改善する

DISTINCT と LIMIT

row_no location storm elements days
1 Russia blizzard water 1
2 Argentina tornado water 1
3 Argentina tornado wind 1
4 Australia tornado wind 1
5 Kuwait haboob wind 2
6 USA haboob wind 2
SELECT DISTINCT storm, elements
FROM weather_events
ORDER BY storm LIMIT 3
PostgreSQLでクエリ性能を改善する
row_no location storm elements days
1 Russia blizzard water 1
2 Argentina tornado water 1
3 Argentina tornado wind 1
4 Australia tornado wind 1
5 Kuwait haboob wind 2
6 USA haboob wind 2
SELECT DISTINCT storm, elements
FROM weather_events 
ORDER BY storm LIMIT 3
PostgreSQLでクエリ性能を改善する
row_no location storm elements days
1 Russia blizzard water 1
2 Argentina tornado water 1
3 Argentina tornado wind 1
4 Australia tornado wind 1
5 Kuwait haboob wind 2
6 USA haboob wind 2
SELECT DISTINCT storm, elements
FROM weather_events 
ORDER BY storm LIMIT 3
順序 SQL句 利用可能な行
1 FROM weather_events すべて
PostgreSQLでクエリ性能を改善する
row_no storm elements
1 blizzard water
2 tornado water
3 tornado wind
5 haboob wind

 

 

SELECT DISTINCT storm, elements
FROM weather_events
ORDER BY storm LIMIT 3
順序 SQL句 利用可能な行
1 FROM weather_events すべて
5 SELECT storm, elements すべて
PostgreSQLでクエリ性能を改善する
row_no storm elements
1 blizzard water
2 tornado water
3 tornado wind
5 haboob wind

 

 

SELECT DISTINCT storm, elements
FROM weather_events
ORDER BY storm LIMIT 3
順序 SQL句 利用可能な行
1 FROM weather_events すべて
5 SELECT storm, elements すべて
6 DISTINCT 1, 2, 3, 5
PostgreSQLでクエリ性能を改善する
row_no storm elements
1 blizzard water
5 haboob wind
2 tornado water
3 tornado wind

 

 

SELECT DISTINCT storm, elements
FROM weather_events
ORDER BY storm LIMIT 3
順序 SQL句 利用可能な行
1 FROM weather_events すべて
5 SELECT storm, elements すべて
6 DISTINCT 1, 2, 3, 5
7 ORDER BY storm 1, 5, 2, 3
PostgreSQLでクエリ性能を改善する
row_no storm elements
1 blizzard water
5 haboob wind
2 tornado water

 

 

 

SELECT DISTINCT storm, elements
FROM weather_events
ORDER BY storm LIMIT 3
順序 SQL句 利用可能な行
1 FROM weather_events すべて
5 SELECT storm, elements すべて
6 DISTINCT 1, 2, 3, 5
7 ORDER BY storm 1, 5, 2, 3
8 LIMIT 3 1, 5, 2
PostgreSQLでクエリ性能を改善する
順序 目的 影響範囲
1 FROM 参照するテーブルを指定
2 WHERE レコードを絞り込み 行数
3 GROUP BY レコードを分類 列数
4 SUM, COUNT など 集計 行数
5 SELECT 返す列を指定 列数
6 DISTINCT 重複を除去 行数
7 ORDER BY 並べ替え
8 LIMIT 行を制限 行数
PostgreSQLでクエリ性能を改善する

練習しましょう!

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

Preparing Video For Download...