2016-06-21 4 views
2

私は約130万行の2つのテーブルの単純な結合に対してAutoQueryをセットアップしました。ミニプロファイラを使用してSQLタイミングを測定すると、最初の100行(フィルタリングなし)を返すクエリは3ms、カウントはさらに341msかかる。ServiceStack AutoQueryのカウント(合計)を無効にできますか?

カウントを取得せずにAutoQueryを使用できますか?私は実際にフルカウントを知る必要はありません。

EDITは、だから私は速いかもしれフルカウント対残りの複数の行があるかどうかを見つけることを考えていました。私はタイミングのSSMSを使用して私たちのMSSQLデータベースに対してこれをテストしました。

--Generated by ServiceStack 
set statistics time on 
SELECT COUNT(*) "COUNT(*)" 
FROM "table1" INNER JOIN "table2" ON 
("table1"."PrimaryKey" = "table2"."ForeignKey") 
set statistics time off 

--Skipping 100 
set statistics time on 
SELECT CASE WHEN EXISTS(
    SELECT "table1"."PrimaryKey" 
    FROM "table1" INNER JOIN "table2" ON 
    ("table1"."PrimaryKey" = "table2"."ForeignKey") 
    ORDER BY "table1"."PrimaryKey" OFFSET 100 ROWS FETCH NEXT 1 ROWS ONLY 
) 
THEN CAST(1 AS BIT) 
ELSE CAST(0 AS BIT) END 
set statistics time off 

--Skipping 100000 
set statistics time on 
SELECT CASE WHEN EXISTS(
    SELECT "table1"."PrimaryKey" 
    FROM "table1" INNER JOIN "table2" ON 
    ("table1"."PrimaryKey" = "table2"."ForeignKey") 
    ORDER BY "table1"."PrimaryKey" OFFSET 100000 ROWS FETCH NEXT 1 ROWS ONLY 
) 
THEN CAST(1 AS BIT) 
ELSE CAST(0 AS BIT) END 
set statistics time off 

--Skipping 1000000 
set statistics time on 
SELECT CASE WHEN EXISTS(
    SELECT "table1"."PrimaryKey" 
    FROM "table1" INNER JOIN "table2" ON 
    ("table1"."PrimaryKey" = "table2"."ForeignKey") 
    ORDER BY "table1"."PrimaryKey" OFFSET 1000000 ROWS FETCH NEXT 1 ROWS ONLY 
) 
THEN CAST(1 AS BIT) 
ELSE CAST(0 AS BIT) END 
set statistics time off 

出力:

(1 row(s) affected) 

SQL Server Execution Times: 
    CPU time = 203 ms, elapsed time = 200 ms. 

(1 row(s) affected) 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 

(1 row(s) affected) 

SQL Server Execution Times: 
    CPU time = 16 ms, elapsed time = 19 ms. 

(1 row(s) affected) 

SQL Server Execution Times: 
    CPU time = 203 ms, elapsed time = 193 ms. 

答えて

3

それはあなたがフルカウントかどうかを知っておく必要があるかどうかだけではないのですが、それは透過的に複数の後ろAUTOQUERY結果をストリーミングすることができますので、合計はまたServiceClient API's like GetLazy()ために必要なクエリをページング。

は、これは前に明示的な選択肢ではありませんでしたが、あなたは例えば、1とそれを事前移入することResponseFilterを追加することにより、トータルの照会AUTOQUERYを避けることができます。

Plugins.Add(new AutoQueryFeature { 
    MaxLimit = 100, 
    ResponseFilters = { 
     ctx => { ctx.Response.Meta["COUNT(*)"] = "0"; } 
    } 
}); 

私もちょうどのサポートを追加しました

Plugins.Add(new AutoQueryFeature { 
    MaxLimit = 100, 
    IncludeTotal = false, 
}); 

この変更はavailable on MyGetが今だv4.0.61から提供されています:this commitでこのオプションはとても将来のリリースではあなたが合計を削除することができます。

+0

大きなデータセットに対してページングのパフォーマンスを向上させる方法についていくつかのタイミングの詳細を追加しました。 –

+0

@AnthonyCarlタイミングは興味深いですが、エンドユーザーが行をページングするのが好きで、MSSQLでしか動作しない合計を報告しません。しかし、それをあなたの応答に含めるには、[Custom ResponseFilter](https://github.com/ServiceStack/ServiceStack/wiki/AutoQuery-RDBMS#autoquery-response-filters)の応答にこれを追加する必要があります。 )。 – mythz

関連する問題