2 votes

Pouvez-vous désactiver le comptage (total) pour ServiceStack AutoQuery ?

J'ai configuré AutoQuery pour une simple jointure de deux tables d'environ 1,3 million de lignes. En utilisant le mini-profiler intégré pour mesurer les temps SQL, la requête pour retourner les 100 premières lignes (sans filtrage) prend 3 ms et le comptage prend 341 ms supplémentaires.

Est-il possible d'utiliser AutoQuery sans récupérer le décompte ? Je n'ai pas besoin de connaître le nombre total.

EDITAR

Je me disais donc qu'il serait plus rapide de savoir s'il reste des lignes plutôt que de faire un décompte complet. J'ai testé cela sur notre base de données MSSQL en utilisant SSMS pour les temps.

--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

Salida:

(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.

3voto

mythz Points 54874

Il ne s'agit pas seulement de savoir si vous avez besoin de connaître le nombre total ou non, mais le total est également requis pour API ServiceClient comme GetLazy() afin de pouvoir diffuser de manière transparente les résultats d'AutoQuery derrière plusieurs requêtes paginées.

Ce n'était pas une option explicite auparavant, mais vous pouvez éviter qu'AutoQuery demande le Total en ajoutant un ResponseFilter qui le remplit à l'avance, par exemple :

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

Je viens également d'ajouter la prise en charge de cette option dans la rubrique cet engagement ainsi, dans les versions futures, vous pourrez supprimer le Total avec :

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

Ce changement est disponible à partir de la v4.0.61 qui est maintenant disponible sur MyGet .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X