SlideShare a Scribd company logo
SQLアンチパターンNight
ライトニングトーク
株式会社ヴァル研究所
板橋正之
2015/04/10
自己紹介
■名前
板橋 正之
(いたばし まさゆき)
■所属
株式会社ヴァル研究所
JAWS-UG中央線
■仕事
自社広告配信サーバの開発、運用
■好きなRDBMS
Oracle Database
itabashi.masayuki
今日はSQLアンチパターンNightということ
で
失敗談を持ってきました。
今から5年ぐらい前の案件です。
13時間程度で終了すると思った
3,500万件弱のデータ洗い替え作業が
5日以上掛かった
失敗談
某システムの会員情報のID変更
案件
テーブルイメージ
単純にUPDATE文の羅列で
古い会員コードを
一旦テンポラリコードに編集して
その後、新しい会員コードに振り直す。
やったこと
会員コードは主キーの一部で
インデックスが設定されているので
更新時にはインデックス書き換えの
オーバーヘッドを減らすため
インデックスを解除した。
検討事項
更新が多くなる分、UNDO表領域、REDOロ
グファイルを作成されることも予想される
ため、ディスクを節約したかった。
検討事項
• テスト環境でサンプルのテーブルを使ってインデックスあり、なしの時間を
計測して、処理時間を見積もりました。
•テーブルA:448,251件
•テーブルB:561,018件
• アーカイブREDOログによるディスク使用量もテーブルAが
1,062MB/556MB、テーブルBが1,821MB/607MBと計測しました。
• 上記の結果からインデックスなしの方が明らかに処理時間が短いことから、
インデックスなしで処理を行なう方がよいと判断しました。
処理時間見積り
操作内容 時間 合計
インデックスあり
テンポラリ会員コード更新 0:06:48
0:18:37
新会員コード更新 0:11:49
インデックスなし
インデックス無効&テンポラリ会員コード更新 0:01:09
0:09:23新会員コード更新 0:07:20
インデックス再作成 0:00:54
操作内容 時間 合計
インデックスあり
テンポラリ会員コード更新 0:09:24
0:33:28
新会員コード更新 0:24:04
インデックスなし
インデックス無効&テンポラリ会員コード更新 0:01:15
0:09:05新会員コード更新 0:06:48
インデックス再作成 0:01:02
• 更新対象データが34,971,205件
• 検証データが448,251件で10分弱
• 34,971,205÷448,251×10≒780分
=13時間
大間違い
サンプリングが少ない。
• 2テーブル程度のデータで信頼性のある
値がだせるのか?
• 見積もりを行なったテーブルは、比較的
データ件数が近い。
データ件数と処理時間の相関
関係を見出していない。
本番サーバの方が性能いい?
(当時でも)
もう5年前のサーバだよ?
思い込みと楽観視
まず、テンポラリ会員コードへの更新
テーブル データ件数 更新(秒) 更新(分) 1万件当たりの秒数
会員マスタ 69,322 3.063 0.1 0.4419
会員所属マスタ 61,543 14.047 0.2 2.2825
受付テーブル 159,330 26.454 0.4 1.6603
予約テーブル 159,330 16.313 0.3 1.0239
ヘッダーテーブル 159,330 13.125 0.2 0.8238
コーステーブル 159,330 73.75 1.2 4.6288
明細テーブルA 8,564,614 609.703 10.2 0.7119
明細テーブルB 454,350 23.204 0.4 0.5107
明細テーブルC 17,845,016 1721.546 28.7 0.9647
明細テーブルD 2,668,722 179.672 3.0 0.6733
明細テーブルE 1,193,156 249.61 4.2 2.0920
明細パラメータテーブル 159,329 46.453 0.8 2.9155
明細付加情報テーブル 360,250 33.515 0.6 0.9303
印刷集計管理テーブル 335,480 68.75 1.1 2.0493
印刷履歴テーブル 1,545,991 599.188 10.0 3.8757
ワークフロー履歴テーブル 910,836 188.672 3.1 2.0714
ワークフロー制御テーブル 1,285,598 826.844 13.8 6.4315
洗い替え開始
SQL> SET TRANSACTION READ WRITE;
SQL> UPDATE 会員マスタ
SQL> SET会員コード = ‘X’ || 会員コード;
SQL> COMMIT;
すでに更新秒数に
バラツキがっ!
続いて新しい会員コードへの更新
洗い替え開始
SQL> SET TRANSACTION READ WRITE;
SQL> UPDATE 会員マスタ
SQL> SET 会員コード = ‘2157’
SQL> WHERE (会員コード = ‘X1356’);
SQL> UPDATE 会員マスタ
SQL> SET 会員コード = ‘3952’
SQL> WHERE (会員コード = ‘X65165’);
SQL> UPDATE 会員マスタ
SQL> SET 会員コード = ‘4510’
SQL> WHERE (会員コード = ‘X2157’);
SQL> ・・・
SQL> COMMIT;
続いて新しい会員コードへの更新
洗い替え開始
SQL> SET TRANSACTION READ WRITE;
SQL> UPDATE 会員マスタ
SQL> SET 会員コード = ‘2157’
SQL> WHERE (会員コード = ‘X1356’);
SQL> UPDATE 会員マスタ
SQL> SET 会員コード = ‘3952’
SQL> WHERE (会員コード = ‘X65165’);
SQL> UPDATE 会員マスタ
SQL> SET 会員コード = ‘4510’
SQL> WHERE (会員コード = ‘X2157’);
SQL> ・・・
SQL> COMMIT;
テーブル データ件数 更新(分) 1万件当たりの秒数
会員マスタ 69,322 約7分 60.5868
会員所属マスタ 61,543 約10分 97.4928
受付テーブル 159,330 約64分 241.0092
予約テーブル 159,330 約140分 527.2077
ヘッダーテーブル 159,330 約60分 225.9461
コーステーブル 159,330 約65分 244.7750
明細テーブルA 8,564,614
明細テーブルB 454,350
明細テーブルC 17,845,016
明細テーブルD 2,668,722
明細テーブルE 1,193,156
明細パラメータテーブル 159,329 約96分 361.5161
明細付加情報テーブル 360,250 約900分 1498.9590
印刷集計管理テーブル 335,480 約70分 125.1938
印刷履歴テーブル 1,545,991
ワークフロー履歴テーブル 910,836
ワークフロー制御テーブル 1,285,598
• 金曜の夜にテンポラリ会員コードへの更新を
行って、土日で新会員コードへの洗い替えを
やっていて日曜日の23:00くらいにこんな感じ
でしたね。
• 直後にお詫びのメールを送って翌日朝一でお
詫びの電話しました。
• この時点で更新のオーバーヘッドより、更新
対象検索のオーバーヘッドが大きいと判断し
て、いくつかのサンプリングで確認した結果、
無効にしていたインデックスを有効にして更
新を行なうこととしました。
• 土日で終了しなかったので月曜日は当該年
度のデータのみを更新、この時点でインデッ
クスを復活。当然、この日はサービス停止。
テーブル データ件数 更新(分) 1万件当たりの秒数
会員マスタ 69,322 約7分 60.5868
会員所属マスタ 61,543 約10分 97.4928
受付テーブル 159,330 約64分 241.0092
予約テーブル 159,330 約140分 527.2077
ヘッダーテーブル 159,330 約60分 225.9461
コーステーブル 159,330 約65分 244.7750
明細テーブルA 854,569 20分46秒 14.5805
明細テーブルB 44,081 約90分 1225.0176
明細テーブルC 1,770,240 36分6秒 12.2356
明細テーブルD 360,356 約910分 1515.1683
明細テーブルE 162,150 約47分 173.9130
明細パラメータテーブル 159,329 約96分 361.5161
明細付加情報テーブル 360,250 約900分 1498.9590
印刷集計管理テーブル 335,480 約70分 125.1938
印刷履歴テーブル 124,474 約38分 183.1708
ワークフロー履歴テーブル 157,888 約92分 349.6149
ワークフロー制御テーブル 131,976 約48分 218.2215
テーブル データ件数 更新(分) 1万件当たりの秒数
会員マスタ 69,322 約7分 60.5868
会員所属マスタ 61,543 約10分 97.4928
受付テーブル 159,330 約64分 241.0092
予約テーブル 159,330 約140分 527.2077
ヘッダーテーブル 159,330 約60分 225.9461
コーステーブル 159,330 約65分 244.7750
明細テーブルA
854,569
7,710,045
20分46秒
3時間28分56秒
14.5805
16.2593
明細テーブルB
44,081
410,269
約90分
1時間39分14秒
1225.0176
145.1242
明細テーブルC
1,770,240
16,074,776
36分6秒
5時間22分29秒
12.2356
12.0368
明細テーブルD
360,356
2,308,366
約910分
1時間20分3秒
1515.1683
20.8069
明細テーブルE
162,150
1,031,006
約47分
1時間27分13秒
173.9130
50.7562
明細パラメータテーブル 159,329 約96分 361.5161
明細付加情報テーブル 360,250 約900分 1498.9590
印刷集計管理テーブル 335,480 約70分 125.1938
印刷履歴テーブル
124,474
1,421,517
約38分
26時間20分5秒
183.1708
666.9283
ワークフロー履歴テーブル
157,888
752,948
約92分
11時間20分43秒
349.6149
542.4412
ワークフロー制御テーブル
131,976
1,153,622
約48分
20時間10分21秒
218.2215
629.5043
残りも更新
原因は?
エクステントの分断化?
インデックスの更新にはオーバーヘッドが
かかるという思い込み
ある件数を超えるとインデックス更新の
オーバーヘッドより全表検索のオーバー
ヘッドが大きくなる
全表検索+データ更新 < インデックス検索+データ更新+インデックス更新
全表検索+データ更新 > インデックス検索+データ更新+インデックス更新
インデックスの構造
年次単位での参照が多いため
年月日、会員コードの順番で
複合インデックスが作られていた
• 余計なアクセスパスが多い
• 一部のテーブルは年月日と会員IDの順
番が逆でインデックスが生成されていて
おり、実際そちらの方がパフォーマンス
がよかった。
• 正確にいうとマルチテナントのシステム
だったので年月日の上にさらにコードが
あった。
UPDATE文1行1行流すんじゃなくて
変換テーブルとのJOINで更新するような
UPDATE文で更新する方法も
あったんじゃないかと。
(先にあげた原因を解決するのはもちろんとして)
今後の反省として
自然キーもいいけど疑似キーもね
最近だったらクラウド環境で
停止時間を最小限に
• 例えば別のインスタンスをスナップショット等
から作成して、そちらを更新後に差分を適用
するなど。
• 見積もりも本番と同じ環境でできるし。
• 昔と違ってDBのコピーを(お金はかかります
が)ポコポコ立てられる時代になったので。
以上、
ご清聴ありがとうございました。

