0

ビュー(本当に大きなビュー)を攻撃する選択との戦いの真っ最中です。私の問題は、トイレに行って戻ってきてサンドイッチを作ることができるので、応答時間を短縮したいということです. 私のユーモアのセンスの悪さをお詫び申し上げます。したがって、これは有名な選択です:

if (periodeDeute != null && clauDeute != null) {
            if (periodeDeute.equals(EPeriodeDeute.EXECUTIVA)) {// EXEC

                sql.append("SELECT VGPT_EXE.*, VGPT_EXE_E.* FROM ")
                        .append(Constants.T_VW_GPT_E_BASIC)
                        .append(" VGPT_EXE, ")
                        .append(Constants.T_VW_GPT_E_EXTES)
                        .append(" VGPT_EXE_E ")
                        /* filtre */
                        .append("WHERE VGPT_EXE.")
                        .append(Constants.CC_ANY + "= ").append("VGPT_EXE_E.")
                        .append(Constants.CC_ANY).append(" AND VGPT_EXE.")
                        .append(Constants.CC_NUM_REBUT + "= ")
                        .append("VGPT_EXE_E.").append(Constants.CC_NUM_REBUT)
                        .append(" AND VGPT_EXE.")
                        .append(Constants.CC_PERIODE + "= ")
                        .append("VGPT_EXE_E.").append(Constants.CC_PERIODE)
                        .append(" AND VGPT_EXE.")
                        .append(Constants.CC_COD_CONCEPTE + "= ")
                        .append("VGPT_EXE_E.")
                        .append(Constants.CC_COD_CONCEPTE)
                        .append(" AND VGPT_EXE.")
                        .append(Constants.CC_COD_EMISOR + "= ")
                        .append("VGPT_EXE_E.").append(Constants.CC_COD_EMISOR)
                        .append(" AND VGPT_EXE.")
                        .append(Constants.CC_COD_PROV + "= ")
                        .append("VGPT_EXE_E.").append(Constants.CC_COD_PROV)
                        .append(" AND VGPT_EXE.")
                        .append(Constants.CC_ANY + "= ? ")
                        .append("AND VGPT_EXE.")
                        .append(Constants.CC_NUM_REBUT + "= ? ")
                        .append("AND VGPT_EXE.")
                        .append(Constants.CC_PERIODE + "= ? ")
                        .append("AND VGPT_EXE.")
                        .append(Constants.CC_COD_CONCEPTE + "= ? ")
                        .append("AND VGPT_EXE.")
                        .append(Constants.CC_COD_EMISOR + "= ? ")
                        .append("AND VGPT_EXE.")
                        .append(Constants.CC_COD_PROV + "= ? ");
            }
            if (periodeDeute.equals(EPeriodeDeute.VOLUNTARIA)) {// VOL
                sql.append("SELECT VGPT_VOL.*, VGPT_VOL_E.* FROM ")
                        .append(Constants.T_VW_GPT_V_BASIC)
                        .append(" VGPT_VOL, ")
                        .append(Constants.T_VW_GPT_V_EXTES)
                        .append(" VGPT_VOL_E ")
                        /* filtre */
                        .append("WHERE VGPT_VOL.")
                        .append(Constants.CC_ANY + "= ").append("VGPT_VOL_E.")
                        .append(Constants.CC_ANY).append(" AND VGPT_VOL.")
                        .append(Constants.CC_NUM_REBUT + "= ")
                        .append("VGPT_VOL_E.").append(Constants.CC_NUM_REBUT)
                        .append(" AND VGPT_VOL.")
                        .append(Constants.CC_PERIODE + "= ")
                        .append("VGPT_VOL_E.").append(Constants.CC_PERIODE)
                        .append(" AND VGPT_VOL.")
                        .append(Constants.CC_COD_CONCEPTE + "= ")
                        .append("VGPT_VOL_E.")
                        .append(Constants.CC_COD_CONCEPTE)
                        .append(" AND VGPT_VOL.")
                        .append(Constants.CC_COD_EMISOR + "= ")
                        .append("VGPT_VOL_E.").append(Constants.CC_COD_EMISOR)
                        .append(" AND VGPT_VOL.")
                        .append(Constants.CC_COD_PROV + "= ")
                        .append("VGPT_VOL_E.").append(Constants.CC_COD_PROV)
                        .append(" AND VGPT_VOL.")
                        .append(Constants.CC_ANY + "= ? ")
                        .append("AND VGPT_VOL.")
                        .append(Constants.CC_NUM_REBUT + "= ? ")
                        .append("AND VGPT_VOL.")
                        .append(Constants.CC_PERIODE + "= ? ")
                        .append("AND VGPT_VOL.")
                        .append(Constants.CC_COD_CONCEPTE + "= ? ")
                        .append("AND VGPT_VOL.")
                        .append(Constants.CC_COD_EMISOR + "= ? ")
                        .append("AND VGPT_VOL.")
                        .append(Constants.CC_COD_PROV + "= ? ");
            }
            try {

                if (LOG.isDebugEnabled()) {
                    LOG.debug("SQL> " + sql.toString());
                }

                try {
                    llista = jdbcTemplate.query(
                            sql.toString(),
                            new Object[] { clauDeute.getCcAny(),
                                    clauDeute.getCcNumRebut(),
                                    clauDeute.getCcPeriode(),
                                    clauDeute.getCodConcepte(),
                                    clauDeute.getCodEmissor(),
                                    clauDeute.getCodProveidor() },
                            new MapperDeuteDetall());
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                    e.printStackTrace();
                }

            } catch (DataAccessException ex) {
                if (LOG.isErrorEnabled()) {
                    LOG.error("No es pot recuperar la llista de deutes bàsics",
                            ex);
                }
                throw new GptException(
                        "No es pot recuperar la llista de deutes", ex);
            }
        } 

