Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676

Запрос данных из нескольких таблиц при больших обьемах

28.09.2020, 14:07. Показов 4111. Ответов 64
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

есть два варианта выборки либо посредством EntityFramework

C#
1
2
3
var companies = context_.Nodes
                    .Include(c => c.MetaDatas) 
                    .ToList();
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class MetaData
    {
        [Key]
        public int Id { get; set; }
 
        [Index, Required]
        public int ConfigerationNodeId { get; set; }
        public ConfigerationNode ConfigerationNode { get; set; }
 
        [Index, Unique, Required]
        public string Name { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class ConfigerationNode
    {
        [Key]
        public int Id { get; set; }
        [Unique, Index, Required]
        public string Name { get; set; }
        [Required]
        public bool IsRequisites { get; set; }
        [Required]
        public bool IsTableParts { get; set; }
        [Required]
        public bool IsForms { get; set; }
        [Required]
        public bool IsLayouts { get; set; }
        [Required]
        public bool IsValues { get; set; }
        [Required]
        public bool IsMeterings { get; set; }
        [Required]
        public bool IsResources { get; set; }
 
        public List<MetaData> MetaDatas { get; set; }
    }
либо запрашивать первую таблицу и в цикле в каждой интеграции запрашивать данные из второй?

что будет менее затратно по времени, менее затратно по ресурсам , и более правильным и удобным?

Добавлено через 17 минут
Забыл написать использую SQLITE

Добавлено через 3 часа 42 минуты
если я верно понимаю такие реализации делают запрос к бд с левым и или правым соединением?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.09.2020, 14:07
Ответы с готовыми решениями:

Запрос данных из нескольких таблиц
Существует несколько таблиц, что будет работать быстрее и менее нагружать сервер? 1) Несколько небольших параллельно запущенных...

Посоветуйте принтер для печати в больших обьемах
Привет подскажите принтер лазерный чтобы печатать в день 100 листов примерно он должен быстро печатать он должен быть не дорогим и...

Запрос на вывод данных из нескольких таблиц
Помогите, пожалуйста. Пытаюсь вывести запрос на вывод данных из 4 талиц Вот код &lt;?php /* Соединяемся с базой данных */ ...

64
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
28.09.2020, 15:06  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
Не совсем верно поставленный вопрос. Я имел в виду штраф производительности который вносит сама ORM. Метод Include выгребает связанные данные. Но вытягивает все поля таблицы. Если вам нужно меньше полей, то очевидно, остальные поля будут избыточным мусором, который нагрузит СУБД и ваше приложение совершенно впустую.
ну я это и имел в виду (Извините у меня с терминологией косяк полный ) :-)

Добавлено через 1 минуту
Цитата Сообщение от Sanya2019 Посмотреть сообщение
не в коем случае не хотел обидеть или указать этим на его уровень! :-)
просто не понимаю его вопроса видимо!
признаюсь честно вот у меня уровень ниже плинтуса )
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
28.09.2020, 15:07
Цитата Сообщение от Sanya2019 Посмотреть сообщение
признаюсь честно вот у меня уровень ниже плинтуса )
Это временное. В случае наличия мозга головы уровень неизбежно повысится.
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
28.09.2020, 15:12  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
var ТоварыИКартинки = context_.Товары
                    .Select(x => new ItemsDto
                     {
                          Id = x.Id,
                          Title = x.Title,
                          Images = x.Картинки.Select(y =>
                          {
                             Url = y.Url
                          })
                     })
                    .ToList();
обязательно ItemsDto (DTO) модель ? или можно модель БД указать?

и какой тип в данным запросе Images ?

Добавлено через 49 секунд
Цитата Сообщение от Sanya2019 Посмотреть сообщение
обязательно ItemsDto (DTO) модель ? или можно модель БД указать?
и какой тип в данным запросе Images ?
я пока пытаюсь понять разобраться на уровне модели и контекста БД

