2014-12-04 3 views
0

Есть ли способ ускорить этот рабочий запрос?Как я могу ускорить этот запрос sql с помощью подстроки?

У меня есть 4 таблицы в моей базе данных (Area, APeriod, Data, Item). Они настроены следующим образом [column_name (с примерами)]:

Area [код_города (A102)] [AREA_NAME (Филадельфия-Уилмингтон Атлантик-Сити, штат Пенсильвания-Нью-Джерси DE-MD]

APeriod [период (M01)] [period_abbr (JAN)] [period_name (январь)]

Пункт [ITEM_CODE (701322)] [item_name (спагетти и макароны, за фунт 453,6 г)]

данных [series_id] [год (1995)] [период (M01)] [значение (0.235)] [footnote_codes]

Описание запроса - Определите соотношение цены за фунт бифштекса [703611] к вину, красному и белым столам (все размеры, любое происхождение; на 1 литр) [702311] в Майами-FT. Лодердейл, агрегированный по месяцам и отдельно агрегированный по годам с 1995 года по настоящее время.

Код запроса:

SELECT main.year, APeriod.period_name, steak.value AS Steak, wine.value AS Wine, steak.value/wine.value AS Ratio 
FROM 
(SELECT DISTINCT year, period FROM Data) main 
INNER JOIN APeriod ON main.period = APeriod.period 
LEFT OUTER JOIN Data steak ON steak.series_id ='APU0100703611' AND main.year=steak.year AND main.period=steak.period 
LEFT OUTER JOIN Data wine ON wine.series_id ='APU0400720311' AND main.year=wine.year AND main.period=wine.period 
ORDER BY main.year, main.period 

Этот запрос работает, но это занимает сервер MySQL на среднем 129 секунд, чтобы запустить этот запрос (который я сказал до смешного долго). Пример возврата

[Отображение на строки 0 - 24 (209 Всего запросов занял 137.6224 секунд.) [Год: 1995 - 1997]

год period_name Steak Вино Ratio

1995 Январь 3,593 NULL NULL
1995 February3.510 NULL NULL
1995 Март 3,708 NULL NULL
1995 апрель 3,747 NULL NULL
1995 май 3,462 NULL NULL
1995 июнь 3,742 NULL NUL L
1995 Июль 3,686 4,661 0,7908174
1995 Август 3,823 3,978 0,9610357
1995 Septemb 3,625 4,580 0,7914847
1995 октябрь 3,795 4.042 0.9388916
1995 November3.509 4.760 0.7371849
1995 December3.315 4,056 0,8173077
(не мог» t вставить изображение должным образом, извините)

Я попытался взять подстроку и создать представление, чтобы ускорить работу, но столкнулся с другими ошибками, что заставило меня поверить, что я сделал что-то неправильно, поскольку я новичок в sql. Есть ли способ ускорить это? Если да, пожалуйста, покажи мне. Заранее спасибо.

+0

Вы должны опубликовать определения таблиц - _i.e._, 'CREATE TABLE' для каждого из них. – leon

ответ

0

Это ваш запрос:

SELECT main.year, APeriod.period_name, steak.value AS Steak, wine.value AS Wine, 
     steak.value/wine.value AS Ratio 
FROM (SELECT DISTINCT year, period FROM Data) main INNER JOIN 
    APeriod 
    ON main.period = APeriod.period LEFT OUTER JOIN 
    Data steak 
    ON steak.series_id ='APU0100703611' AND 
     main.year=steak.year AND 
     main.period=steak.period LEFT OUTER JOIN 
    Data wine 
    ON wine.series_id ='APU0400720311' AND 
     main.year=wine.year AND 
     main.period=wine.period 
ORDER BY main.year, main.period; 

Индексы должны быть большая помощь. Я хотел бы предложить:

create index idx_data_year_period_series on data(year, period, seies); 
create index idx_aperiod_period on aperiod(period); 

Второй из них (на aperiod.period) уже существует, если aperiod.period объявляется либо как первичный ключ или уникальный.

+0

Я бы вставлял это в указанный выше запрос? – GorillaTek

+0

@GorillaTek. , , Вы должны создать индексы и повторно запустить запрос. –

+0

Я сделаю снимок. спасибо – GorillaTek

Смежные вопросы