選択するだけです:

SELECT VGPT_EXE.*
     , VGPT_EXE_E.*
  FROM vw_gpt_e_basic VGPT_EXE
     , vw_gpt_e_extes VGPT_EXE_E
 WHERE VGPT_EXE.cc_any          = VGPT_EXE_E.cc_any
   AND VGPT_EXE.cc_num_rebut    = VGPT_EXE_E.cc_num_rebut
   AND VGPT_EXE.cc_periode      = VGPT_EXE_E.cc_periode
   AND VGPT_EXE.cc_cod_concepte = VGPT_EXE_E.cc_cod_concepte 
   AND VGPT_EXE.cc_cod_emisor   = VGPT_EXE_E.cc_cod_emisor
   AND VGPT_EXE.cc_cod_prov     = VGPT_EXE_E.cc_cod_prov
   AND VGPT_EXE.cc_any          = 1994
   AND VGPT_EXE.cc_num_rebut    = 201
   AND VGPT_EXE.cc_periode      = 1
   AND VGPT_EXE.cc_cod_concepte = 500
   AND VGPT_EXE.cc_cod_emisor   = 004
   AND VGPT_EXE.cc_cod_prov     = 43
     ;

難しい選択ではありませんが、非常に遅いです。多くのレジスタがあり、あまりにも多くのテーブルによって作成されています。とにかく速くする方法はありますか? Javaなどで。

タイ。

4

3 に答える 3

1

これらのクエリ文字列を何度も作成しないことから始めます。それらを作るstatic final

しかし、それはあなたの解決策ではありません。

問題はあなたの質問です。速度を上げるためにできることは次のとおりです。

  1. EXPLAIN PLAN を実行し、テーブル スキャンを探します。
  2. WHERE 句の列にインデックスを追加します。
  3. WHERE 句を並べ替えて、最も多くの行を削除する句が最初に表示されるようにします。
于 2013-09-06T11:22:32.530 に答える
1

一部のデータベースには、返される行をできるだけ早く最小限に抑えるために where 句をカスタマイズするための優れたアルゴリズムがあります。これらのデータベースを使用していない場合、データベースにはあまりインテリジェンスがありません。where 句の順序を変更してください。

したがって、たとえばVGPT_EXE.cc_periode = 1、select から多くの行を作成する場合は、最初に配置します。最適な順序を見つけるには、テーブル内のデータを分析する必要があります。

于 2013-09-06T11:40:31.167 に答える
1

このクエリは問題を引き起こす可能性があります。

  1. テーブルに多数の列がある場合、Query Compiler は非常に時間がかかる可能性があります。
  2. すべての列を選択すると、カバリング インデックスを使用する可能性が確実に減少します。
  3. 影響を与える可能性のある TEMPTABLE トランザクション (これについては完全にはわかりません) が存在する可能性があります。

説明計画、クエリのコストを確認し、元の要件に従ってクエリを調整することをお勧めします。

于 2013-09-06T11:41:54.117 に答える