SQLステートメントからロジックを移動するのは良い考えですか?


8

私はプロのソフトウェア開発者にとって非常に新しいと言って、この質問の前置きをします。

私は社内の他のグループからデータを受け取り、このデータをビジネスエグゼクティブが使用できるレポートに変換するチームで作業しています。

データの転送と解析の過程で、データの多くの処理を行ういくつかのSQLステートメントがあります。ほぼすべてのSELECT用途はTRIMSUBSTRCASTなど広範囲に適切なサイズや形式にフィールドを軽減します。さらに、CASESELECTのステートメントを使用することで説明される特別なケースがたくさんあります。

私たちが使用するTeradataサーバーソフトウェアは、非常にわかりにくいエラーメッセージを出力します。その結果、どのデータがどのSQLステートメントを壊しているかについて、多くの推測を行います。

私の質問は、これらのやや複雑なSQLステートメントを、処理と特殊なケースの処理を省略した、より複雑でない形式に減らし、代わりにこれを外部のスクリプトまたはプログラムで実行することは良い考えでしょうか?これは意味がありますか?

回答:


12

SQLから処理コードを移動することの大きな利点は、SQLの管理がはるかに簡単になることです。

欠点は、これらのクエリを他のプログラムで使用したい場合は、結果処理プロセスを他のプログラムで使用できるようにする必要があることです。必要なクラスを含むライブラリファイルをコピーするのと同じくらい簡単ですが、それでも、ライブラリへの変更はすべて反映され、すべてのクライアントが新しいライブラリで再構築される必要があることを意味します。

別のオプション:ほとんどのフォーマットコードを含めるために、ビュー(または、クライアントごとに異なるフォーマットの結果が必要な場合は複数のビュー)を使用しないのはなぜですか?これにより、必要に応じて、「生の」クエリ結果、または適切にフォーマットされたクエリ結果を取得できます。


3
+1は、フォーマットSQLをロジックSQLから分離できるようにするビューを提案します。

2
ビューの+1。間違いなく、私が検討する最初のソリューションです。
Matt S

6

このロジックにビューを使用することについてすでに提案されていることに同意します。Caseステートメントについてもう1つ追加したいと思います。SQLからCaseステートメントをプルすると、システムのパフォーマンスに大きな影響が出る可能性があることに注意してください。これらのCaseステートメントは、返されるデータの量を大幅に削減している可能性があります。SQLステートメントを使用してデータベースレイヤーでCaseフィルタリングを実行すると、通常、すべてのデータを元に戻し、外部スクリプトまたはプログラムでフィルタリングを実行するよりもはるかに効率的です。これを検討している場合は、そのソリューションに進む前に、データ分析とパフォーマンステストを行うことを強くお勧めします。


4

外部プロセスを追加すると、通常、システムのデバッグが難しくなりますが、状況によって異なります。 あなたの判断を使用してください。帯域外プロジェクトの開発/維持に必要な時間を考慮してください。

すでにETLプロセスを使用していますか?Teradataの経験はありませんが、ステップ分離することで、何が起こっているかをより明確に把握できます。2秒の概要は次のとおりです。

  1. 抽出:データをソースから引き出し、ステージ1の一時ストレージに配置します。データの形式は変更しないでください。
  2. 変換:ステージ1からプルし、ここで必要なすべてのケース/トリム/サブストリング/キャスト/フォーマットなどを実行します。それをステージ2の一時保管場所に置きます。
  3. ロード:ステージ2からプルし、すべてのデータをターゲットストレージに配置します。

これは通常、このタイプのシステムを正常に管理するのに十分な情報を提供します。


2
はい、ETLはまさに私たちがやっていることです。ただし、ほとんどの変換ステップがSQLで行われるETTTLTLTLに似ているようです。私の目標は、災害であるTeradata SQLよりも優れたエラー処理を備えた、より拡張可能な言語で変換ステップを記述することだと思います。
ブライアングレイザー

3

これらはsomone / thingが消費するデータを生成する実際のロジックに関連しているため、CASEビットはそのままにしておく傾向があります。したがって、これらを取り出すことは、より大きなデータセットを送り返す必要があり、クライアントはそれに対して何らかの処理を行う必要があることを意味します。これで、レポートの「ロジック」が2つの別々のレイヤーに分割されましたが、これは良くありません。

しかし、私はあなたのコードからフォーマットをホットブリックのようにドロップします(それが具体的にJOIN述語の一部である場合を除いてなど)。それはフォーマットが消費者の仕事だからです...なので、Excel、Crystalなど、どのようなレポートツールでも使用します。正しいロケールとすべてのジャズでのものをフォーマットするのが得意です。クライアントが得意なことを実行できるようにし(物事をきれいな色で表示する)、サーバーが最も得意とすること、つまりデータの処理にサーバーが集中できるようにします。


一部の環境では、データを使用するアプリケーションがサーバー自体でも実行されている場合があります。次に、書式設定やその他の変換を行う方がより効率的であることが問題になります。場合によっては、特に値が頻繁に繰り返される場合、サーバーが決定値関数を遭遇する値ごとに1回使用し、それらの値の後続の発生時にキャッシュされた結果を単に使用する方が全体的に効率的です。サーバーがすべての人に対して一度実行できるのに、複数のアプリケーションがすべて同じ変換を計算するのはなぜですか。
WarrenT 2013

@WarrenT、それは公平な点ですが、これらの関数が決定論的である場合、キャッシュが面倒で、データがテーブルに作成されたときに計算して保存するだけです...データベースに入れるのは悪い考えです。これらのアプリケーションはすべて、ユーザーに表示するデータを同じ形式にする必要があると想定しています。つまり、データベースがイギリス英語にローカライズされているという理由だけで、たとえば海外オフィスの全員がレポート日付をdd / mm / yyyyとして表示する必要があります。きっとあなたはこれが狂気であることに同意できますか?
スティーブンバーン2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.