а потом уже с ДТО )
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
28.09.2020, 15:15
Цитата Сообщение от Sanya2019 Посмотреть сообщение
обязательно ItemsDto (DTO) модель ? или можно модель БД указать?
Обязательно использовать отдельный класс. EF пошлёт вас куда подальше, если попытаетесь использовать класс сущности. Это правильное поведение, адекватное.

Цитата Сообщение от Sanya2019 Посмотреть сообщение
и какой тип в данным запросе Images ?
Класс с одним свойством Url. Можно и просто коллекцию строк сделать. В данном случае это будет приемлемо.

Добавлено через 1 минуту
Цитата Сообщение от Sanya2019 Посмотреть сообщение
я пока пытаюсь понять разобраться на уровне модели и контекста БД
Я понимаю. Просто сразу хочу до вас донести правильную практику использования Entity Framework. Хотя самая лучшая практика его использования - не использовать его вовсе) А использовать Linq2Db или голые запросы + Dapper.NET.
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
28.09.2020, 15:20  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Обязательно использовать отдельный класс. EF пошлёт вас куда подальше, если попытаетесь использовать класс сущности. Это правильное поведение, адекватное.
понятно!

а если я не знаю какие поля мне понадобятся

получается что например для тех или инных задачь в разных местаз мне придется делать столько же DTO классов сколько различных колеекций полей мне понадобится?

Добавлено через 52 секунды
Цитата Сообщение от Usaga Посмотреть сообщение
Я понимаю. Просто сразу хочу до вас донести правильную практику использования Entity Framework. Хотя самая лучшая практика его использования - не использовать его вовсе) А использовать Linq2Db или голые запросы + Dapper.NET.
я изначально стал его (EF) использовать и ка кто не охото уходить от него )

Добавлено через 2 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Обязательно использовать отдельный класс. EF пошлёт вас куда подальше, если попытаетесь использовать класс сущности. Это правильное поведение, адекватное.
либо напрмиер я пишу приложение в котором в Табличную часть пользователь должен иметь возможность сам выбирать нужные поля и отборы в режиме уже приложения как тогда обходиться с DTO?

ведь получается коллекция получится динамической?
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
28.09.2020, 15:33
Цитата Сообщение от Sanya2019 Посмотреть сообщение
получается что например для тех или инных задачь в разных местаз мне придется делать столько же DTO классов сколько различных колеекций полей мне понадобится?
Да. И это нормально. Такой DTO есть отражение выборки из базы. Вы же не делаете SELECT * в каждом месте, где вам какие-то данные понадобились? Поэтому и уникальные DTO под каждый запрос вам не должны удивлять.

Цитата Сообщение от Sanya2019 Посмотреть сообщение
я изначально стал его (EF) использовать и ка кто не охото уходить от него )
Я и не настаиваю бросать EF. Просто предупреждаю, что это не лучшая ORM.

