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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [SQLite] Как оптимизировать запрос для 3 таблиц? 
V
    Опции темы
kamre
Дата 25.6.2008, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть таблица, в ней находится описание набора тестов, создается примерно вот так:
Код

create table tests (id integer primary key autoincrement, descr1 int, descr2 int)

Также имеется две таблицы с результатами для тестов, создаются так:
Код

create table resA (id integer, res integer, perf real)
create table resB (id integer, res integer, perf real)

Тестов довольно много, больше 5000. Нужно сравнить результаты для тестов.
Например, делаю вот такой запрос:
Код

select descr1, sum(resA.perf), sum(resB.perf)
from tests, resA, resB
where tests.id=resA.id and resA.id=resB.id
group by descr1

Довольно долго работает, похоже, что строит все 5000*5000*5000 вариантов.
Так же пытался сделать так:
Код

select descr1, sum(resA.perf), sum(resB.perf)
from tests inner join resA using(id) inner join resB using(id)
group by descr1

Работает также долго.
Хотя если просто:
Код

select *
from tests inner join resA using(id) inner join resB using(id)

то все вполне быстро выдает. 
Подскажите, почему так получается? Т.е. почему для суммирования и группировки уже полученных данных тратится столько много времени?
Как правильно построить запрос?

P.S. Почему только для первого блока кода сработала расцветка, хотя везде "[code=sql]" используется?

Это сообщение отредактировал(а) kamre - 25.6.2008, 08:59
PM MAIL   Вверх
ТоляМБА
Дата 25.6.2008, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


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

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



Попробуй так:
Код
Select descr1, Sum(perfA), Sum(perfB)
from (
select descr1, resA.perf as perfA, resB.perf as perfB
from tests inner join resA using(id) inner join resB using(id)) as Abc
group by descr1
если синтаксис позволяет
PM   Вверх
skyboy
Дата 25.6.2008, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



я так вижу, индексов окромя tests.id у тебя нету, так?
PM MAIL   Вверх
kamre
Дата 25.6.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ТоляМБА @ 25.6.2008,  09:14)
Попробуй так:
Код
Select descr1, Sum(perfA), Sum(perfB)
from (
select descr1, resA.perf as perfA, resB.perf as perfB
from tests inner join resA using(id) inner join resB using(id)) as Abc
group by descr1
если синтаксис позволяет

Синтаксис позволяет, но это нисколько не ускоряет запрос...

Кстати, кажется я понял почему у меня такое поведение... Я ж все запросы пока делаю из sqliteman, а он для 
Код

select *
from tests inner join resA using(id) inner join resB using(id)

выдает только первые 256 записей, остальные только при прокрутке окна.
Если создавать таблицу:
Код

create table resBoth as
select descr1, resA.perf as perfA, resB.perf as perfB
from tests inner join resA using(id) inner join resB using(id)

то также долго получается.

Цитата(skyboy @ 25.6.2008, 09:32)

я так вижу, индексов окромя tests.id у тебя нету, так?

Сейчас так. Стоит добавить индексы для таблиц с результатами?
В них, кстати, id не повторяется сейчас никогда, т.е. для каждого теста только один результат хранится.
Как это лучше сделать?


PM MAIL   Вверх
skyboy
Дата 25.6.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(kamre @  25.6.2008,  09:20 Найти цитируемый пост)
Как это лучше сделать?

а как в SQLite объявляются индексы?
PM MAIL   Вверх
kamre
Дата 25.6.2008, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(skyboy @ 25.6.2008,  10:33)
Цитата(kamre @  25.6.2008,  09:20 Найти цитируемый пост)
Как это лучше сделать?

а как в SQLite объявляются индексы?

ну как-то вот так:
Код

create index resA_id on resA (id)


Кстати, индекс для tests.id не создавался, для другого поля почему-то был создан.

Сейчас создал индексы для id во всех таблицах, стало все очень быстро smile

Всем спасибо за ответы!

Это сообщение отредактировал(а) kamre - 25.6.2008, 10:57
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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