Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Подскажите что эффективнее  (Прочитано 11853 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Waldemar
Гость
« : 23-08-2005 05:01 » 

Подскажите пожалуйста, какой запрос будет эффективнее.

Есть таблица, Table из 160 строк, нужно реаизовать следующий запрос

Select *
from Table, Table as Table1, Table as Table2, Table as Table3
Where (Table.id = 100) and (Table1.id = 101) and (Table2.id = 102) and (Table3.id = 103);

Мне кажется, что следующий запрос эффективнее:

Select *
from (Select * from Table Where Table.id = 100) as Table_0, (Select * from Table Where Table.id = 101)  as Table_1,
       (Select * from Table Where Table.id = 102) as Table_2, (Select * from Table Where Table.id = 103) as Table_3;
« Последнее редактирование: 23-08-2005 11:25 от Waldemar » Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #1 : 23-08-2005 05:23 » 

а если так
select * from table where table.id in  (100,101,102,103)

или я чего не доглняю?
Записан

I Have Nine Lives You Have One Only
THINK!
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 23-08-2005 05:42 » 

или так:
select * from table where table.id between 100 and 103
Записан

С уважением, Oldy.
Waldemar
Гость
« Ответ #3 : 23-08-2005 06:34 » 

а если так
select * from table where table.id in  (100,101,102,103)

или я чего не доглняю?

В результате должна получиться 1 строка, а так в результате
Цитата
select * from table where table.id in  (100,101,102,103)
будет 4 строки

Меня больше интнресует на какой из запросов потратится меньше времени и меньше виртуальной памяти.
так как я предполагаю, что при выполнении первого запроса в памяти сначала должна сформироваться таблица размером 160*160*160*160 строк, а потом из нее выберется 1 строка

во втором же, описанном мной запросе, сначала должны выполниться 4 запроса на выборку, а потом объедениться.

Меня интересует вопрос: прав ли я в своих размышлениях

Кстати, база на MS Access, если это важно...
« Последнее редактирование: 23-08-2005 06:40 от Waldemar » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 23-08-2005 10:56 » 


В результате должна получиться 1 строка, а так в результате
Цитата
select * from table where table.id in  (100,101,102,103)
будет 4 строки

Меня больше интнресует на какой из запросов потратится меньше времени и меньше виртуальной памяти.
так как я предполагаю, что при выполнении первого запроса в памяти сначала должна сформироваться таблица размером 160*160*160*160 строк, а потом из нее выберется 1 строка

В твоем случае будет выбрано тоже 4 строки
Ты запрос проверял?
Цитата
во втором же, описанном мной запросе, сначала должны выполниться 4 запроса на выборку, а потом объедениться.

Меня интересует вопрос: прав ли я в своих размышлениях

Кстати, база на MS Access, если это важно...
Не важно какая база.
Важно понять как у тебя соединяются таблицы.
Какое умножение происходит.
В данном случае декартово умножение, что приведет к выводу 4 строк
И первый, и второй случай - неверно написаны запросы.
У тебя table с table никак не связаны.
Но если оторваться от запроса, на мой взгляд первый запрос более оптимален, т.к. во втором будет создаваться 4 спула таблиц, а потом из них будет идти выборка
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 23-08-2005 11:13 » 

Sla, запрос Select *
from Table, Table as Table1, Table as Table2, Table as Table3
Where (Table.id = 100) and (Table1.id = 101) and (Table2.id = 102) and (Table3.id = 103);

действительно возвращает кортеж состоящий из одной записи последовательно включающих записи с соответсвующими ID.

Второй же запрос select from select..., возпроизвести не удалось, ну не хочет он работать. Улыбаюсь

Так что эффективнее то, что работает. Улыбаюсь
Записан

С уважением, Oldy.
Waldemar
Гость
« Ответ #6 : 23-08-2005 11:14 » 

У меня соеденяется одна таблица сама с собой 4 раза. отсюда и получется декартево произведение.
а запрос выдает 1 строку, а не четыре, так как выборка производится по разным алисасам таблицы.

напоминаю, что я спрашиваю какой запрос эффективнее в плане времени выполнения и временных затрат

Извиняюсь во втором запросе забыл дописать. надо так
SELECT *
FROM [select * from table where id = 100]. AS table_0,
[select * from table where id = 101]. AS table_1,
[select * from table where id = 102]. AS table_2,
[select * from table where id = 103]. AS table_3;
« Последнее редактирование: 23-08-2005 11:26 от Waldemar » Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #7 : 01-09-2005 09:39 » 

Waldemar
тут проверил оба запроса на MS SQL и хрчу сказать, что оба запроса идентичны, если сравнивать их планы выполнения
Вероятно и для Accessa они идентичны.
Проверь визуально время выполнения для каждого запроса
Записан

I Have Nine Lives You Have One Only
THINK!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 01-09-2005 10:46 » 

HandKot , из того, что работае, возьми и выполни 1000 раз в цикле. И засеки при участии механического секундомера Ага
Записан

HandKot
Молодой специалист

ru
Offline Offline

« Ответ #9 : 01-09-2005 13:36 » 

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

I Have Nine Lives You Have One Only
THINK!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 02-09-2005 04:15 » 

Улыбаюсь
потому ша секундомер - это вещь!
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines