Comment get des données de table SQL Server complètement par petites pièces sans index

J'ai une table SQL Server sans index, et je ne peux pas les append. Il y a des millions d'loggings dans cette table, et je ne peux pas get tous les loggings avec une seule requête en raison d'une memory insuffisante.

Comment puis-je get tous les loggings en petites portions – par exemple 100 loggings par portion?

C'est l'un des rares cas où un slider peut être utilisé sur son but réel.

Vous pouvez créer un slider statiс (qui va créer une copy des données de la table, mais dans la database temporaire du server plutôt que du côté client, et le sortinger) et parcourir ce slider.

Comment essayez-vous de lire les disques? Si vous utilisez un SqlDataReader , vous ne devriez pas avoir de problèmes de memory.


 const ssortingng QUERY = "SELECT * FROM MyTable"; using (var conn = new SqlConnection(CONNECTION_STRING)) { using (var cmd = new SqlCommand(QUERY, conn)) { using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { // Use properties and methods of the reader to access the current row } } } } 

Cela vous passe une ligne à la fois dans la connection à la database. La connection effectuera la mise en memory tampon pour vous, en amenant plusieurs lignes de la database et en vous les transmettant une à la fois.

La seule solution est – pour sélectionner toute la table que j'ai besoin de vider, dans la table temporaire avec la colonne d'identité. C'est … une solution acceptable, car j'ai des servers d'applications et de bases de données séparés, et le server DB a assez de memory pour cela. Mais probablement il y a une solution plus efficace?

Une solution consiste à utiliser un slider côté server, comme Quassnoi l'a déjà suggéré. L'inconvénient de cela est qu'il devra être un slider statique, ce qui signifie qu'une copy de la table entière sera créée dans tempdb.

Une autre solution consiste à traiter le côté client de manière orientée stream, rangée par ligne (c.-à-d., Curseur côté client):

  using(SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) { while (rdr.Read()) { -- process one row here } } 

De cette façon, vous pouvez traiter un grand set de lignes sans brûler toute la memory de votre client.