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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В чем различия в SQL-запросах? Попробовал оптимизировать, но получаются 
:(
    Опции темы
Гость_sland
Дата 1.6.2005, 13:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет народу!
Имеется запрос:
Код

SELECT Sum(Entering_Sum),COUNT(E.ID_People) FROM Entering_Info E
WHERE ((Entering_Date>= '01.01.03')
and (Entering_Date< '01.01.05')
and (E.ID_People in (SELECT C.ID_People FROM Customer C where organization=3)))

Попытался его оптимизировать (предыдущий запрос выполняется 40 сек, а следующий-всего 10-15сек):
Код

SELECT Sum(Entering_Sum),COUNT(E.ID_People) FROM Entering_Info E, customer C
WHERE ((Entering_Date>= '01.01.03')
and (Entering_Date< '01.01.05')
and (E.ID_People=C.ID_People and  organization=3))

Почему они выдают разные результаты? Может кто видит логическую ошибку?
Человеческим языком запрос звучит так:
Найти сумму платежей и число людей, их заплативших, за определенный период, причем интересуют только люди из определенной организации.
Информация о людях и организациях, в которых они работают-в таблице Customer, а информация о платежах c кодами людей, их вносивших-в таблице Entering_Info.


  Вверх
SPrograMMer
Дата 3.6.2005, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


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

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



РАЗ:
Цитата
Код

WHERE ((Entering_Date>= '01.01.03')
and (Entering_Date< '01.01.05')

пишется проще:
Код

Where (Entering_Date Between '01.01.03' And '01.01.05')

ДВА:
первый запрос имеет подзапрос, который возвращает ДИАПАЗОН НУЖНЫХ тебе значений, которые затем используются в
Цитата
Код

...E.ID_People in ...

Второй же запрос, объединяя две таблицы производит РЕЛЯЦИОННОЕ УМНОЖЕНИЕ строк первой и второй таблиц, что соответственно производит к некоторому дублированию информации, и вроде бы одно и то же условие теперь выбирает абсоютно другие данные.
Да и есчо, наверное ТРИ, вот это самое
Цитата
Entering_Info E
....
and (E.ID_People in

Делать вовсе ненужно, у тебя в "главном" запросе всего одна таблица, поэтому, ненужно.



Как это дело все же оптимитизировать? счась подумаю может чего и скажу...................



--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
Гость_sland
Дата 6.6.2005, 15:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, что откликнулся, почтенный SPrograMMer!
1. Between мне не подходит, т.к., если я не ошибаюсь, он выдает значения в диапазоне >=...<=, а мне необходимо >=...<. Можно, конечно, перед составлением запроса уменьшат дату на 1, но это не очень удобно.
2. Помоги, пожалуйста, правильно составить. Выражение IN очень медленное и заставляет перебирать по нескольку раз очень большую таблицу.
3. Замечание, видимо, касается введения обозначения Е. Сделал для надежности.
Как все-таки правильно построить запрос? Подскажите, пожалуйста.
  Вверх
Гость_sland
Дата 6.6.2005, 15:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Прошу прощения у всех участников форума!
Нашел ошибку: поле Entering_Sum, оказывается, есть в обоих таблицах и первый запрос считает из таблицы Entering_Info (естесственно), а второй - из Customer.
В Entering_info это поле означает величину конкретного платежа, а в Customer - сумму последнего платежа.

Еще раз прошу прощения.
  Вверх
Гость_Владимир
Дата 15.9.2005, 02:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Самый удобный метод. Создаются рабочие таблицы, куда пишутся времЕнные данные. Для многопльзовательской работы добавляется ключевое поле с уникальным значением, полученным от генератора( можно использовать 1 рабочий на всякую повседневность) Туда выбираются C.Id_People с нужным organization. И выбираются с допусловием WHERE .... AND EXIST(SELECT FOM TEMP t WHERE
T.TEMPKEY=:TEMPKEY AND T.Id_People=E.Id_People)
на ibase.ru есть статьи Попова насчет запросов с WHERE ... IN(...)
  Вверх
Akella
Дата 27.4.2006, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(Гость_sland @  1.6.2005,  13:56 Найти цитируемый пост)
in (SELECT C.ID_People FROM Customer C where organization=3)))

оператор IN не использует индексы в FB версии ниже 2.0 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




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


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

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