Цитата Сообщение от Sanya2019 Посмотреть сообщение
либо напрмиер я пишу приложение в котором в Табличную часть пользователь должен иметь возможность сам выбирать нужные поля и отборы в режиме уже приложения как тогда обходиться с DTO?
В таком случае вам EF не подходит. Это тоже нормально.
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
28.09.2020, 15:35  [ТС]
и сново у меня тупняк (

C#
1
2
3
4
5
6
7
8
9
10
11
namespace SQLiteSample
{
    public partial class Form1
    {
        public interface ItemsDto
        {
            int Id { get; }
            string Title { get; } 
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
namespace SQLiteSample
{
    public partial class Form1
    {
        public interface IMetaDatasDto
        {
            string Title { get; }
 
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using (var context_ = new ConfigContext())
            {
 
                var companies = context_.Nodes.Select(x => new ItemsDto // здесь сплошная краснота (
                    {
                        Id = x.Id,
                        Title = x.Title,
                        IMetaDatasDto = x.MetaDatas.Select(y =>
                        {
                            Title = y.Title
                          })
                    })
                    .ToList();
            }
(Не удачется создать экземпляр абстрактного класса или интерфейса

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
В таком случае вам EF не подходит. Это тоже нормально.
понятно но это уже совсем другая история :-)
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
28.09.2020, 15:39
Лучший ответ Сообщение было отмечено Sanya2019 как решение

Решение

Sanya2019,

C#
1
public interface ItemsDto
=>

C#
1
public class ItemsDto
Добавлено через 3 минуты
C#
1
2
3
4
5
6
7
        public class ItemsDto
        {
            public int Id { get; set; }
            public string Title { get; set; } 
 
            public IEnumerable<MetaDatasDto> Metadata { get; set; }
        }
C#
1
2
3
4
5
6
7
8
9
10
                var companies = context_.Nodes.Select(x => new ItemsDto // здесь сплошная краснота (
                    {
                        Id = x.Id,
                        Title = x.Title,
                        Metadata = x.MetaDatas.Select(y =>
                        {
                            Title = y.Title
                         }).ToList()
                    })
                    .ToList();
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
28.09.2020, 15:51  [ТС]
C#
1
2
3
4
5
6
7
8
9
var companies = context_.Nodes.Select(x => new ItemsDto // здесь сплошная краснота (
                {
                    Id = x.Id,
                    Title = x.Name,
                    Metadata = x.MetaDatas.Select(y =>
                    {
                        Title = y.Name// имя Title  не существует в данном контексте
                    }).ToList()//имя ToList не существует в данном контексте
                }).ToList();
C#
1
2
3
4
5
6
7
8
9
10
11
12
using System.Collections.Generic;
 
namespace SQLiteSample
{
    public class ItemsDto
    {
        public int Id { get; set; }
        public string Title { get; set; }
 
        public IEnumerable<IMetaDatasDto> Metadata { get; set; }
    }
}
C#
1
2
3
4
5
6
7
8
namespace SQLiteSample
{
        public class IMetaDatasDto
        {
            string Title { get; set; }
 
        }
}
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
28.09.2020, 16:00
Цитата Сообщение от Sanya2019 Посмотреть сообщение
Title = y.Name// имя Title  не существует в данном контексте
Потому, что свойство нужно объявить публичным:

C#
1
2
3
4
5
6
7
namespace SQLiteSample
{
        public class IMetaDatasDto
        {
            public /*вот так*/ string Title { get; set; }
        }
}
Добавлено через 1 минуту
Я так понимаю, что вам нужно почитать учебник по языку.
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
28.09.2020, 16:08  [ТС]
C#
1
2
3
4
5
6
7
8
9
 var companies = context_.Nodes.Select(x => new ItemsDto // здесь сплошная краснота (
                {
                    Id = x.Id,
                    Title = x.Name,
                    Metadata = x.MetaDatas.Select(y => new IMetaDatasDto// не хватало
                    {
                        Title = y.Name
                    }).ToList()
                }).ToList();
запрос выполнился

всего записей у меня 150 000 в таблице MetaDatas а в Nodes 5

на каждый нод в где то по 20 000 метадата

запрос делался 1минуту и 20 секунд (

памяти заняло 2 с лишний гиг

но запрос выполнен верно но слишком много ресурсов и времени (

это никак не исправить?

Добавлено через 2 минуты
C#
1
2
3
var companies = context_.Nodes
                    .Include(c => c.MetaDatas)  // добавляем данные по пользователям
                    .ToList();
занял 2480 гиг аперативы но при этом выполнялся 48 секунд

отчего так?
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
28.09.2020, 16:09
Цитата Сообщение от Sanya2019 Посмотреть сообщение
это никак не исправить?
Исправить очень легко: не выгребать 150К записей. Реально, какому пользователю нужно столько данных перед глазами? Это уже не вопрос Entity Framework.
1
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
28.09.2020, 16:12  [ТС]
странно как то (

еще раз повторил

C#
1
2
3
4
5
6
7
8
9
 var companies_ = context_.Nodes.Select(x => new ItemsDto // здесь сплошная краснота (
                {
                    Id = x.Id,
                    Title = x.Name,
                    Metadata = x.MetaDatas.Select(y => new IMetaDatasDto
                    {
                        Title = y.Name
                    }).ToList()
                }).ToList();
выполнился за 8 сек пространство заняло то же но 8 секунд это уже хорошо но с чем было связано предыдущее время (

Добавлено через 59 секунд
Цитата Сообщение от Usaga Посмотреть сообщение
Исправить очень легко: не выгребать 150К записей. Реально, какому пользователю нужно столько данных перед глазами? Это уже не вопрос Entity Framework.
не возможно (

если это скажем дерево какое то и нужно его показать? )))

конечно как вариант запрашивать когда разворачиваем нод ? вы это имете в виду?

Добавлено через 33 секунды
Цитата Сообщение от Usaga Посмотреть сообщение
Исправить очень легко: не выгребать 150К записей. Реально, какому пользователю нужно столько данных перед глазами? Это уже не вопрос Entity Framework.
но я всего лишь тестирую на скажем так нагрузку )))
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
28.09.2020, 16:13
Цитата Сообщение от Sanya2019 Посмотреть сообщение
если это скажем дерево какое то и нужно его показать? )))
Подгружать данные по мере необходимости, когда ноды разворачивают? Согласитесь, что выгребать 150К записей - конина.
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
28.09.2020, 16:17  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Подгружать данные по мере необходимости, когда ноды разворачивают? Согласитесь, что выгребать 150К записей - конина.
да согласен!

но я всеголишь тестирую что бы понять что быстрее выполняется

но честно говоря если за 8 сек 150К выводит это неплохо!

правда памяти сжирает это не есть хорошо

да и помему бы и нет?

если один раз залить столько записей? пусть и сожрет
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
28.09.2020, 16:19
Sanya2019, если уши краснеть начнут, когда пользователи начнут материть, то не жалуйтесь)
1
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
28.09.2020, 16:25  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Sanya2019, если уши краснеть начнут, когда пользователи начнут материть, то не жалуйтесь)
ок)

