Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Стоит ли заменить сотни маленьких запросов, одним большим? 
:(
    Опции темы
ivanfain
Дата 17.3.2012, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



Привет ребята.
Использую mssql, но желательно, чтобы запрос был универсальным.
Я разрабатываю элемент управления, который будет содержать определённое количество ячеек. От 100 до 1000 а может и более. Каждая ячейка делает, уникальный запрос к безе, точнее к DataSet. В каждом запросе уникальное сочетание фильтров. На данный момент элемент управления на несколько секунд замирает. Судя по всему, нужно поработать над производительностью. Идея такая, создать запрос, который вернёт все необходимые данные за один раз. Я полагаю, что очень много времени тратится на создание запроса-отправку-парсинг запроса в mssql.
1.Как вы думаете, если я вынесу все запросы в один, поможет ли это мне существенно повысить производительность?
2.Если да, то, как составить запрос таким образом, чтобы данные удобно было извлечь в программу, использую c#? Сейчас у меня получается что-то на подобии “select Count(*) from tb where column1=’text1’”. В результате я получаю список rows, которые очень удобно распарсить. А удобно вывести данные при построении большого запроса, и как этот запрос должен выглядеть?
Допустим, я хочу чтобы в результате получилась таблица, где column1 – некий мой уникальный Id, который я передал в запрос и по которому найду данные для своей ячейки. И column2 – некий результат “select Count(*) from tb where column1=’text1’”.
Надеюсь, суть изложил понятно. Спасибо.

PM MAIL   Вверх
Fortop
Дата 17.3.2012, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 2
Всего: 42



Цитата(ivanfain @  17.3.2012,  15:59 Найти цитируемый пост)
Я полагаю, что очень много времени тратится на создание запроса-отправку-парсинг запроса в mssql.

А вы не полагайте, а займитесь профилированием




--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ivanfain
Дата 17.3.2012, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



Я бы с удовольствием занялся бы, только запросы составить не получается. 
PM MAIL   Вверх
Fortop
Дата 17.3.2012, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 2
Всего: 42



Цитата(ivanfain @  17.3.2012,  18:39 Найти цитируемый пост)
только запросы составить не получается.  

Ну для универсальности придется использовать что-то вроде LINQ или Hibernate

Код

(from алиас in источникДанных 
   select алиас).Skip(50).Take(50);

А так запросы будут весьма различны
MySQL
Код

SELECT * FROM таблица WHERE условия LIMIT отсюда, до сюда;

MSSQL (не совсем эквивалент запроса выше. Эквивалент будет сложнее)
Код

SELECT TOP сколько-то * FROM таблица




--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ivanfain
Дата 17.3.2012, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



Мне бы получить таблицу таких данных
col1                                                                      col2
некоте значение, переданное в запрос            результат выполнения select Count(*) from tb where (некоторое условие)

Добавлено через 1 минуту и 46 секунд
Выводимые данные должны выглядеть примерно так
col1 col2
1     23 
2     0
3     0
4     12
5     7
6     3
7     0
8     0

Добавлено через 3 минуты и 22 секунды
Linq может получится использовать, если пойму как запрос будет выглядеть в T-SQL.
Но может и заморачиваться не стоит? Может не даст прироста производительности?
PM MAIL   Вверх
ivanfain
Дата 17.3.2012, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



На данный момент пришёл к такому результату
Код

Select Count=(Select Count(*) from TB where Item='X1');
Select Count=(Select Count(*) from TB where Item='X2');

Однако в данном случае я получаю две таблицы в DataSet. А лучше бы я получал записи. 
И мне вот не ясно, эти таблицы в DataSet это уже результат выполнения запроса, или запросы пойдут в базу после того как я обращусь к строкам таблицы?
PM MAIL   Вверх
Fortop
Дата 17.3.2012, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 2
Всего: 42



Цитата(ivanfain @  17.3.2012,  21:38 Найти цитируемый пост)
Select Count=(Select Count(*) from TB where Item='X1');
Select Count=(Select Count(*) from TB where Item='X2');

GROUP BY не? не пробовали?

Код

SELECT Count(*), Item FROM таблица WHERE Item IN (тут подзапрос или список) GROUP BY



Цитата(ivanfain @  17.3.2012,  21:38 Найти цитируемый пост)
И мне вот не ясно, эти таблицы в DataSet это уже результат выполнения запроса, или запросы пойдут в базу после того как я обращусь к строкам таблицы? 

Эм, это вам надо обращаться к своему языку на котором вы пишете.
Данный топик совсем не о том.

Это сообщение отредактировал(а) Fortop - 17.3.2012, 23:06


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ivanfain
Дата 18.3.2012, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.3.2012

Репутация: нет
Всего: нет



Цитата(Fortop @  17.3.2012,  23:06 Найти цитируемый пост)
Цитата(ivanfain @  17.3.2012,  21:38 )
Select Count=(Select Count(*) from TB where Item='X1');
Select Count=(Select Count(*) from TB where Item='X2');

GROUP BY не? не пробовали?

код SQL
1:
SELECT Count(*), Item FROM таблица WHERE Item IN (тут подзапрос или список) GROUP BY

Совсем не понял как он может мне помочь. Например написал я такой запрос.
Код

select count(*), Item from Tab where Item in (select Item from Tab) group by Item

Здесь задействуется только один фильтр. Я могу конечно их добавить хоть 10, но один запрос я собираюсь использовать с одним набором фильтров, например по Item, а в другом Item даже не будет, будет Company. Как тогда?
PM MAIL   Вверх
Fortop
Дата 18.3.2012, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 2
Всего: 42



Цитата(ivanfain @  18.3.2012,  14:39 Найти цитируемый пост)
Здесь задействуется только один фильтр. Я могу конечно их добавить хоть 10, но один запрос я собираюсь использовать с одним набором фильтров, например по Item, а в другом Item даже не будет, будет Company. Как тогда? 

Тогда рисуйте динамические запросы


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.