Каков самый быстрый способ получать общее количество реестров таблицы sqlite в C#?

У меня есть таблица с 726.000 реестрами и он использовал этот метод, чтобы получать общее количество реестров, но хотя в файлах менее чем 100.000 реестров он был приемлемым, сейчас он слишком медленный (76 длинных секунд).

public static int cantidadRegistros(AControlArchivo awDatosArchivo, string awFiltro)
    {            
        int nwRetorno = 0;
        try
        {
            SQLiteCommand cmdSqlite;
            SQLiteConnection connSqlite;
            string query = "";
            if (awFiltro == null || awFiltro == "")
            {
                query = @"SELECT COUNT(*) FROM " + awDatosArchivo.awTabla;
            }
            else
            {
                query = @"SELECT COUNT(*) FROM " + awDatosArchivo.awTabla  + " WHERE " + awFiltro;
            }
            connSqlite = ConnectToSqlite(awDatosArchivo);
            cmdSqlite = new SQLiteCommand();
            cmdSqlite.Connection = connSqlite;
            cmdSqlite.CommandText = query;
            cmdSqlite.Connection.Open();
            nwRetorno = Convert.ToInt32(cmdSqlite.ExecuteScalar());
            cmdSqlite.Connection.Close();
        }
        catch (Exception ex)
        {
            muestroError(ex);
        }
        return nwRetorno;
    }

awDatosArchivo у него есть внутри информация: path, имя базы данных и таблицы.

Я нашел информацию используя linq, но не сумел приспосабливать ее (смотреть в конце статьи. Using Query to count related entities without loading them

Если бы они смогли приспосабливать этот пример linq, он мне был бы полезен, чтобы это понимать.

Также я попытался загружая таблицу в dataset и он быстрее.

 public static int cantidadRegistros(AControlArchivo awDatosArchivo, string awFiltro)
    {
        int nwRetorno = 0;
        nwRetorno = LeoDataSet(awDatosArchivo, awFiltro).Tables[0].Rows.Count;           
        return nwRetorno;
    }

public static DataSet LeoDataSet(AControlArchivo awDatosArchivo, string awFiltro)
    {
        SQLiteCommand cmdSqlite;
        SQLiteConnection connSqlite;
        DataSet ds = new DataSet();
        connSqlite = ConnectToSqlite(awDatosArchivo);
        cmdSqlite = new SQLiteCommand();
        cmdSqlite.Connection = connSqlite;
        StringBuilder awQuery = new StringBuilder();
        awQuery.Append("SELECT * FROM ");
        if (awFiltro == null || awFiltro == "")
        {
            awQuery.Append(awDatosArchivo.awTabla);
        }
        else
        {
            awQuery.Append(awDatosArchivo.awTabla + " " + datosPublicos.awInnerJoin + " WHERE " + awFiltro);
        }
        SQLiteDataAdapter adapter = new SQLiteDataAdapter(awQuery.ToString(), connSqlite);
        adapter.Fill(ds);
        return ds;
    }

Отсрочи 17 секунд, но продолжи быть очень медленным.

0
задан 22.04.2017, 03:03
0 ответов

Ты консультируешь ее, что они используют индексы, они быстрее. В большинстве случаев для первичного ключа администратор верьте в индекс автоматически

query = @"SELECT COUNT(clave_primaria) FROM " + awDatosArchivo.awTabla;

или

query = @"SELECT COUNT(1) FROM " + awDatosArchivo.awTabla;

Для случая фильтров ты должен считать использовать поиски полного текста. (Full Текст Сеарч), Но это подразумевает изменять твою базу данных и менять консультацию

In most вступи в брак, UNIQUE and PRIMARY KEY constraints пахал implemented by creating в unique index in the он был датирован. (The exceptions пахал INTEGER PRIMARY KEY and PRIMARY KEYs on WITHOUT ROWID tables.)

1
ответ дан 03.12.2019, 18:22
  • 1
    Adicionalmente считает делать твой mé весь así ncrono с использованием async и Task< int> –  30.12.2016, 02:01