More Related Content

What's hot

Oracle常駐接続プーリング(DRCP)を導入した話
Oracle常駐接続プーリング(DRCP)を導入した話Oracle常駐接続プーリング(DRCP)を導入した話
Oracle常駐接続プーリング(DRCP)を導入した話
Kentaro Kitagawa
 
Sql azure知ってますか?改訂版
Sql azure知ってますか?改訂版Sql azure知ってますか?改訂版
Sql azure知ってますか?改訂版Oda Shinsuke
 
Azure sql database 入門 2014年10月版
Azure sql database 入門 2014年10月版Azure sql database 入門 2014年10月版
Azure sql database 入門 2014年10月版
貴仁 大和屋
 
Azure SQLデータベース最新動向&TIPS
Azure SQLデータベース最新動向&TIPSAzure SQLデータベース最新動向&TIPS
Azure SQLデータベース最新動向&TIPS
nishioka1
 
Devsの常識、DBAは非常識
Devsの常識、DBAは非常識Devsの常識、DBAは非常識
Devsの常識、DBAは非常識
yoku0825
 
[C21] MySQL Cluster徹底活用術 by Mikiya Okuno
[C21] MySQL Cluster徹底活用術 by Mikiya Okuno[C21] MySQL Cluster徹底活用術 by Mikiya Okuno
[C21] MySQL Cluster徹底活用術 by Mikiya OkunoInsight Technology, Inc.
 
