powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Медленная работа SQL CE
10 сообщений из 35, страница 2 из 2
Медленная работа SQL CE
    #38544127
sigmov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автортаких GetItemByItemId
Используйте курсоры в SqlCe
По id они будут просто летать
Код: c#
1.
2.
3.
4.
//Base Table Cursor
cmd.CommandText = "tablename";
cmd.CommandType = CommandType.TableDirect;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable)
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38544442
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sigmovИспользуйте курсоры в SqlCe
По id они будут просто летать
Код: c#
1.
2.
3.
4.
//Base Table Cursor
cmd.CommandText = "tablename";
cmd.CommandType = CommandType.TableDirect;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable)


И потом ползать по SqlCeResultSet с помощью Seek? Это будет в разы тормознее, чем один запрос с джойном.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38544514
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие курсоры? ORM и баста.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38544628
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sigmov, спасибо за курсоры, проблему решил join, скорость выполнения запроса значительно возросла, сообщество подтолкнуло на верное решение. Теперь осталось разобраться как сделать 7 последовательных insert-ов за одну операцию. Может кто знает, как обмануть query processor?
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38544670
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38545143
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны, знаю, не подходит, мне надо id получать
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38545244
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorreСон Веры Павловны, знаю, не подходит, мне надо id получать
Получать Id от нескольких вставок за одну операцию? Это возможно только на нормальном человеческом sql server, где можно выполнить insert .. output в таблицу/табличную переменную. SqlCE не поддерживает output clause в insert.
А если речь идет просто о заполнении identity-поля, то надо просто не включать его в маппинг SqlCEBulkCopy - точно так же, как и при работе с обычным SqlBulkCopy.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38548237
sigmov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры ПавловныsigmovИспользуйте курсоры в SqlCe
По id они будут просто летать
Код: c#
1.
2.
3.
4.
//Base Table Cursor
cmd.CommandText = "tablename";
cmd.CommandType = CommandType.TableDirect;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable)

И потом ползать по SqlCeResultSet с помощью Seek? Это будет в разы тормознее, чем один запрос с джойном.Я с SqlCe уже 3 проекта выполнял, поверь мне, TableDirect курсор быстрее быть не может. Специально тестировал . Вы видимо просто "не умеете/пробовали его готовить".
Torre Теперь осталось разобраться как сделать 7 последовательных insert-ов за одну операцию. Может кто знает, как обмануть query processor?Открываете транзакицю и через курсор(быстрее) или sqlQuery фигачите ваши 7 записей. Коммитите транзакцию.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38548565
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sigmov, спасибо, попробую. Кстати, можно поинтересоваться, как влияет объем БД на производительность приложения?
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38548773
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sigmovСпециально тестировал . Вы видимо просто "не умеете/пробовали его готовить".
Да уж куда нам убогим. В тесте, кстати, а) SqlCE сравнивается с SQLite, которая к этой теме никаким боком; б) всё проверки идут на основании оперций над одной таблицей, а проблема, обсуждаемая здесь - энное количество обращений по id из одной таблицы к другой таблице.
Ну, и раз уж речь зашла о тестах:
таблицы тестовой базы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table Objects (
  id int not null primary key,
  name nvarchar(100)
)

create table Columns (
  object_id int not null,
  name nvarchar(100) not null,
  ord int not null,
  constraint pk_columns primary key (object_id, ord),
  constraint fk_columns_objects foreign key (object_id) references Objects(id)
)


подготовка данных:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
var objects = new DataTable();
var columns = new DataTable();
using (var cnn = new SqlConnection("Data Source=...;Initial Catalog=...;Integrated Security=True"))
{
  cnn.Open();
  using (var cmd = new SqlCommand("select object_id id, name from sys.all_objects", cnn))
  using (var rd = cmd.ExecuteReader())
    objects.Load(rd);
  using (var cmd = new SqlCommand("select newid() id, object_id, name, column_id ord from sys.all_columns", cnn))
  using (var rd = cmd.ExecuteReader())
    columns.Load(rd);
}
using (var e = new SqlCeEngine(@"Data Source=|DataDirectory|test.sdf"))
  e.CreateDatabase();
