powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Оптимизация запроса
13 сообщений из 13, страница 1 из 1
Оптимизация запроса
    #38131152
Meshel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день!

Возник такой вопрос.
Использую Devart.Data.Linq.
Написал запрос данных из БД, при его выполнении часто возникает потеря соединения с базой, нагрузка на сеть. Думал, что это из-за его громоздкости (в цикле выполняется соединение двух таблиц).
Но иногда коннект с базой отваливается на простых запросах, типа просмотреть все данные из таблицы, без всяких условий.
И возникают ощибки типа:
"Не удается прочитать данные из транспортного соединения: Программа на вашем хост-компьютере разорвала установленное подключение."
И вот такое иногда проскакивает, но это при выполнении громоздкого запроса:
" StackTrace
в Devart.Data.Linq.LinqCommandExecutionException.CanThrowLinqCommandExecutionException(String message, Exception e)
в Devart.Data.Linq.DataProvider.a(c1 A_0, Object[] A_1)
в Devart.Data.Linq.DataProvider.b(c1 A_0, Object[] A_1)
в Devart.Data.Linq.Engine.a5.a(IProvider A_0, Object[] A_1)
в Devart.Data.Linq.Engine.DataQuery`1.h()
в System.Linq.SystemCore_EnumerableDebugView`1.get_Items()"

Подскажите, пожалуйста, в чем может быть дело?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38131226
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Meshel,

