2010-03-19 7 views
0

J'ai une requête qui renvoie un grand nombre de lignes lourdes. Lorsque je transforme ces lignes dans une liste de CustomObject, j'ai un gros pic de mémoire, et cette transformation est faite par un framework dotnet personnalisé que je ne peux pas modifier.Diviser le résultat de la requête par deux dans TSQL (obtenir 2 jeux de résultats/tables)

J'ai besoin de récupérer un nombre de lignes inférieur pour faire "la transformation" en deux passages, puis éviter le pic de mémoire.

Comment diviser le résultat d'une requête par moitié? Je dois le faire dans la couche DB. Je pense faire un "Top count (*)/2" mais comment obtenir l'autre moitié?

Merci!

Répondre

1

Voici une autre façon de le faire à partir de (http://www.tek-tips.com/viewthread.cfm?qid=1280248&page=5). Je pense qu'il est plus efficace:

Declare @Rows Int 
Declare @TopRows Int 
Declare @BottomRows Int 

Select @Rows = Count(*) From TableName 

If @Rows % 2 = 1 
    Begin  
    Set @TopRows = @Rows/2 
    Set @BottomRows = @TopRows + 1 
    End 
Else 
    Begin 
    Set @TopRows = @Rows/2 
    Set @BottomRows = @TopRows 
    End  

Set RowCount @TopRows 

Select * From TableName Order By DisplayOrder 

Set RowCount @BottomRows 

Select * From TableNameOrder By DisplayOrderDESC 

--- old réponse ci-dessous ---
Est-ce un appel de procédure stockée ou SQL dynamique? Pouvez-vous utiliser des tables temporaires?

si oui, quelque chose comme ça fonctionnerait

select row_number() OVER(order by yourorderfield) as rowNumber, * 
    INTO #tmp 
FROM dbo.yourtable 

declare @rowCount int 
SELECT @rowCount = count(1) from #tmp 

SELECT * from #tmp where rowNumber <= @rowCount/2 

SELECT * from #tmp where rowNumber > @rowCount/2 

DROP TABLE #tmp 
+0

C'est parfait, je me demande s'il vaut mieux utiliser une table temporaire ou inclure la colonne rownumber dans une vue que je récupère dans la requête? – rubdottocom

0
SELECT TOP 50 PERCENT WITH TIES ... ORDER BY SomeThing 

puis

SELECT TOP 50 PERCENT ... ORDER BY SomeThing DESC 

Cependant, à moins que vous snapshot d'abord les données, une ligne au milieu peut passer à travers ou être traitées deux fois

2

Si vous avez un champ d'identité dans la table, sélectionnez d'abord les ID pairs, puis les IDs pairs.

select * from Table where Id % 2 = 0 

select * from Table where Id % 2 = 1 

Vous devriez avoir environ 50% de lignes dans chaque ensemble.

0

Je ne pense pas que vous devriez le faire en SQL, sauf si vous aurez toujours la possibilité d'avoir le même enregistrement 2 fois.

Je le ferais dans un langage de programmation "logiciel", pas SQL. Java, .NET, C++, etc ...

Questions connexes