Sql database 基本構成と直近で追加されていた機能の紹介
Sql database 基本構成と直近で追加されていた機能の紹介Sql database 基本構成と直近で追加されていた機能の紹介
Sql database 基本構成と直近で追加されていた機能の紹介Masayuki Ozawa
 
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料20170329 D3 DBAが夜間メンテをしなくなった日 発表資料
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料
dcubeio
 
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみようSql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみようMasayuki Ozawa
 
[C14] ソーシャル ゲーム基盤を支える SQL Server by Takashi Inaba
[C14] ソーシャル ゲーム基盤を支える SQL Server by Takashi Inaba[C14] ソーシャル ゲーム基盤を支える SQL Server by Takashi Inaba
[C14] ソーシャル ゲーム基盤を支える SQL Server by Takashi InabaInsight Technology, Inc.
 
Data consistency 入門 data partitioning ガイダンス
Data consistency 入門 data partitioning ガイダンスData consistency 入門 data partitioning ガイダンス
Data consistency 入門 data partitioning ガイダンスMasayuki Ozawa
 
MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報
MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報
MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報
yoyamasaki
 
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
Mikiya Okuno
 
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
MySQl 5.6新機能解説@第一回 中国地方DB勉強会MySQl 5.6新機能解説@第一回 中国地方DB勉強会
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
Mikiya Okuno
 
