スキーマを設計する前に(可能であれば)要件を理解します。
データについて学びます。1)インデックス作成2)使用されるストレージのタイプ、3)ベンダーエンジンまたは機能。すなわち...キャッシング、インメモリ機能4)データタイプ5)テーブルのサイズ6)クエリの頻度7)リソースが共有されている場合の関連するワークロード8)テスト
A)要件は異なります。ハードウェアが予想されるワークロードをサポートできない場合は、ワークロードの要件を提供する方法を再評価する必要があります。表への追加欄について。データベースがビューをサポートしている場合は、特定の名前付きの列を持つ特定のデータのインデックス付き(?)ビューを作成できます(選択 '*'に対して)。定期的にデータとスキーマを見直して、「ガベージイン」->「ガベージアウト」シンドロームに遭遇しないようにしてください。
他の解決策がないと仮定します。以下を考慮に入れることができます。問題には常に複数の解決策があります。
1)インデックス作成:select *はテーブルスキャンを実行します。さまざまな要因に応じて、ディスクシークや他のクエリとの競合が発生する場合があります。テーブルが多目的の場合は、すべてのクエリがパフォーマンスを発揮し、目標時間を下回って実行されることを確認します。大量のデータがあり、ネットワークまたはその他のリソースが調整されていない場合。これを考慮に入れる必要があります。データベースは共有環境です。
2)ストレージのタイプ。つまり、SSD、ディスク、またはメモリを使用している場合。I / O時間とシステム/ CPUの負荷は異なります。
3)DBAは、より高いパフォーマンスを得るためにデータベース/テーブルを調整できますか?何らかの理由で想定すると、チームは問題の最良の解決策として「*」を選択することを決定しました。DBまたはテーブルをメモリにロードできますか。(または他の方法...おそらく応答は2〜3秒の遅延で応答するように設計されましたか?---会社の収入を得るために広告が再生されている間...)
4)ベースラインから開始します。データ型と、結果がどのように表示されるかを理解します。データ型が小さく、フィールド数が多いと、結果セットで返されるデータの量が少なくなります。これにより、リソースを他のシステムニーズに利用できるようになります。通常、システムリソースには制限があります。「常に」これらの制限を下回って、安定性と予測可能な動作を保証します。
5)テーブル/データのサイズ。select '*'は小さなテーブルでは一般的です。通常、これらはメモリに収まり、応答時間は高速です。繰り返しますが、要件を確認します。機能のクリープを計画します。常に、現在および可能な将来のニーズについて計画します。
6)クエリの頻度。システム上の他のワークロードに注意してください。このクエリが毎秒実行され、テーブルが小さい場合。結果セットは、キャッシュ/メモリにとどまるように設計できます。ただし、クエリがギガバイト/テラバイトのデータを使用する頻繁なバッチプロセスである場合は、他のワークロードが影響を受けないように、追加のリソースを専用にする方がよい場合があります。
7)関連するワークロード。リソースの使用方法を理解します。ネットワーク/システム/データベース/テーブル/アプリケーションは専用ですか、それとも共有ですか?関係者は誰ですか?これは本番、開発、QAのどれですか?これは一時的な「迅速な修正」ですか。シナリオをテストしましたか?現在のハードウェアにどれほど多くの問題が存在するかに驚かれるでしょう。(はい、パフォーマンスは高速です...しかし、設計/パフォーマンスはまだ低下しています。)システムは、1秒あたり5-10クエリではなく、1秒あたり10Kクエリのパフォーマンスを必要としますか。データベースサーバーは専用ですか、または他のアプリケーションを実行して、共有リソースで監視を実行しますか。一部のアプリケーション/言語。O / Sはメモリを100%消費し、さまざまな症状/問題を引き起こします。
8)テスト:理論をテストし、できる限り理解します。選択した「*」の問題は大きな問題である場合もあれば、心配する必要がないものである場合もあります。
SELECT COUNT(*)
悪いことは信じられないほど古くて時代遅れです。詳細については、次をSELECT *
参照してください。stackoverflow.com