2010-06-08 8 views
1

L'application de fenêtre que je construis est pour les machines très basses (Celeron avec 128 RAM maximum). A partir des deux approches suivantes que l'on est le meilleur (je ne veux pas que l'application devient porc de mémoire pour les machines bas de gamme): -Est-ce un problème si je demande encore et encore à SQL Server 2005 et 2000?

Approche One: -

Interrogez la base de données Select GUID from Table1 where DateTime <= @givendate qui me revient plus 300 milliers d'enregistrements (mais un seul champ à savoir GUID - 300 milliers de GUID). Maintenant, exécutez une boucle pour réaliser le prochain processus de ce logiciel basé sur GUID.

Deuxième approche: -

la base de données de requête Select Top 1 GUID from Table1 where DateTime <= @givendate avec top 1 encore et encore jusqu'à ce que tous les 300 milliers de dossiers effectués. Il me renverra seulement un GUID à la fois, et je peux faire ma prochaine étape d'opération.

Que suggérez-vous quelle approche utilisera le moins de ressources mémoire? (Vitesse/performance n'est pas le problème ici).

PS: base de données est également sur la machine locale (ou MSDE 2005 version Express)

Répondre

0

Optez pour l'approche 1 et utilisez SQLDataReader pour parcourir les données sans perdre de mémoire.

+0

Oh ya. J'ai presque oublié SQLDataReader (en utilisant beaucoup SQlDataAdapter ..) Merci, je vais essayer ça en premier ... – Jango

0

Si vous avez seulement 128 Mo de RAM je pense que le numéro 2 serait votre meilleure approche ...... ce que peut » SET based peut-être avec une procédure stockée peut-être, de cette façon tout le traitement se passerait sur le serveur

+0

Malheureusement, la base de données est également sur la machine locale (MSDE ou SQL Server 2005 Express) – Jango

+0

vous avez 128 Mo de RAM et SQL Server en cours d'exécution? – SQLMenace

+0

Oui monsieur, c'est le cas de nos plus de 1000 emplacements ...Ma nouvelle application supprime les anciens enregistrements inutilisés de la base de données pour libérer de l'espace (mais supprime en utilisant un logiciel tiers - pas directement depuis db) – Jango

0

Si l'utilisation de la mémoire est une préoccupation, je envisagerais de mettre en cache les données sur le disque localement. Vous pouvez ensuite lire les données à partir des fichiers en utilisant un objet FileStream.

Votre solution numéro 2 sera très lente et mettra beaucoup de fardeau sur le serveur db.

0

J'aurais une procédure mémorisée activée par pagination. Je le ferais en morceaux de 1k lignes et testerai à partir de là jusqu'à ce que j'obtienne la meilleure performance.

usp_GetGUIDS @from = 1, @to = 1000 
2

Je voudrais aller avec une approche hybride. Je sélectionnerais peut-être 50 enregistrements à la fois au lieu d'un seul. De cette façon, vous ne chargez pas le nombre entier d'enregistrements, mais vous réduisez également considérablement le nombre d'appels à la base de données.

+0

Dans la quantité de mémoire nécessaire pour récupérer 1 ligne, vous devriez également être en mesure de traiter N rangées. La partie difficile est bien sûr d'identifier N ... –

0

Cela peut être une approche totalement inaproprite pour vous, mais si vous êtes inquiet que sur les performances et votre machine est faible spec, je les opérations suivantes:

  1. Déplacez votre serveur SQL à une autre machine , car cela consomme beaucoup de ressources.
  2. Alternativement, si vous n'avez pas autant d'enregistrements, stockez en XML ou SQLite, et supprimez complètement le serveur SQL?
Questions connexes