Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Uniskull
0 / 0 / 1
Регистрация: 28.06.2012
Сообщений: 71
1

Ускорение выборки данных

17.07.2012, 18:04. Просмотров 1363. Ответов 12
Метки нет (Все метки)

Здравствуйте! У меня есть таблица(Table1), которая содержит имя-фамилия-ид города.

Я использую DataReader для прочтения всей таблицы(Table1)
C#
1
2
3
4
5
6
SqlCeDataReader reader = cmd.ExecuteReader();
 
while (reader.Read())
{
// ...............
}
Мне надо получивший ид города изменить его на имя города которая находится в другой таблице(Table2).

Этот кусок кода правильный(просто есть подозрение что запросы стали медленнее выполнятся)?
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
using (var cmd =
                    new SqlCeCommand("Select * From Table1 WHERE" + queryfinall, conn))
                {
                    cmd.Connection = conn;
 
 
                    SqlCeDataReader reader = cmd.ExecuteReader();
 
                    while (reader.Read())
                    {
                        var cmd2 = conn.CreateCommand();
                        cmd2.CommandText = string.Format("Select Region From Table2 Where ID={0}", reader[6]);
                        cmd2.Connection = conn;
 
                        cmd2.ExecuteNonQuery();
 
                        var reader2 = cmd2.ExecuteReader();
 
                        var cmd3 = conn.CreateCommand();
                        cmd3.CommandText = string.Format("Select Location From Table3 Where ID={0}", reader[7]);
                        cmd3.Connection = conn;
 
                        cmd3.ExecuteNonQuery();
 
                        var reader3 = cmd3.ExecuteReader();
 
                        reader2.Read();
                        reader3.Read();
 
                        ContactCollection.Add(new DataTable
                        {
                           //.........
                        });
                    }
                    reader.Close();
                    conn.Close();
                }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2012, 18:04
Ответы с готовыми решениями:

Выборки из базы данных
Скажите как реализовать 3 выборки из базы данных: - все книги; - книги, на...

Пример выборки данных из БД
Напишите пример как можно организовать выборку данных из БД с помошью ADO.NET...

Ускорение считывания из базы данных
Добрый день, подключил базу данных основанную на службах в свою программу,...

