4 Stimmen

SQL Server CE Leistung, das Auswählen aus einer Tabelle dauert 8 Sekunden für 7000 Datensätze

Ich habe eine SQL Server CE 3.5 Datenbank. Ich führe den folgenden Code aus:

private void Load(string sql)
{
  if (connection.State != ConnectionState.Open)
    connection.Open();
  SqlCeDataAdapter sqlCeDataAdapter = new SqlCeDataAdapter(sql, connection);

  Stopwatch watch = new Stopwatch();

  DataSet dataSet = new DataSet();
  try
  {
    Cursor.Current = Cursors.WaitCursor;
    watch.Start();

    sqlCeDataAdapter.Fill(dataSet, "items");
    sqlCeDataAdapter.Dispose();

    var myBind = new BindingSource(dataSet, "items");
    grid.DataSource = myBind;
  }
  finally
  {
    watch.Stop();
    Cursor.Current = Cursors.Default;
    MessageBox.Show(watch.ElapsedMilliseconds.ToString());
  }      
}

Load ("select a1, a2 from table");

Ist das lange für SQL Server CE, oder sollte es schneller geladen werden?

Was kann ich tun, um dieses Select schneller zu machen?

Wenn ich Joins mit anderen Tabellen verwende, steigt die Zeit dramatisch an ...

EDIT:

Ich habe den Code für eine folgende neue Version geändert, aber immer noch 7,5 s. ...

private void Load2 (string sql)
{
  if (connection.State != System.Data.ConnectionState.Open)
  {
    connection.Open();
  }

  using (SqlCeCommand command = new SqlCeCommand(sql, connection))
  {
    Stopwatch watch = new Stopwatch();

    Cursor.Current = Cursors.WaitCursor;
    watch.Start();
    using (SqlCeDataReader reader = command.ExecuteReader())
    {
      DataSet dataSet = new DataSet();

      dataSet.Tables.Add("items");

      dataSet.Tables["items"].Columns.Add("s1");
      dataSet.Tables["items"].Columns.Add("s2");

      while (reader.Read())
      {
        string s1 = reader.GetString(0);
        string s2 = reader.GetString(1);

        dataSet.Tables["items"].Rows.Add(s1, s2);
      }
      watch.Stop();
      Cursor.Current = Cursors.Default;
      MessageBox.Show(watch.ElapsedMilliseconds.ToString());

      BindingSource binding = new BindingSource(dataSet, "items");
      grid.DataSource = binding;
    }
  }
}

2voto

David Anderson Punkte 13220

SqlCeDataAdapter.Fill(...) ist einfach berüchtigt langsam. Wenn Sie wirklich Leistung benötigen, müssen Sie stattdessen einen SqlCeDataReader verwenden.

private void Load(string sql) {
    if (connection.State != System.Data.ConnectionState.Open) {
        connection.Open();
    }

    using (SqlCeCommand command = new SqlCeCommand(sql, connection)) {
        using (SqlCeDataReader reader = command.ExecuteReader()) {
            DataSet dataSet = new DataSet();

            dataSet.Tables.Add("items");

            while (reader.Read()) {
                DataRow row = dataSet.Tables["items"].NewRow();
                // füllen Sie Ihre Zeile

                dataSet.Tables["items"].Rows.Add(row);
            }

            BindingSource binding = new BindingSource(dataSet, "items");
            grid.DataSource = binding;
        }
    }
}

Und natürlich fügen Sie Ihre ordnungsgemäße Fehlerbehandlung hinzu und bereinigen Sie sie nach Ihrem Geschmack. Es gibt auch Entity Framework, das im Vergleich zu einer DbDataAdapter-Implementierung anständig in der Leistung ist.

Weil Sie SqlCe verwenden, haben Sie andere begrenzende Faktoren wie Festplatten-E/A und Sie haben keinen Server, der SQL-Transaktionen mit irgendeiner Art von Optimierungen verarbeitet.

0voto

c_ph_r Punkte 175

Die Frage ist alt, aber ich möchte eine schnelle Lösung für Googler geben, die sie heute finden können :

Ich kann 129.000 Werte in ~800ms abfragen.

var query = "SELECT timestamp FROM " + tablename;

                    SqlCeCommand cmdGetOldMasterId = new SqlCeCommand(query, _con);
                    SqlCeDataReader reader = cmdGetOldMasterId.ExecuteReader();

                    var queried_data = new List();

                    while(reader.Read())
                    {
                        queried_data.Add(reader.GetInt32(0));
                    }

Natürlich müssen Sie den Code an Ihre Bedürfnisse anpassen, also wenn Sie zum Beispiel einen String abrufen möchten, müssen Sie den reader.Get-Befehl, die Liste usw. ändern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X