Добавлено через 39 секунд
как прибить кеш когда он мне уже не нужен?
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
28.09.2020, 16:31
Sanya2019, кеш контекста? Он не используется, когда вы используете проекции (Select). Плюс, есть метод AsNoTracking.
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
28.09.2020, 16:44  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
кеш контекста? Он не используется, когда вы используете проекции (Select). Плюс, есть метод AsNoTracking.
чем чревато не использование AsNoTracking?
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
28.09.2020, 16:48
Sanya2019, просадкой производительности.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.09.2020, 16:48

Запрос на выборку данных из нескольких таблиц в одну
Здравствуйте! В общем, проблема такая.. Нужно мне составить отчет, который содержит данные из нескольких таблиц. С этим проблем нет,...

SQL запрос в VBA на выборку данных из нескольких таблиц mdb
Добрый день. Есть база mdb с несколькими таблицами: Регистр - общая таблица с хранением операций деятельности предприятия. Поля...

Запрос на выборку из таблицы при совпадении с данными нескольких таблиц
В последнее время очень много почерпнул из форума. И снова обращаюсь к гуру с вопросом: Запрос на выборку из таблицы при совпадении с...

Медленный запрос для 2 больших таблиц
Есть 2 таблицы Table1 (1 млн записей) и Тable2 (10 млн записей) Свзяь между таблицами один ко многим. Нужно вытащить определнное...

Объединение данных из нескольких таблиц одинаковых таблиц
Добрый день! Помогите с запросом есть у меня таблицы которые имеют одинаковую структуры полей Есть вариант упростить запрос, если у...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru