Problème d'optimisation de requête pour résultat paginé
2 réponses
Anthony
Bonjour,
Je dispose aujourd'hui d'une table avec beaucoup d'enregistrement.
J'ai aujourd'hui des problèmes d'optimisation pour une requête permettant de
sélectionner une plage de résultat.
J'ai mis en place une nouvelle requête comme suit :
WITH PagedResult AS (SELECT ROW_NUMBER() OVER (order by I.Name) AS
RowNumber, I.Id
FROM Table_Indexe I WHERE ( I.FirstName = 'toto') )
SELECT*FROM Table_Datas a INNER JOIN PagedResult AS pr ON a.Id=pr.Id WHERE
RowNumber between 0 AND 9
Cela marche très bien. Cependant lorsque je veux la dernière page (à peu
près 400000 résultats), cad de 399990 à 399999, cela met un temps fou (time
out). J'aip ourtant indexer les colonnes.
J'ai remarqué que si j'enlève la clause sur FirstName, cela devient aussi
rapide quelque soit la plage.
Je m'en remet donc à vous. Peut être avez vous une requête bien meilleure.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Sylvain Lafontaine
Possiblement qu'un index est manquant sur FirstName ou que vous avez mélangé de l'Ascii avec de l'Unicode. Vous devriez jeter un coup d'oeil sur les plans d'exécution.
-- Sylvain Lafontaine, ing. MVP - Technologies Virtual-PC E-mail: http://cerbermail.com/?QugbLEWINF
"Anthony" wrote in message news:
Bonjour,
Je dispose aujourd'hui d'une table avec beaucoup d'enregistrement. J'ai aujourd'hui des problèmes d'optimisation pour une requête permettant de sélectionner une plage de résultat. J'ai mis en place une nouvelle requête comme suit : WITH PagedResult AS (SELECT ROW_NUMBER() OVER (order by I.Name) AS RowNumber, I.Id FROM Table_Indexe I WHERE ( I.FirstName = 'toto') ) SELECT*FROM Table_Datas a INNER JOIN PagedResult AS pr ON a.Id=pr.Id WHERE RowNumber between 0 AND 9
Cela marche très bien. Cependant lorsque je veux la dernière page (à peu près 400000 résultats), cad de 399990 à 399999, cela met un temps fou (time out). J'aip ourtant indexer les colonnes.
J'ai remarqué que si j'enlève la clause sur FirstName, cela devient aussi rapide quelque soit la plage.
Je m'en remet donc à vous. Peut être avez vous une requête bien meilleure.
Merci,
Anthony
-- Anthony Développeur .NET
Possiblement qu'un index est manquant sur FirstName ou que vous avez mélangé
de l'Ascii avec de l'Unicode. Vous devriez jeter un coup d'oeil sur les
plans d'exécution.
--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF
"Anthony" <Anthony@discussions.microsoft.com> wrote in message
news:3BAD1B09-4CD5-4066-960B-4CCC56263B21@microsoft.com...
Bonjour,
Je dispose aujourd'hui d'une table avec beaucoup d'enregistrement.
J'ai aujourd'hui des problèmes d'optimisation pour une requête permettant
de
sélectionner une plage de résultat.
J'ai mis en place une nouvelle requête comme suit :
WITH PagedResult AS (SELECT ROW_NUMBER() OVER (order by I.Name) AS
RowNumber, I.Id
FROM Table_Indexe I WHERE ( I.FirstName = 'toto') )
SELECT*FROM Table_Datas a INNER JOIN PagedResult AS pr ON a.Id=pr.Id
WHERE
RowNumber between 0 AND 9
Cela marche très bien. Cependant lorsque je veux la dernière page (à peu
près 400000 résultats), cad de 399990 à 399999, cela met un temps fou
(time
out). J'aip ourtant indexer les colonnes.
J'ai remarqué que si j'enlève la clause sur FirstName, cela devient aussi
rapide quelque soit la plage.
Je m'en remet donc à vous. Peut être avez vous une requête bien meilleure.
Possiblement qu'un index est manquant sur FirstName ou que vous avez mélangé de l'Ascii avec de l'Unicode. Vous devriez jeter un coup d'oeil sur les plans d'exécution.
-- Sylvain Lafontaine, ing. MVP - Technologies Virtual-PC E-mail: http://cerbermail.com/?QugbLEWINF
"Anthony" wrote in message news:
Bonjour,
Je dispose aujourd'hui d'une table avec beaucoup d'enregistrement. J'ai aujourd'hui des problèmes d'optimisation pour une requête permettant de sélectionner une plage de résultat. J'ai mis en place une nouvelle requête comme suit : WITH PagedResult AS (SELECT ROW_NUMBER() OVER (order by I.Name) AS RowNumber, I.Id FROM Table_Indexe I WHERE ( I.FirstName = 'toto') ) SELECT*FROM Table_Datas a INNER JOIN PagedResult AS pr ON a.Id=pr.Id WHERE RowNumber between 0 AND 9
Cela marche très bien. Cependant lorsque je veux la dernière page (à peu près 400000 résultats), cad de 399990 à 399999, cela met un temps fou (time out). J'aip ourtant indexer les colonnes.
J'ai remarqué que si j'enlève la clause sur FirstName, cela devient aussi rapide quelque soit la plage.
Je m'en remet donc à vous. Peut être avez vous une requête bien meilleure.
Merci,
Anthony
-- Anthony Développeur .NET
Anthony
Désolé, j'ai bien posé un index sur le firstname. Et cela n'expliquerai pas que les résultats sont plus rapides en ramenant les résultats de 0 à 9 que les derniers.
-- Anthony Développeur .NET
"Sylvain Lafontaine" a écrit :
Possiblement qu'un index est manquant sur FirstName ou que vous avez mélangé de l'Ascii avec de l'Unicode. Vous devriez jeter un coup d'oeil sur les plans d'exécution.
-- Sylvain Lafontaine, ing. MVP - Technologies Virtual-PC E-mail: http://cerbermail.com/?QugbLEWINF
"Anthony" wrote in message news: > Bonjour, > > Je dispose aujourd'hui d'une table avec beaucoup d'enregistrement. > J'ai aujourd'hui des problèmes d'optimisation pour une requête permettant > de > sélectionner une plage de résultat. > J'ai mis en place une nouvelle requête comme suit : > WITH PagedResult AS (SELECT ROW_NUMBER() OVER (order by I.Name) AS > RowNumber, I.Id > FROM Table_Indexe I WHERE ( I.FirstName = 'toto') ) > SELECT*FROM Table_Datas a INNER JOIN PagedResult AS pr ON a.Id=pr.Id > WHERE > RowNumber between 0 AND 9 > > Cela marche très bien. Cependant lorsque je veux la dernière page (à peu > près 400000 résultats), cad de 399990 à 399999, cela met un temps fou > (time > out). J'aip ourtant indexer les colonnes. > > J'ai remarqué que si j'enlève la clause sur FirstName, cela devient aussi > rapide quelque soit la plage. > > Je m'en remet donc à vous. Peut être avez vous une requête bien meilleure. > > Merci, > > Anthony > > -- > Anthony > Développeur .NET
Désolé, j'ai bien posé un index sur le firstname. Et cela n'expliquerai pas
que les résultats sont plus rapides en ramenant les résultats de 0 à 9 que
les derniers.
--
Anthony
Développeur .NET
"Sylvain Lafontaine" a écrit :
Possiblement qu'un index est manquant sur FirstName ou que vous avez mélangé
de l'Ascii avec de l'Unicode. Vous devriez jeter un coup d'oeil sur les
plans d'exécution.
--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF
"Anthony" <Anthony@discussions.microsoft.com> wrote in message
news:3BAD1B09-4CD5-4066-960B-4CCC56263B21@microsoft.com...
> Bonjour,
>
> Je dispose aujourd'hui d'une table avec beaucoup d'enregistrement.
> J'ai aujourd'hui des problèmes d'optimisation pour une requête permettant
> de
> sélectionner une plage de résultat.
> J'ai mis en place une nouvelle requête comme suit :
> WITH PagedResult AS (SELECT ROW_NUMBER() OVER (order by I.Name) AS
> RowNumber, I.Id
> FROM Table_Indexe I WHERE ( I.FirstName = 'toto') )
> SELECT*FROM Table_Datas a INNER JOIN PagedResult AS pr ON a.Id=pr.Id
> WHERE
> RowNumber between 0 AND 9
>
> Cela marche très bien. Cependant lorsque je veux la dernière page (à peu
> près 400000 résultats), cad de 399990 à 399999, cela met un temps fou
> (time
> out). J'aip ourtant indexer les colonnes.
>
> J'ai remarqué que si j'enlève la clause sur FirstName, cela devient aussi
> rapide quelque soit la plage.
>
> Je m'en remet donc à vous. Peut être avez vous une requête bien meilleure.
>
> Merci,
>
> Anthony
>
> --
> Anthony
> Développeur .NET
Désolé, j'ai bien posé un index sur le firstname. Et cela n'expliquerai pas que les résultats sont plus rapides en ramenant les résultats de 0 à 9 que les derniers.
-- Anthony Développeur .NET
"Sylvain Lafontaine" a écrit :
Possiblement qu'un index est manquant sur FirstName ou que vous avez mélangé de l'Ascii avec de l'Unicode. Vous devriez jeter un coup d'oeil sur les plans d'exécution.
-- Sylvain Lafontaine, ing. MVP - Technologies Virtual-PC E-mail: http://cerbermail.com/?QugbLEWINF
"Anthony" wrote in message news: > Bonjour, > > Je dispose aujourd'hui d'une table avec beaucoup d'enregistrement. > J'ai aujourd'hui des problèmes d'optimisation pour une requête permettant > de > sélectionner une plage de résultat. > J'ai mis en place une nouvelle requête comme suit : > WITH PagedResult AS (SELECT ROW_NUMBER() OVER (order by I.Name) AS > RowNumber, I.Id > FROM Table_Indexe I WHERE ( I.FirstName = 'toto') ) > SELECT*FROM Table_Datas a INNER JOIN PagedResult AS pr ON a.Id=pr.Id > WHERE > RowNumber between 0 AND 9 > > Cela marche très bien. Cependant lorsque je veux la dernière page (à peu > près 400000 résultats), cad de 399990 à 399999, cela met un temps fou > (time > out). J'aip ourtant indexer les colonnes. > > J'ai remarqué que si j'enlève la clause sur FirstName, cela devient aussi > rapide quelque soit la plage. > > Je m'en remet donc à vous. Peut être avez vous une requête bien meilleure. > > Merci, > > Anthony > > -- > Anthony > Développeur .NET