Sql database のご紹介
Sql database のご紹介Sql database のご紹介
Sql database のご紹介
Oda Shinsuke
 
Dat004 開発者に捧ぐ「sql server_2016_
Dat004 開発者に捧ぐ「sql server_2016_Dat004 開発者に捧ぐ「sql server_2016_
Dat004 開発者に捧ぐ「sql server_2016_
Tech Summit 2016
 
お金が無いときのMySQL Cluster頼み
お金が無いときのMySQL Cluster頼みお金が無いときのMySQL Cluster頼み
お金が無いときのMySQL Cluster頼み
aoike
 
MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)
Shinya Sugiyama
 

What's hot (18)

Oracle常駐接続プーリング(DRCP)を導入した話
Oracle常駐接続プーリング(DRCP)を導入した話Oracle常駐接続プーリング(DRCP)を導入した話
Oracle常駐接続プーリング(DRCP)を導入した話
 
Sql azure知ってますか?改訂版
Sql azure知ってますか?改訂版Sql azure知ってますか?改訂版
Sql azure知ってますか?改訂版
 
Azure sql database 入門 2014年10月版
Azure sql database 入門 2014年10月版Azure sql database 入門 2014年10月版
Azure sql database 入門 2014年10月版
 
Azure SQLデータベース最新動向&TIPS
Azure SQLデータベース最新動向&TIPSAzure SQLデータベース最新動向&TIPS
Azure SQLデータベース最新動向&TIPS
 
Devsの常識、DBAは非常識
Devsの常識、DBAは非常識Devsの常識、DBAは非常識
Devsの常識、DBAは非常識
 
[C21] MySQL Cluster徹底活用術 by Mikiya Okuno
[C21] MySQL Cluster徹底活用術 by Mikiya Okuno[C21] MySQL Cluster徹底活用術 by Mikiya Okuno
[C21] MySQL Cluster徹底活用術 by Mikiya Okuno
 
Sql database 基本構成と直近で追加されていた機能の紹介
Sql database 基本構成と直近で追加されていた機能の紹介Sql database 基本構成と直近で追加されていた機能の紹介
Sql database 基本構成と直近で追加されていた機能の紹介
 
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料20170329 D3 DBAが夜間メンテをしなくなった日 発表資料
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料
 
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみようSql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
 
[C14] ソーシャル ゲーム基盤を支える SQL Server by Takashi Inaba
[C14] ソーシャル ゲーム基盤を支える SQL Server by Takashi Inaba[C14] ソーシャル ゲーム基盤を支える SQL Server by Takashi Inaba
[C14] ソーシャル ゲーム基盤を支える SQL Server by Takashi Inaba
 
Data consistency 入門 data partitioning ガイダンス
Data consistency 入門 data partitioning ガイダンスData consistency 入門 data partitioning ガイダンス
Data consistency 入門 data partitioning ガイダンス
 
MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報
MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報
MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報
 
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
 
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
MySQl 5.6新機能解説@第一回 中国地方DB勉強会MySQl 5.6新機能解説@第一回 中国地方DB勉強会
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
 
Sql database のご紹介
Sql database のご紹介Sql database のご紹介
Sql database のご紹介
 
