質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2383閲覧

[SQL]性能をどこまで意識し、どのような施策を行っていますか?

ARADDIO

総合スコア160

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

4グッド

2クリップ

投稿2016/06/14 02:15

お世話になります。

以前とある現場で、帳票を出力するのに30分以上かかるという障害があました。
(Oracle Database 11g)
原因はデータ取得部のSQLだったので、開発元に問い合わせてみたところ開発環境では数秒で出力されるとのこと。
調査を進めていったところ結合順序がデータが大量にあるテーブル→マスタの順になっていたため、
実環境では性能がガタ落ちしていました。

HINT句で結合順序を入れ替えたところ、帳票出力が30分→3秒に改善しました。

開発環境ではそこまでのデータ量がないため、再現しなかったということのようです。


昔話が長くなってしまいましたが、
最近、実際に開発を行うときには、

  • 実環境のデータがどの程度の量なのか?
  • どの程度の性能が要求されるのか?(性能指標が示されている場合除く)
  • 日々何件程度のレコードが挿入/更新され、保持期間はどのくらいなのか?

等の情報が不明なまま開発を行うこともありました。
先に示した前例から、テーブルのアクセス順には気を使うようになりましたが、

実環境と開発環境のデータ差異による性能低下に対して
どのように製造Pで対応していけばよいか、悩んでいます。

みなさんがSQL作成する際、性能面で意識していることがあれば教えていただきたいです。
製造Pだけでなく、テストPで実施していること(データ構造、データ量・・・)でも歓迎です。

よろしくおねがいします。

stereo_code, KiyoshiMotoki, maisumakun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

本番環境でのデータ量(将来的なものも含めた量)を想定しないと、性能要件が定義できない=設計できないor責任分界点が明らかにならないとなってしまいます。
(下手するとRDBMSでは対応出来ない量のデータの場合もありますし)

ので、基本的には設計時に対応できるデータ量を定義し、その範囲で性能テストも実施します。
これは開発/見積もりを担当する専門家として発注者に対して必ず確認しなければならない義務だと考えます。

もしこれが出来ないような環境(発注元が定義出来ない・しないもしくは期限的な問題等)の場合は、
契約上、性能要件が納品条件に含まれないようにリスクヘッジをしたうえで、
一般的なケースよりかなり多めのケースを想定してそれに合わせて見積もりをすることでリスクを回避するかなと思います。

発注者が専門家(相応のリスクとリターンを負っている)なら、「条件に無かったので知りません」ですね。

投稿2016/06/14 04:19

編集2016/06/14 04:24
tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ARADDIO

2016/06/15 06:22

おっしゃる通りと思います。 >発注者が専門家(相応のリスクとリターンを負っている)なら、「条件に無かったので知りません」ですね。 割り切りも手ですね。 回答ありがとうございました。
guest

0

ベストアンサー

難しい問題ですねえ。
他の方がいわれているように、キャッチアップできればいいのですが、
そうはいかない場合もあるのでどうしようかな、と。

たぶん、地道に情報を集めるしかないのかなあって気がします。
DBMSによってもその特徴は変わってきますし、
バージョンの違いで影響がでることもありますね。

自分が以前経験したことだと、Oracleがバージョンアップされたら
性能が急に落ちた。原因はストアドプロシージャを使ってると
最適化がされない? ので生SQLに変更したこともありました。

気を付けるとしたら、なにかが起こったら変更がなるべく
容易になるような設計を心がけるくらいでしょうか。
性能試験は本番に近いところでやればいい
くらいに割り切るのも必要な時があるかもしれません。(^_^;

投稿2016/06/14 23:07

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ARADDIO

2016/06/15 06:29

>キャッチアップできればいいのですが、 >そうはいかない場合もあるのでどうしようかな、と。 >たぶん、地道に情報を集めるしかないのかなあって気がします。 やはり、きちんと情報収集しなければなりませんね。 >自分が以前経験したことだと、Oracleがバージョンアップされたら >性能が急に落ちた。原因はストアドプロシージャを使ってると >最適化がされない? ので生SQLに変更したこともありました。 こんなこともあるんですね。。。実例参考になります。 >気を付けるとしたら、なにかが起こったら変更がなるべく >容易になるような設計を心がけるくらいでしょうか。 >性能試験は本番に近いところでやればいい >くらいに割り切るのも必要な時があるかもしれません。(^_^; なるほど、ある意味、それが本番環境での試験の役割という考えもできますね。 回答ありがとうございました。
guest

0

方式設計できちんとサイジングしているでしょうか?
定期的にテーブル毎のレコード件数や容量を取得して想定以上であれば、ストレージの枯渇の対応が必要です。
統計情報も定期的に取得する必要があります。Diagnostic Packageを買っていれば、AWR Reportでパフォーマンスの悪いSQLを監視、、、などと運用するDBAの仕事は少なくないです。

PL/SQL

1-- count_tables.sql テーブル毎のレコード件数取得 2ALTER SESSION ENABLE PARALLEL DML ; 3SET PAGESIZE 50000 4SET SERVEROUTPUT ON SIZE UNLIMITED FORMAT WRAPPED 5SET TRIMSPOOL ON 6DECLARE 7 CURSOR CUR_TA 8 IS 9 SELECT TA.TABLE_NAME 10 , 'SELECT /*+ INDEX_FFS(TA) PARALLEL(DEFAULT) */ COUNT(*) INTO :L_COUNTS FROM ' || TA.TABLE_NAME || ' TA' AS SQL_STRING 11 FROM USER_TABLES TA 12 WHERE TA.DROPPED = 'NO' -- except trash box, since Oracle10.1.0 13 ORDER BY TA.TABLE_NAME ; 14 L_COUNTS NUMBER ; 15BEGIN 16 FOR REC_TA IN CUR_TA LOOP 17 EXECUTE IMMEDIATE REC_TA.SQL_STRING INTO L_COUNTS ; 18 DBMS_OUTPUT.PUT_LINE(RPAD(REC_TA.TABLE_NAME, 31) || TO_CHAR(L_COUNTS, '999,999,999,990')) ; 19 END LOOP ; 20END ; 21/

投稿2016/06/14 22:49

編集2019/01/16 22:30
Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ARADDIO

2016/06/15 06:22

回答ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問