最近業務を通じてRDBについて色々勉強したのでその内容をまとめました。
どなたかの参考になりましたら、幸いです😌
Stored Procedureとは?
定義
データベースに保存される一連のSQLステートメントやロジックの集まりであり、名前を付けてデータベース内に保存され、アプリケーションから呼び出すことができるデータベースオブジェクトです。Stored Procedureは主にデータベース内での処理のカプセル化や再利用を可能にし、データベースアクセスの効率を向上させるのに役立ちます。
CREATE PROCEDURE procedure_name
@parameter1 data_type,
@parameter2 data_type,
...
AS
BEGIN
-- SQL ステートメントやロジックをここに記述
END;
そのメリットとデメリット
メリット:
- 再利用性:
プロシージャは同じロジックを何度も実行でき、データベース内で効果的な再利用が可能です。これにより、冗長なコードの繰り返しを防ぎ、保守性が向上します。 - ネットワークの削減:
プロシージャはデータベース内に保存されるため、アプリケーションとデータベースの間で実行されるSQLステートメントのネットワークトラフィックが削減されます。これにより、データの取得や処理の効率が向上します。 - アプリケーションとデータベースの分離:
プロシージャにより、データベースロジックがデータベース内に隔離されます。これにより、アプリケーションコードとデータベースロジックの分離が促進され、保守性が向上します。 - トランザクション管理:
プロシージャ内で複数のSQLステートメントが一連のトランザクションとして実行されるため、トランザクションの一貫性が確保されます。 - アクセス制御:
プロシージャにはアクセス権を設定でき、特定のユーザーやアプリケーションだけがプロシージャを実行できるようにできます。これにより、データベースのセキュリティが向上します。
デメリット:
- 学習コスト:
プロシージャの作成や管理にはSQLプログラミングの知識が必要であり、初学者にとって学習コストがかかることがあります。 - データベース依存性:
プロシージャがデータベースに依存しているため、データベースを変更する場合にはプロシージャも変更が必要となり、保守性に課題が生じることがあります。 - パフォーマンスの制約:
一部のデータベースシステムでは、プロシージャのパフォーマンスがクエリよりも低い場合があります。最適化が不足していると、実行計画の再生成が頻繁に行われ、オーバーヘッドが発生することがあります。 - 複雑性とメンテナンス:
大規模なプロシージャが複雑になると、理解やメンテナンスが難しくなります。コードが増えると、デバッグや変更が困難になることがあります。 - プラットフォームの依存性:
プロシージャがデータベースプラットフォームに依存しているため、異なるデータベースシステムで同じプロシージャを使用することが難しいことがあります。
所感
メリットとして感じているのは、再利用性です。演算項目設定機能など計算結果を保存する機能を実装する際にはその実行したりクエリをStoredProcudureにもたせることで煩雑なロジックにならず実行できます。ただ、デメリットは複数RDBを使う場合です。業務で保守・運用しているシステムだとSQLServerとPostgresの両方の顧客がいるので、顧客に合わせてDBの種類で条件分岐させて実行する際に条件分岐させるなどの対応が煩わしいなという印象です。
(そもそもそんな仕様のシステムにした人が悪い気もしますが、、笑)