Покажите джоин в цикле :(
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38131234
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"... простых запросах ,
типа просмотреть все данные из
таблицы, без всяких условий .... "
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38131757
Meshel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Простые запросы - это вот такие:
Код: c#
1.
2.
from m in table
select m


и вот тот самый громадный запрос:
Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
цикл for по дате (dt)
{
цикл for по k (k.type)
                    {       selectchs =
                                    from tCountry in table.country
                                        where (tCountry.countrName == addressCountry || tCountry.countrName == tCountry.countrName || tCountry.countrName == null)
                                    from tCity in table.cities
                                        where (tCity.cityName == addressCity || tCity.cityName == tCity.cityName || tCity.cityName == null)
                                    from tStreets in table.streets
                                        where (tStreets.streetName == addressStreet || tStreets.streetName == tStreets.streetName || tStreets.streetName == null)
                                    from tParent in table.parent
                                        where tParent.countrId == tCountry.countrId &&
                                              tParent.cityId == tCity.cityId &&
                                              tParent.streetId == tStreets.streetId &&
                                              (tParent.parentId.ToString() == parentName || tParent.parentId == tParent.parentId || tParent.parentId == null) &&
                                              (tParent.home == home || tParent.home == tParent.home || tParent.home == null) &&
                                              (tParent.flat == flat || tParent.flat == tParent.flat || tParent.flat == null) &&
                                              (tParent.Name == name || tParent.Name == tParent.Name || tParent.Name == null) &&
                                              (tParent.Phone == phone || tParent.Phone == tParent.Phone || tParent.Phone == null)
                                    from tChild in table.childs
                                        where tParent.parentId == tChild.parentId && 
                                    join sv in table.games on tChild.chId equals sv.chId into stmp 
                                    from ch in stmp.DefaultIfEmpty()
                                        where ch.Date == dt && ch.tpId == k.type
                                    from tGameProp in table.gameProp
                                        where ch.propId == tGameProp.propId
                                    from tColors in table.colors 
                                        where ch.cId == tColors.cId && 
                                        (
                                              tGameProp.charId == (dictionChar.ContainsKey(1) ? 1 : -1) ||
                                              tGameProp.charId == (dictionChar.ContainsKey(2) ? 2 : -1) ||
                                              tGameProp.charId == (dictionChar.ContainsKey(3) ? 3 : -1) ||
                                              tGameProp.charId == (dictionChar.ContainsKey(4) ? 4 : -1)) &&
                                              tGameProp.yearId == (yearId_ == 2 ? 1 : 3) 
                                    select new listchs
                                    {
                                        countrName = tCountry.countrName,
                                        cityName = tCity.cityName,
                                        streetName = tStreets.streetName,
                                        home = tParent.home,
                                        flat = tParent.flat,
                                        child = tChild.chId,
                                        parnt = tParent.Name,
                                        Phone = tParent.Phone,
                                        color = tGameProp.Color,
                                    };
					}
}

...
Рейтинг: 0 / 0
Оптимизация запроса
    #38132058
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Meshel, по "простому" ни чего не скажу... возможно много данных, возможно блокировки... по второму - это звездец и к тому же, в цикле... попробуйте сделать процедуру... ну либо посмотрите на трассу (сформированный sql запрос)... Возможно станет понятно, что нужно подкрутить... P.S.: а Вы уверены, что последний запрос выдает то, что нужно? Какой-то он, мягко говоря, странный...
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38132737
Meshel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, что откликнулись.
Я согласен с характеристикой последнего запроса.
В нем несколько слов "from", из-за этого в результирующем sql много cross join и 1 outer join.Читал, что join-ны сами по себе грузят сильно. Но у меня грубо говоря, две таблицы, нужно вытянуть все данные из левой и из правой, учитывая, что по некоторым данным в левой нет данных из правой таблицы, вроде как без left join не обойтись.
Я уже думал, может данные вытягивать не все сразу, а хотя бы построчно, но ускорит ли это выполнение запроса.
Или же, может быть, вывести таблицу всю целиком, без join-на, а потом из нее дергать нужные данные, исходя из входных условий, ведь это будет уже не со стороны БД происходить (применение условий к коллекции данных,например,типа Iqueryable), или я ошибаюсь?
И еще вариант, т.к. количество столбцов динамическое, попробовать использовать предикаты, только вот не знаю, пойдет ли такой запрос на разные СУБД (MySQL,Oracle,SQLite)?
Я использую LinqConnect Professional (ORM фреймворк) от Devart.
А выдает запрос вроде как то, что нужно.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38132860
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Meshel,

Приведи схему данных, наборы данных и результирующий набор.

PS. По поводу того что ты написал - не делай так.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38134151
Meshel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Вкладываю необходимую информацию, надеюсь на Вашу помощь.
Там запрос на MySQL, чтоб показать, что должно получится, хотя если писать одним запросом, то получается больше данных, чем должно быть, т.к. в каждоим leftjoin участвуют поля charId,тогда и по ним нужно давать внешнюю связку
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38134541
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Meshel,

посмотрел архив, сгенери пожалуйста скрипт создающий этот кусок схемы с констрейтами и прочим. для каждой таблицы выгрузи в виде inserto'ов по небольшому куску данных 10-15 строчек. прогони скрипт, чтобы все создавалось исоздавалось само.

и в кратце по каждой таблице сделай описание, что она означает. а потом в этой терминологии сформулируй, что нужно получить. чутку схему понял, но ты привел две картинки с двумя разными результатами, какой из них верный или оба не правильные, тогда напиши список с колонками, что нужно получить от руки на основе данных в инсертах пара/тройка строчек?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38136126
Meshel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Высылаю архив с более подробным описанием.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38141728
Meshel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какие-нибудь будут предложения?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38141759
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MeshelКакие-нибудь будут предложения?

бывает такое что соединение рвётся на самом первом запросе?
если нет то на каком примерно, либо через сколько времени работы?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38142029
Meshel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Соединение рвется в debug пошаговом режиме. Когда запускаю модуль и просматриваю данные, был обрыв от силы раз-два, при повторном обновлении запрос проходил, грид отображал данные.
В debug режиме в основном разрыв был в цикле типа:
Код: c#
1.
foreach (listVals v in selectVals)

, selectVals - результат запроса.
В принципе, я читал на англоязычных сайтах, что в таком режиме это возможно. Просто я подумал, может, можно как-нибудь оптимизировать запрос, не поломается ли что при таких цикличных обращениях к БД.
Или может сделать выборку всех значений из базы (учитывая входные условия), а потом на стороне модели уже в цикле формировать нужный вид представления данных, используя лямба-выражения.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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