powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Медленная работа SQL CE
35 сообщений из 35, показаны все 2 страниц
Медленная работа SQL CE
    #38539832
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, есть вопрос к сообществу. Работаю с SQL CE (4.0), один запрос (на select) выводит около 600 записей, для каждой из них выполняется несколько запросов к той же БД примерно таких GetItemByItemId, в результате все растягивается на несколько минут прежде, чем грид обновится. Все бы ничего, но старт приложения затягивается, а юзеру нечем поразвлекаться.

В настоящее время в доступе к данным использую Singleton, несложно организовать и многопоточный доступ, но по моим наблюдениям время теряется на открытие соединения, а SQL CE соединение не позволяет выполнять более одного запроса за сеанс. Если кто сталкивался с такой проблемой, посоветуйте, как бороться, в сети сплошь жалобы.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38539909
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Torreа SQL CE соединение не позволяет выполнять более одного запроса за сеанс.
Чушь.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
using (var cnn = new SqlCeConnection(@"Data Source=Northwind.sdf;Persist Security Info=False;"))
{
  cnn.Open();
  using(var cmd = new SqlCeCommand("select top 5 [Product ID],[Supplier ID],[Product Name] from [Products]", cnn))
  using(var rd = cmd.ExecuteReader())
    while(rd.Read())
      Console.WriteLine("{0} {1} {2}", rd.GetInt32(0), rd.GetInt32(1), rd.GetString(2));
  using (var cmd = new SqlCeCommand("select top 5 [Supplier ID],[Company Name] from [Suppliers]", cnn))
  using (var rd = cmd.ExecuteReader())
    while (rd.Read())
      Console.WriteLine("{0} {1}", rd.GetInt32(0), rd.GetString(1));
}


- 2 запроса на отдном открытом соединении, отрабатывают прекрасно.
Torreвыводит около 600 записей, для каждой из них выполняется несколько запросов к той же БД примерно таких GetItemByItemId
Откройте учебник, и прочитайте про джойны . Row by row is slow by slow.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38540001
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, но доки не рекомендуют, однако даже и в этом случае проблема не решается за исключением многопоточного доступа. Джоины конечно хорошо, но не везде применимы, может грузить все данные сразу сначала в кэш и выбирать уже позже?
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38540011
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorreСпасибо, но доки не рекомендуют
Что они не рекомендуют? Пакетные запросы и MARS? Документация этого не не рекомендует - в ней прямо написано, что это не поддерживается, но выше речь шла совсем о другом - о последовательном исполнении запросов в одном соединении.
TorreДжоины конечно хорошо, но не везде применимы
Пример в студию.
Torreможет грузить все данные сразу сначала в кэш и выбирать уже позже?
Ну, если по-другому не умеете, то ничего, кроме этого, не остается.
P.S. У меня есть одна эмбеддед-базенка весом в 2 гигабайта. Если столкнетесь с такой - тоже будете всю вливать в кэш?
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38540039
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать join не позволяет большое количество классов, этак можно так намакаронить, что и сам не разберешь. Кроме того, когда дело доходит до выборки по индексу, проходит какое-то время. В настоящее время загружаю по частям, первую сотню сразу вывожу в грид, остальные обрабатываю за кулисами, по окончании загрузки обновляю грид. Работает неплохо, но хотелось бы понять best practice
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38540056
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorreИспользовать join не позволяет большое количество классов, этак можно так намакаронить, что и сам не разберешь.
Это всего лишь проблемы кривой архитектуры, а не самого SqlCE.
TorreКроме того, когда дело доходит до выборки по индексу, проходит какое-то время.
Неселективный индекс, несвежая статистика, неоптимальный вид джойнов, index scan вместо index seek, итп. Изучайте план исполнения.
TorreРаботает неплохо, но хотелось бы понять best practice
Либо использовать рукописные запросы с джойнами, и их разбор и раскладывание по классам вручную, либо ORM+соответствующий маппинг зависимых сущностей. Во втором случае тоже будут запросы с джойнами, только ORM сгенерит их сам, и сам разложит по классам. Однако проблему индексов, статистики, и планов это не решит, в любом случае здесь придется поработать самому.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38540135
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorreСпасибо, но доки не рекомендуют, однако даже и в этом случае проблема не решается за исключением многопоточного доступа. Джоины конечно хорошо, но не везде применимы, может грузить все данные сразу сначала в кэш и выбирать уже позже?

Джойн - это хорошо. В принципе, все данные можно одним запросом вытащить + на клиенте отфильтровать что нужно. Второй вариант - два запроса, а на клиенте соответствие проставить.

Вот что не нужно делать, так это 600 и более запросов к БД.