using (var cnn = new SqlCeConnection(@"Data Source=|DataDirectory|test.sdf;Persist Security Info=False;"))
{
  cnn.Open();
  using (var cmd = new SqlCeCommand())
  {
    cmd.Connection = cnn;
    foreach (var s in Regex.Split(Properties.Resources.TestDdl, "(?i)go"))
    {
      cmd.CommandText = s;
      cmd.ExecuteNonQuery();
    }
  }
  using (var bc = new SqlCeBulkCopy(cnn, SqlCeBulkCopyOptions.KeepNulls))
  {
    bc.DestinationTableName = "Objects";
    bc.WriteToServer(objects);
    bc.DestinationTableName = "Columns";
    bc.WriteToServer(columns);
  }
}
Console.WriteLine("Objects: {0}, columns: {1}", objects.Rows.Count, columns.Rows.Count);


(консольный вывод показывает, что в Objects 222512 записей, в Columns 206738 записей - не у всех объектов есть колонки).
Далее, запросом требуется вытащить из базы объекты с колонками, и смапить вот на такую структуру:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
public class Column
{
  public string Name { get; set; }
  public int Ord { get; set; }
  public override string ToString()
  {
    return string.Format("{0} {1}", Ord, Name);
  }
}

public class Table
{
  public int Id { get; set; }
  public string Name { get; set; }
  public List<Column> Columns { get; set; }
  public override bool Equals(object obj)
  {
    var t = obj as Table;
    return t != null && t.Id == Id;
  }
  public override int GetHashCode()
  {
    return Id.GetHashCode();
  }
  public override string ToString()
  {
    return string.Format("{0}, id={1}", Name, Id);
  }
}


Берем вспомогательный класс:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
class DbData
{
  public int TableId { get; set; }
  public string TableName { get; set; }
  public Guid ColumnId { get; set; }
  public string ColumnName { get; set; }
  public int ColumnOrd { get; set; }
}


Извлекаем данные:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
static IEnumerable<DbData> GetDbData()
{
  using (var cnn = new SqlCeConnection(@"Data Source=|DataDirectory|test.sdf"))
  using (var cmd = new SqlCeCommand(@"
    select o.id, o.name, c.id, c.name, c.ord
    from Objects o join Columns c on c.object_id=o.id", cnn))
  {
    cnn.Open();
    using (var rd = cmd.ExecuteReader())
      while (rd.Read())
        yield return new DbData
        {
          TableId = rd.GetInt32(0),
          TableName = rd.GetString(1),
          ColumnId = rd.GetGuid(2),
          ColumnName = rd.GetString(3),
          ColumnOrd = rd.GetInt32(4)
        };
  }
}


Собираем в кучу, засекаем время:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
var sw = new Stopwatch();
sw.Start();
var l = GetDbData().GroupBy(d => new Table { Id = d.TableId, Name = d.TableName })
  .Select(g =>
  {
    g.Key.Columns = g.Select(c => new Column
    {
      Id = c.ColumnId,
      Name = c.ColumnName,
      Ord = c.ColumnOrd,
      Table = g.Key
    }).OrderBy(c => c.Ord).ToList();
    return g.Key;
  }).ToList();
sw.Stop();
Console.WriteLine(l.Count);
Console.WriteLine("{0} {1}",sw.ElapsedMilliseconds, sw.ElapsedTicks);


Консольный вывод:
Код: plaintext
1.
7813
3585 10518511751
А теперь ваш ход - проделайте аналогичное и на сопоставимом объеме данных с помощью SqlCeResultSet и TableDirect, покажите результаты.
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Медленная работа SQL CE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]