Составить условие для выборки данных
Всем Привет!! Имеется таблица в БД. в которой следующие поля (id,...

C# запрос выборки данных из диапазона дат datetime
Мой запрос @"SELECT * FROM " + aNameTable + " WHERE Date BETWEEN #" + value1 +...

12
ksk
613 / 481 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
17.07.2012, 23:42 2
Проще было бы составной SELECT написать, чтобы получить в DataReader сразу с названиями.
(Правда, не знаю, работают ли в СЕ составные селекты и джойны)
Если получится обхединить данные из таблиц на стороне СУБД - по любому быстрее будет.
0
Uniskull
0 / 0 / 1
Регистрация: 28.06.2012
Сообщений: 71
18.07.2012, 00:29  [ТС] 3
Спасибо попробую

Добавлено через 39 минут
Цитата Сообщение от ksk Посмотреть сообщение
селекты и джойны
Не, запрос долго выполняется, есть другие варианты?
0
ksk
613 / 481 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
18.07.2012, 05:29 4
Других вариантов не знаю.
А таблички индексированные?
А связь между подзапросами по индексированным полям происходит?
0
Uniskull
0 / 0 / 1
Регистрация: 28.06.2012
Сообщений: 71
18.07.2012, 10:29  [ТС] 5
Цитата Сообщение от ksk Посмотреть сообщение
А таблички индексированные?
Да

Цитата Сообщение от ksk Посмотреть сообщение
А связь между подзапросами по индексированным полям происходит?
Это как понять? Новичок
0
nio
5958 / 3364 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
18.07.2012, 10:38 6
Цитата Сообщение от Uniskull Посмотреть сообщение
Не, запрос долго выполняется, есть другие варианты?
запрос с JOIN будет выполнятся быстрее, чем твоя выборка двумя ридерами.
И что значит долго? Сколько записей возвращает запрос? за какое время?
0
Uniskull
0 / 0 / 1
Регистрация: 28.06.2012
Сообщений: 71
18.07.2012, 10:50  [ТС] 7
Цитата Сообщение от nio Посмотреть сообщение
запрос с JOIN будет выполнятся быстрее, чем твоя выборка двумя ридерами.
Верю


Цитата Сообщение от nio Посмотреть сообщение
И что значит долго? Сколько записей возвращает запрос? за какое время?
951902 Записей за >40 сек. это быстро? Есть какой нибудь вариант побыстрее?
SQL
1
2
3
4
5
6
SELECT Person_Table.FirstName, Person_Table.LastName, Person_Table.MiddleName, Person_Table.PhonePrefix, Person_Table.PhoneNumber, Region_Table.Region, Location.LocationName
FROM Person_Table
INNER JOIN Region_Table
ON Person_Table.Region=Region_Table.ID
INNER JOIN location
ON Person_Table.Location=location.LocationID
Без JOIN выполняется 16 сек.
SQL
1
SELECT * FROM Table1
Добавлено через 1 минуту
С Reader думаю будет еще медленнее выполнятся запрос.

Добавлено через 1 минуту
Я потом буду добавлять конструкцию WHERE но мне сейчас надо просто так оптимизировать скорость выполнения запроса.
0
nio
5958 / 3364 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
18.07.2012, 10:57 8
Uniskull, а кому может понадобиться такое количество данных?
почитай Разработка приложений, ориентированных на работу с большими объемами данных

Варианты решения:
1 фильтровать выборку: выводить пользователю только тот набор данных, с которым он будет работать, а не всю "простыню"
2 организовать загрузку частями в фоновом потоке с использованием Merge

Добавлено через 2 минуты
Цитата Сообщение от Uniskull Посмотреть сообщение
Я потом буду добавлять конструкцию WHERE но мне сейчас надо просто так оптимизировать скорость выполнения запроса.
запрос у тебя выглядит нормально, оптимизировать там нечего, проверь созданы ли индексы на ключевые столбцы. Если да, то быстрее не будет, слишком много данных

Добавлено через 1 минуту
надеюсь идентификаторы int
0
Uniskull
0 / 0 / 1
Регистрация: 28.06.2012
Сообщений: 71
18.07.2012, 11:07  [ТС] 9
Цитата Сообщение от Uniskull Посмотреть сообщение
Мне надо получивший ид города изменить его на имя города которая находится в другой таблице(Table2).
Слушай а у меня другая идея. А что если я заранее вместо ИД Города изменю его на само название города. То есть буду создать столбец(например Город) в Table1, получу ИД Города из Table1, проверю если совпадает с ИД Table2, получу название города и записывать буду в столбец Город в Table1

Пример:
Table1
Имя - Фамилия - Ид Города
Иван - Попов - 23

Table2
Ид Города - Название Города
23 - Москва

Результат
Имя - Фамилия - Название Города
Иван - Попов - Москва
0
nio
5958 / 3364 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
18.07.2012, 11:15 10
Цитата Сообщение от Uniskull Посмотреть сообщение
А что если я заранее вместо ИД Города изменю его на само название города.

а как же 3 НФ?
0
Uniskull
0 / 0 / 1
Регистрация: 28.06.2012
Сообщений: 71
18.07.2012, 11:18  [ТС] 11
Цитата Сообщение от nio Посмотреть сообщение
а как же 3 НФ?
А же не знаю как лучше будет, если потеряю столбец ид города мне все равно, вместо ид города будет само название города и вместо 2-х таблиц будет 1.
0
nio
5958 / 3364 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
18.07.2012, 11:29 12
Uniskull, я тебе уже показал 2 варианта (наиболее приемлем 1-й) решения проблемы. Чем они тебя не устраивают?
Объединение таблиц решит проблему выборки, но добавит ряд новых в области обеспечения целостности данных.
0
ksk
613 / 481 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
18.07.2012, 11:32 13
Если вместо ID (целочисленного, я надеюсь) индекса будет стоять строка, по которой ты будешь осуществлять выборку, то такая схема а) неоптимальна б) гораздо медленнее работает.

Когда ты джойнишь, тв получаешь сборный датасет, содержащий уже набранный запросом нужный набор полей.
0
18.07.2012, 11:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2012, 11:32

Получение данных из таблицы на основе ранее совершенной выборки
Всем привет. В общем систуация такова. СУБД - MySql Работаю с базой через...

Создание универсального метода выборки из БД и прикрепления в качестве источника данных к комбобоксу
Подскажите пожалуйста! Я в DataSet ResultData гружу данные из БД. А затем...

Ускорение добавления данных в DataTable
Добрый день! Читаю файл, нужно быстро вставлять каждую строчку в таблицу...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru