|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
Привет. Есть 5 таблиц. Хозяйство--Связь1:М--Люди--Транспорт--Справочник транспорта. Хозяйство: код_хозяйства(PK), прочие поля, для запроса не нужные (адрес и т.п.). Связь1:М: код(PK), код_хозяйства(FK), код_человека(FK) Люди: код_человека (PK), и прочее. Транспорт: код_транспорта(PK), код_человека (FK), код_транспорта_из_справочника(FK), количество Справочник: код_справочника(PK), имя ('Тракторы', 'Легковые автомобили' и т.п.). Задача - выбрать количество определенного транспорта для одного хозяйства. Проблема в том, что транспорт завязан на человека, а уж человек состоит в хозяйстве (по схеме). Получается несколько запросов: 1) выбираем всех людей, состоящих в одном хозяйстве; 2) выбираем количество определенного транспорта (например 'Тракторы') в диапазоне людей из одного хозяйства (результат предыдущего запроса). Я делаю через AND, но запрос выглядит монстрячим и, наверняка, тяжелым. Как его можно оптимизировать? На основе запроса нужно будет сформировать отчет, поэтому, наверное, нужно все сделать в одном запросе. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2008, 09:50 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
облегчите нам задачу, если положите сюда примерные таблички + покажите Ваш запрос если кратенько, для вкл-я оптимизации 1. вкл-ем set opti 2. создаем индексы по полям, которые есть в условиях выборки + бинарный индекс по deleted() при set dele on 3. пишем условия правильно, используя только оптимиз-е выраж-я (все это есть в хелпе) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2008, 09:56 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
ок. сейчас нарисую. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2008, 10:11 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2008, 11:21 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
опечатался: в FROM spr_mean, а не spr_means ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2008, 11:28 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
Исправил: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2008, 11:40 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
При этом лучше отдельно найти spr_mean.id и тогда из запроса можно выкинуть последний join. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2008, 11:44 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2008, 11:48 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
> Автор: 12345зайчик spr_mean надо поставить самым первым и в конструкции и использовать директиву where с условием А так же создать индекс по полю spr_mean.name Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2008, 12:35 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
вообще то таблица хозяйство для запроса не нужна или как? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2008, 14:12 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
leafвообще то таблица хозяйство для запроса не нужна или как? Нужна. Вся техника, приписанная к одному хозяйству. Sergey Sizov.[src] При этом лучше отдельно найти spr_mean.id и тогда из запроса можно выкинуть последний join. То есть? Пробовал выполнить, фокс не отвечает, при этом не виснет (фокс 9). Посмотрю запрос еще, может я его неправильно составил. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2008, 16:15 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
В принципе, что Ваш первоначальный запрос, что запрос с JOIN - это одно и то же. Просто по разному оформленное. Так что, с этой точки зрения, разницы никакой. Однако у Вас явно лишняя связка с таблицей "люди", поскольку "код_человека" есть как в таблице "Связь", так и в таблице "Транспорт". Зачем же вводить лишнего посредника, если эти две таблицы можно связать напрямую. Тогда в результате имеем Код: plaintext 1. 2. 3. 4. 5. 6.
В данном случае получаем сумму всех тракторов по всем хозяйствам. По поводу того, что сказал Сергей. Если речь идет именно и только о тракторах, то логично сначала, отдельным запросом, получить код записи "Тракторы" в справочнике техники, а потом искать данные уже по найденному коду Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2008, 22:25 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
Да, если задача ставится наоброт: вся техника по одному хозяйству, то аналогичную операцию делаем с таблицей "Хозяйства", а не со справочником техники. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2008, 22:28 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
Все советы не особо помогают, т.к. число таблиц в запросе остаётся равным 5. Надо сделать так, как Вы намечали: . Найти всех людей заданного хозяйства, поместив их в массив aPeaple (Sql-запросом) . Для всех найденых людей найти технику. Для отбора можно использовать функцию ASCAn(aPeaple,means.manid) >0. Записать отобранную технику в курсор, по которому и сделать отчёт ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2008, 15:46 |
|
Помогите оптимизировать запрос к нескольким таблицам
|
|||
---|---|---|---|
#18+
Sergey Sizov. , Андрей К , ВладимирМ , большое спасибо! С sql серьезно не знаком, много полезного узнал. Пока проверил запрос Сергея. Работает шустро. По сравнению с моим с ANDами - тот вообще фокс повесил:) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2008, 17:05 |
|
|
start [/forum/topic.php?fid=41&msg=35512621&tid=1587320]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 300ms |
total: | 445ms |
0 / 0 |