mi sto chiedendo quale metodo sia più opportuno per occupare meno memoria possibile in questo caso: ho un form con una sezione di ricerca e visualizzazione poi dei risultati (diverse migliaia di record) in una datagridview sottostante

poichè le ricerche possono essere molte durante l'utilizzo dell'applicazione vorrei minimizzare lo spreco di memoria

x ora lavoro in questo modo:

codice:
        private void Ricerca()
        {
            //  stringa di connessione al database
            string connStr = "Data Source=server;Initial Catalog=SorveglianzaSanitaria;User Id=xxxx;Password=xxxx;";
            //  comando SQL
            string sqlCmd = "SELECT matricola, cognome, nome, sesso, data_nasc FROM Anagrafiche";
            //  crea data adapter che prepara il comando sul db
            SqlDataAdapter daElenco = new SqlDataAdapter(sqlCmd, connStr);
            //  crea un data table e lo popola con il risultato del comando eseguito dal data adapter
            DataTable dtElenco = new DataTable();
            daElenco.Fill(dtElenco);

            //  crea un binding source e lo collega al lato dati
            BindingSource bsElenco = new BindingSource();
            bsElenco.DataSource = dtElenco;
            //  collega il lato visuale del binding source al datagridview
            dgvElenco.DataSource = bsElenco;

            //  libera memoria
            daElenco.Dispose();
            daElenco = null;
            dtElenco.Dispose();
            dtElenco = null;
            //  per il binding source non posso fare niente ora
        }
ha senso la sezione che libera la memoria? se mi spingo oltre con il binding source vien fuori un casino di quelli..