私は自分の議論をOracleに基づいていますが、同様の原則がおそらく他のRDBMSにも当てはまります。使用したシステムで質問にタグを付けてください。
インデックス付けの場合、列数はほとんど関係ありません。さらに重要なのは行数です。しかし、私はあなたがそれらのすべてまたはほとんどすべても必要としていると思います。この場合、インデックス作成は、実行する作業の量を減らすことなく、プロセスに別のステップを追加するだけなので、役に立ちません。
つまり、あなたがしているように見えるのは、大規模なテーブルスキャンです。これらは通常、キャッシュされません。これは、基本的に、そこに格納されている他のすべての有用なデータからキャッシュ全体をフラッシュするためです。したがって、この種のデータを選択するたびに、ディスクからスクラッチする必要があり、おそらくそれを有線で送信する必要があります。これには時間がかかるはずです。
あなたが説明していることから、おそらく最良のアプローチは、データをアプリケーションのできるだけ近くにキャッシュすることによって、ディスクの読み取りとネットワークトラフィックを削減することです。おそらくアプリケーションの一部として、アプリケーションのマシンにキャッシュを設定してみてください。データを一度読み取り、キャッシュに入れて、後で読み取ります。インメモリデータベースを使用すると、SQLベースのアクセスパスを維持できます。
おそらく、誰かがキャッシュを使用しようとする前に、バックグラウンドでキャッシュを埋めようとします。
もちろん、これはかなりのメモリを消費するので、これが実行可能かどうかを判断する必要があります。
2番目のアプローチは、キャッシュ設定を調整して、データベースがそれらのテーブルをメモリにキャッシュするようにすることです。ただし、これはデータベース全体のパフォーマンスに影響を与え、プラスの方法ではないことに注意してください。
3番目のオプションは、処理ロジックをデータベースに移動することです。ディスクI/Oの量を減らすことはできませんが、少なくともネットワークをループから外すことができます(これが問題の一部であると想定しています)