Dat004 開発者に捧ぐ「sql server_2016_
Dat004 開発者に捧ぐ「sql server_2016_Dat004 開発者に捧ぐ「sql server_2016_
Dat004 開発者に捧ぐ「sql server_2016_
 
お金が無いときのMySQL Cluster頼み
お金が無いときのMySQL Cluster頼みお金が無いときのMySQL Cluster頼み
お金が無いときのMySQL Cluster頼み
 
MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)
 

Viewers also liked

SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
ke-m kamekoopa
 
アジャイルサムライ 5章「具現化させる」
アジャイルサムライ 5章「具現化させる」アジャイルサムライ 5章「具現化させる」
アジャイルサムライ 5章「具現化させる」
makopi 23
 
SQLアンチパターン読書会 09章 ラウンディングエラー
SQLアンチパターン読書会 09章 ラウンディングエラーSQLアンチパターン読書会 09章 ラウンディングエラー
SQLアンチパターン読書会 09章 ラウンディングエラー
Yosuke Nakazawa
 
SQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメSQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメNorito Agetsuma
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
kwatch
 
HerokuではじめるRailsプログラミング入門 6-3節「複数モデルの連携」
HerokuではじめるRailsプログラミング入門  6-3節「複数モデルの連携」HerokuではじめるRailsプログラミング入門  6-3節「複数モデルの連携」
HerokuではじめるRailsプログラミング入門 6-3節「複数モデルの連携」
makopi 23
 
SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン読書会 「スパゲッティクエリ」SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン読書会 「スパゲッティクエリ」
makopi 23
 
エンジニアのブログ書きの
心技体
エンジニアのブログ書きの
心技体エンジニアのブログ書きの
心技体
エンジニアのブログ書きの
心技体
Kenji Tanaka
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
SQLアンチパターンNight
SQLアンチパターンNightSQLアンチパターンNight
SQLアンチパターンNight
Hironori Miura
 
SQLアンチパターン「ディプロマティック・イミュニティ」
SQLアンチパターン「ディプロマティック・イミュニティ」SQLアンチパターン「ディプロマティック・イミュニティ」
SQLアンチパターン「ディプロマティック・イミュニティ」
Hiroyuki Ohnaka
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
yoku0825
 

Viewers also liked (12)

SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
 
アジャイルサムライ 5章「具現化させる」
アジャイルサムライ 5章「具現化させる」アジャイルサムライ 5章「具現化させる」
アジャイルサムライ 5章「具現化させる」
 
SQLアンチパターン読書会 09章 ラウンディングエラー
SQLアンチパターン読書会 09章 ラウンディングエラーSQLアンチパターン読書会 09章 ラウンディングエラー
SQLアンチパターン読書会 09章 ラウンディングエラー
 
SQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメSQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメ
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
HerokuではじめるRailsプログラミング入門 6-3節「複数モデルの連携」
HerokuではじめるRailsプログラミング入門  6-3節「複数モデルの連携」HerokuではじめるRailsプログラミング入門  6-3節「複数モデルの連携」
HerokuではじめるRailsプログラミング入門 6-3節「複数モデルの連携」
 
SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン読書会 「スパゲッティクエリ」SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン読書会 「スパゲッティクエリ」
 
エンジニアのブログ書きの
心技体
エンジニアのブログ書きの
心技体エンジニアのブログ書きの
心技体
エンジニアのブログ書きの
心技体
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
SQLアンチパターンNight
SQLアンチパターンNightSQLアンチパターンNight
SQLアンチパターンNight
 
SQLアンチパターン「ディプロマティック・イミュニティ」
SQLアンチパターン「ディプロマティック・イミュニティ」SQLアンチパターン「ディプロマティック・イミュニティ」
SQLアンチパターン「ディプロマティック・イミュニティ」
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
 

Similar to SQLアンチパターンNight ライトニングトーク

Sql database のご紹介
Sql database のご紹介Sql database のご紹介
Sql database のご紹介
Oda Shinsuke
 
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...
Insight Technology, Inc.
 
簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪
Yohei Azekatsu
 
Windows Azure BootCamp - SQL Azure
Windows Azure BootCamp - SQL AzureWindows Azure BootCamp - SQL Azure
Windows Azure BootCamp - SQL Azure
貴仁 大和屋
 