Я голосую за джойн.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38540211
Фотография Torre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Я голосую за джойн.Я тоже за джоинт :)
Использование джоин-а повлечет за собой написание фасада. Тогда у меня 2 варианта, написать мультипоточный доступ или фасад, пока взвешиваю, спасибо за советы, но как я понимаю, лучше данные вынуть вообще в одно приседание, раз такая с ней беда.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38540253
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая-то высосанная из пальца "проблема". На мой взгляд даже не проблема, а абсолютное незнание технологии.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543214
jbond81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУКакая-то высосанная из пальца "проблема". На мой взгляд даже не проблема, а абсолютное незнание технологии.

а мне вот говорили, что SQL CE не рекомендуется использовать на мобильных ус-вах. Там нужен только SQLite.

Почему?
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543234
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jbond81а мне вот говорили, что SQL CE не рекомендуется использовать на мобильных ус-вах. Там нужен только SQLite.
Почему?
Задай этот вопрос тем, кто "говорил".
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543270
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Torre, авторМедленная работа SQL CE
Майдан головного мозга (((
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543283
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУjbond81а мне вот говорили, что SQL CE не рекомендуется использовать на мобильных ус-вах. Там нужен только SQLite.
Почему?
Задай этот вопрос тем, кто "говорил".а СЕ разве живой?:)
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543380
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanа СЕ разве живой?:)

1. CE уже 1.5 года как не обновляется, это наводит на подозрение
2. В роадмапе вообще отсутствует 4 версия поделия.

Напрашивается вывод о том, что игрушка слегонца подпротухла :)
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543429
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

а что для embedded тогда кроме xml файла? только sqllite? Как-то пока не нужно, но для общего развития)
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543501
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanМСУ, а что для embedded тогда кроме xml файла? только sqllite? Как-то пока не нужно, но для общего развития)
Ну получается что да :) http://www.sqlite.org/releaselog/3_8_2.html

P.S. Расстроил ты меня...
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543561
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ2. В роадмапе вообще отсутствует 4 версия поделия.Сроки поддержки продуктов Microsoft SQL Server Compact 4.0
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543614
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ2. В роадмапе вообще отсутствует 4 версия поделия.
Напрашивается вывод о том, что игрушка слегонца подпротухла :)
Сильно подозреваю, что в роадмапе по ссылке перечислено только то, для чего уже определены сроки окончания поддержки (подозреваю - потому что в справке не изложено, по каким причинам тот или иной продукт попадает в роадмап, и потому что в роадмапе отсутствуют не компакт сервера 2008 и 2012).
Хотя я тоже предпочитаю sqlite - просто по причине того, что он функциональнее. SqlCE вообще какой-то совсем уж упрощенный до ниже плинтуса.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543644
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvМСУ2. В роадмапе вообще отсутствует 4 версия поделия.Сроки поддержки продуктов Microsoft SQL Server Compact 4.0
Полезная инфа, внесу себе в рецепты.

Сон Веры ПавловныХотя я тоже предпочитаю sqlite - просто по причине того, что он функциональнее. SqlCE вообще какой-то совсем уж упрощенный до ниже плинтуса.
Ну просто для emdedded задач большего-то особо и не нужно. Хотя тот или иной функционал лишним не будет, согласен.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543809
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

может глупо, но все же. Sqllite LINQ поддерживает?
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543820
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanСон Веры Павловны,

может глупо, но все же. Sqllite LINQ поддерживает?

Разумеется, нет. Он и знать про него не знает. LINQ поддерживают провайдеры под SQLite. Например, этот теоретически можно запихнуть в EF.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543841
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79netivanСон Веры Павловны,

может глупо, но все же. Sqllite LINQ поддерживает?

Разумеется, нет. Он и знать про него не знает. LINQ поддерживают провайдеры под SQLite. Например, этот теоретически можно запихнуть в EF.
безусловно вопрос был о провайдерах. Просто сразу знать какой использовать.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543848
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем, LocalDB, который постоянно развивается, убил CE... Жалко, хорошая embedded database была.

http://www.microsoft.com/en-us/sqlserver/get-sql-server/try-it.aspx#tab2 Additionally, Express customers can test a new LocalDB version for fast, zero-configuration installation.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543910
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУВообщем, LocalDB, который постоянно развивается, убил CE... Жалко, хорошая embedded database была.
Я бы не назвал LocalDB убийцей CE - ему всё же нужен инсталляция, хоть и zero-configuration. Работы с места в карьер после xcopy deployment с ним не выйдет.
...
Рейтинг: 0 / 0
Медленная работа SQL CE
    #38543987
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныЯ бы не назвал LocalDB убийцей CE - ему всё же нужен инсталляция, хоть и zero-configuration. Работы с места в карьер после xcopy deployment с ним не выйдет.
Согласен, инсталляция нужна, но MS это особо, как я понимаю, не парит и им нах не нужен in-process DLL ... Во-вторых, где embedded в основном популярна? Правильно, на планшетах и прочих мобильных девайсах. В том же Windows Phone даже LocalDB запилена. Так что для CE места совсем не осталось.
...
Рейтинг: 0 / 0
Медленная работа 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
35 сообщений из 35, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Медленная работа SQL CE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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