1

約 1 年前に設計されたかなり複雑な SSRS レポートの欠陥を修正しています。私が収集した情報によると、レポートをコーディングした人物 (現在は不在で、質問を受け付けていない私たちの組織の請負業者) は、数年前に SQL を学び、最新の状態に保っていませんでした。彼のコードは、 WHERE 句での結合、列名ではなく列番号による並べ替え、サブクエリや CTE の代わりに常に一時テーブルを使用するなど、時代遅れで悪い慣行。SQL の初心者 (経験 1 年未満) であるため、私は常に、遭遇するいくつかの奇妙なコーディングの目的を理解しようとし、それが使用する時代遅れの手法の歴史を学ぼうとします。これは、私が把握できていないものです-レポートのストアドプロシージャです。現在、データを利用する前に、すべてを一時テーブルに選択して作業しています。コーダーが 3 列 50 行のルックアップ テーブルに 2 つの列を必要とする場合、最初にそれらの 2 つの列を一時テーブルに選択します。最後の SELECT でも、彼は常に最初に一時テーブルを選択し、次に SELECT * を実行してデータにアクセスします。私はこれを前に見たことがなく、私には無意味に思えます。データに直接アクセスしないのはなぜですか? SQL の歴史の中で、これを行う目的はありますか? これは前に見たことがありますが、私には無意味に思えます。データに直接アクセスしないのはなぜですか? SQL の歴史の中で、これを行う目的はありますか? これは前に見たことがありますが、私には無意味に思えます。データに直接アクセスしないのはなぜですか? SQL の歴史の中で、これを行う目的はありますか?

4

2 に答える 2

2

一時テーブルを使用する理由について推測してみます。以下に示す理由は、一部の観点に過ぎず、必ずしも真の理由ではない可能性があることに注意してください。単純に、その個人が SQL の正しい書き方を知らなかった可能性があります。ただし、一時テーブルが使用される理由がいくつかあります。

  1. ビューをエミュレートする - たとえば、50 行のテーブルの 3 つの列から 2 つの列だけを選択するということは、実際にはこれら 2 つの列内のデータのみの論理ビューが必要であることを意味します - これは CTE を使用して簡単に実現できます。
  2. データ変更の分離 - 彼は常にデータのコピーで作業していることを確認して、ベース テーブルへのデータ変更から分離されるようにしたいと考えていました (基本的に、これはマスター テーブルのスナップショットになります)。彼のクエリでベース テーブルを誤って変更するようにします。
  3. パフォーマンス - 彼が照会する元のテーブルには、検索と順序付けのためのインデックスが不十分に構築されていた可能性があります。彼はたまたま、クエリ内で必要な列に構築されたインデックスを使用して一時テーブルを構築することでこれを補いました。より高速なクエリ処理を実現します。また、マスター テーブル構造への変更を防止する方法も提供します (挿入や削除などの他の操作が遅くなります)。

そうは言っても、これらはすべて悪いコーディング慣行であることに注意することが重要です。データベース内のデータを処理するには、CTE、ビューなど、SQL サーバーが提供する機能を使用することを常にお勧めします。一時テーブルは、テーブルに挿入する前にデータを前処理したい場合に適していますが、データベースの外部で行うにはコストがかかります (たとえば、ダンプ ファイルからデータを読み取り、それらを数百万の行を含むマスター テーブル. ダンプ テーブルには、テーブル内に既に保持されている重複データが含まれている可能性があるため、そのような行を挿入したくない. このようなシナリオでは、データ処理システムは候補行をダンプできます一時テーブルに追加し、SQL サーバーの強力なセット操作を使用して、重複する行を除外します)。

于 2013-08-31T17:00:59.617 に答える
1

あなたの説明から、私はこれを悪いコーディングと呼びます。

あなたが説明したように選択を行うと想像できるいくつかのケースがあります。ほとんどの場合、「テーブルの読み取りに時間がかかる」または「オプティマイザがテーブルの統計を効果的に使用できない」というカテゴリに分類されます。1 つの理由として、テーブルが別のサーバー上のデータベースにあることが考えられます。多くの場合、ローカル コピーがあると、クエリがはるかに効率的になります。または、「テーブル」は、実際には処理に時間がかかるビューである可能性があります。

もう 1 つのケースは、テーブルに多くの更新があり、何らかの理由で一連のレポートのスナップショットが必要な場合です。異なるレポート間で一貫性が必要になる場合があるため、データを一時テーブルに入れることでこれが保証されます。

ただし、一般的には、これを行うことはありません。小さな参照テーブルがある場合は、それをfrom句に含めて、必要な列にアクセスするだけです。SQL Server は、テーブルへのアクセスを最適化し、必要な列だけに処理を制限するという優れた仕事をします。一時テーブルに何かを入れると、オプティマイザが妨げられます。これは一般的に (常にではありませんが) 悪いことです。

于 2013-08-31T16:18:52.310 に答える