2

パラメータに応じて、約 100K から 1M 行を返すこのストアド プロシージャがあります。

CREATE PROCEDURE dbo.sp_doStuff
    @userId bigint = 0,
    @date datetime = null
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        ...
    from 
        ...
    order by theDate DESC;

END

このストアド プロシージャは、jdbcTemplate を介して Java メソッドによって呼び出され、そこからページングを行います。sp_doStuffただし、平均実行時間がすでに 60 秒であることを考えると、これは非常に遅いです。

つまりsp_doStuff、ユーザーが次のページ ボタンをクリックするたびに呼び出されます (非常に遅い)。1 回は 60 秒で問題ありませんが、次のページでは問題ありません。この SQL コード内にビュー (または任意のソリューション アプリケーション) を実装して、jdbcTemplate呼び出しで毎回この 10 万行を処理する必要がないようにするにはどうすればよいでしょうか。

次のボタンがクリックされるたびに呼び出されます:

String sql = "MyDB..sp_doStuff '12345', '2013-01-24'"
return jdbcTemplate.query(sql, new ResultSetExtractor<MyModel<Map<String, String>>>() {
        @Override
        public MyModel<Map<String, String>> extractData(ResultSet rs)
                throws SQLException, DataAccessException {
                ....
        }
    });
4

1 に答える 1

1

申し訳ありませんが、ページ上のユーザーに 10 万行すべてを表示する必要がありますか? クレイジーに見えますが、実在の人物が実際に 10 万行の情報を分析することはありません。1M の行があり、それらの値の AVG を計算するか、それ以外の場合は問題ありませんが、SP から人に表示することは非常に悪い習慣です。私の観点からは、行とインデックスの結果セットを制限するアプローチを使用する必要があります。例:SELECT salary, date FROM USER_SALARY t WHERE t.id = '1748' ORDER BY date DESC LIMIT 29799, 100; このリクエストは、ID 1748 を持つユーザーの USER_SALARY テーブルから 100 行 (開始行位置 - 29800) を表示します。これは日フィールド (もちろん、インデックスは既に ID フィールドによって作成されています) で並べ替えられています。ページ上でユーザーに表示する必要があるビッグ データ テーブル。

于 2013-01-24T09:30:54.030 に答える