[INSIGHT OUT 2011] A24 sql server wait events(mario broodbakker)
[INSIGHT OUT 2011] A24 sql server wait events(mario broodbakker)[INSIGHT OUT 2011] A24 sql server wait events(mario broodbakker)
[INSIGHT OUT 2011] A24 sql server wait events(mario broodbakker)Insight Technology, Inc.
 
CircleCIで悩んだことピックアップ
CircleCIで悩んだことピックアップCircleCIで悩んだことピックアップ
CircleCIで悩んだことピックアップ
Takeo Saga
 
MySQL Technology Cafe #12 MDS HA検証 ~パラメータからパフォーマンスまで~
MySQL Technology Cafe #12 MDS HA検証 ~パラメータからパフォーマンスまで~MySQL Technology Cafe #12 MDS HA検証 ~パラメータからパフォーマンスまで~
MySQL Technology Cafe #12 MDS HA検証 ~パラメータからパフォーマンスまで~
オラクルエンジニア通信
 
[Japan Tech summit 2017] DAL 003
[Japan Tech summit 2017] DAL 003[Japan Tech summit 2017] DAL 003
[Japan Tech summit 2017] DAL 003
Microsoft Tech Summit 2017
 
Aws summits2014 ガンホー・オンライン・エンターテイメント_スマホゲームを支えるインフラ運用
Aws summits2014 ガンホー・オンライン・エンターテイメント_スマホゲームを支えるインフラ運用Aws summits2014 ガンホー・オンライン・エンターテイメント_スマホゲームを支えるインフラ運用
Aws summits2014 ガンホー・オンライン・エンターテイメント_スマホゲームを支えるインフラ運用Boss4434
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニングKensuke Nagae
 
Seas で語られたこととは?
Seas で語られたこととは?Seas で語られたこととは?
Seas で語られたこととは?Masayuki Ozawa
 
Light switch × sql azure
Light switch × sql azureLight switch × sql azure
Light switch × sql azure
貴仁 大和屋
 
新入社員向けIT研修サービス|ウズカレBiz
新入社員向けIT研修サービス|ウズカレBiz新入社員向けIT研修サービス|ウズカレBiz
新入社員向けIT研修サービス|ウズカレBiz
翔太郎 川畑
 
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
Michitoshi Yoshida
 
実践!DBベンチマークツールの使い方
実践!DBベンチマークツールの使い方実践!DBベンチマークツールの使い方
実践!DBベンチマークツールの使い方
Fujishiro Takuya
 
MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003
Shinya Sugiyama
 
MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料
MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料
MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料
yoyamasaki
 
Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517akirahiguchi
 
Azure Antenna はじめての Azure Data Lake
Azure Antenna はじめての Azure Data LakeAzure Antenna はじめての Azure Data Lake
Azure Antenna はじめての Azure Data Lake
Hideo Takagi
 
[LT] T sql の parse と generator
[LT] T sql の parse と generator[LT] T sql の parse と generator
[LT] T sql の parse と generator
Oda Shinsuke
 

Similar to SQLアンチパターンNight ライトニングトーク (20)

Sql database のご紹介
Sql database のご紹介Sql database のご紹介
Sql database のご紹介
 
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...
 
簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪
 
Windows Azure BootCamp - SQL Azure
Windows Azure BootCamp - SQL AzureWindows Azure BootCamp - SQL Azure
Windows Azure BootCamp - SQL Azure
 
[INSIGHT OUT 2011] A24 sql server wait events(mario broodbakker)
[INSIGHT OUT 2011] A24 sql server wait events(mario broodbakker)[INSIGHT OUT 2011] A24 sql server wait events(mario broodbakker)
[INSIGHT OUT 2011] A24 sql server wait events(mario broodbakker)
 
CircleCIで悩んだことピックアップ
CircleCIで悩んだことピックアップCircleCIで悩んだことピックアップ
CircleCIで悩んだことピックアップ
 
MySQL Technology Cafe #12 MDS HA検証 ~パラメータからパフォーマンスまで~
MySQL Technology Cafe #12 MDS HA検証 ~パラメータからパフォーマンスまで~MySQL Technology Cafe #12 MDS HA検証 ~パラメータからパフォーマンスまで~
MySQL Technology Cafe #12 MDS HA検証 ~パラメータからパフォーマンスまで~
 
[Japan Tech summit 2017] DAL 003
[Japan Tech summit 2017] DAL 003[Japan Tech summit 2017] DAL 003
[Japan Tech summit 2017] DAL 003
 
Aws summits2014 ガンホー・オンライン・エンターテイメント_スマホゲームを支えるインフラ運用
Aws summits2014 ガンホー・オンライン・エンターテイメント_スマホゲームを支えるインフラ運用Aws summits2014 ガンホー・オンライン・エンターテイメント_スマホゲームを支えるインフラ運用
Aws summits2014 ガンホー・オンライン・エンターテイメント_スマホゲームを支えるインフラ運用
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
Seas で語られたこととは?
Seas で語られたこととは?Seas で語られたこととは?
Seas で語られたこととは?
 
Light switch × sql azure
Light switch × sql azureLight switch × sql azure
Light switch × sql azure
 
新入社員向けIT研修サービス|ウズカレBiz
新入社員向けIT研修サービス|ウズカレBiz新入社員向けIT研修サービス|ウズカレBiz
新入社員向けIT研修サービス|ウズカレBiz
 
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
 
実践!DBベンチマークツールの使い方
実践!DBベンチマークツールの使い方実践!DBベンチマークツールの使い方
実践!DBベンチマークツールの使い方
 
MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003
 
MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料
MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料
MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料
 
Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517
 
Azure Antenna はじめての Azure Data Lake
Azure Antenna はじめての Azure Data LakeAzure Antenna はじめての Azure Data Lake
Azure Antenna はじめての Azure Data Lake
 
[LT] T sql の parse と generator
[LT] T sql の parse と generator[LT] T sql の parse と generator
[LT] T sql の parse と generator
 

SQLアンチパターンNight ライトニングトーク

Editor's Notes

  1. テーブルは会員マスタがあって、それに対して各種情報を持ったトランザクションデータが紐付いているようなイメージ これはオフレコで。某健保の健診データを管理するシステムで、会員の情報があって、健診をいつ受けるといった予約の情報や検査の結果値、所見、問診また結果のコメントなどを管理する感じです。
  2. 一旦テンポラリIDにするのは古い会員IDと同じ番号を新しい会員IDでも使用されることがあるため。 やったのは単純にIDの先頭にXの文字を追加
  3. 2テーブル程度のデータで信頼性のある値がだせるのか?
  4. 45万件の更新が7分半、56万件の更新が6分半と逆転しているのに誤差程度と思い込んで見過ごしている。
  5. 5年前のサーバ
  6. そんな状態のまま作業を開始しました。
  7. インデックスだけではなく外部キーやトリガーも解除してます。 この時点で更新秒数にばらつきがあります。
  8. 金曜の夜にテンポラリ会員コードへの更新を行って、土日で新会員コードへの洗い替えをやっていて日曜日の23:00くらいにこんな感じでしたね。 お詫びのメールを送って朝一でお詫びの電話しました。 この時点で更新のオーバーヘッドより、更新対象検索のオーバーヘッドが大きいと判断して、いくつかのサンプリングで確認した結果、無効にしていたインデックスを有効にして更新を行なうこととしました。
  9. なんとか当該年度のデータは17:00過ぎに更新は完了しました。
  10. 件のシステムではどのテーブルの平均データ長が8KB以下なので、行データがデータブロックを跨っていることはなかったかと思います。
  11. インデックスを無効にしたことにより、新H-KEYの更新の際に対象データを検索するために毎回全表検索が発生していた。 (思い込みと楽観的な)見積もりによりインデックス更新よりも全表検索の方がオーバーヘッドが小さいものと考えていたので覚悟はしていましたが、ある件数を超えるとインデックス更新のオーバーヘッドより全表検索のオーバヘッドの方が大きくなる部分がありました。環境によっても違うと思いますが10万件が目安ですかね。
  12. インデックスを有効にしても、レスポンスが挙がらなかったテーブルについてはインデックスの構造に原因があると考えています。
  13. 先にあげた原因を解決するのはもちろんとして
  14. 例えば別のインスタンスをスナップショット等から作成して、そちらを更新後に差分を適用するなど。