|
Тема
|
Моля за помощ за SQL заявка
|
|
Автор |
st75 (непознат
) |
Публикувано | 13.06.11 15:54 |
|
select sklad.d_nomer, max(sklad.d_name), sum(col), sum(scol) from sklad
join eksbel on eksbel.nom_nomer_full = sklad.d_nomer
join sklraz on sklraz.snomer_full = sklad.d_nomer
where d_nomer1 = 'B'
group by sklad.d_nomer
Моля за помощ и идеи за тази заявка. Прави следното - от таблицата sklad извлича номенклатурният номер (d_nomer) и наименованието на изделието (d_name), от таблица eksbel извлича продаденото количество, а от таблица sklraz - доставеното количество.
Проблема е, че таблиците са големи и така пусната заявката отнема над минута (при положение, че всичко е индексирано).
Някакви идеи ?
| |
Тема
|
Re: Моля за помощ за SQL заявка
[re: st75]
|
|
Автор |
Dakota (erotoman) |
Публикувано | 14.06.11 13:04 |
|
Пусни един EXPLAIN на заявката и пиши какво връща.
Каква БД е това?
| |
Тема
|
Re: Моля за помощ за SQL заявка
[re: Dakota]
|
|
Автор |
st75 (непознат
) |
Публикувано | 14.06.11 16:41 |
|
FireBird е БД.
Това ли имаш предвид за EXPLAIN ?
Plan
PLAN JOIN (SKLAD ORDER SKLAD_NOMNOMER INDEX (LIST_INDEX), SKLRAZ INDEX (SKLRAZ_NOMNOMER), EKSBEL INDEX (EKSBEL_FULLNOMER))
------ Performance info ------
Prepare time = 15ms
Execute time = 1m 13s 360ms
Avg fetch time = 3 056.67 ms
Current memory = 17 514 916
Max memory = 17 779 804
Memory buffers = 2 048
Reads from disk to cache = 10 121 729
Writes from cache to disk = 0
Fetches from cache = 24 011 829
| |
Тема
|
Re: Моля за помощ за SQL заявка
[re: st75]
|
|
Автор |
Dakota (erotoman) |
Публикувано | 14.06.11 17:27 |
|
SELECT
sklad.d_nomer,
MAX(sklad.d_name),
SUM(col),
SUM(scol)
FROM
sklad JOIN eksbel
ON
eksbel.nom_nomer_full = sklad.d_nomer JOIN sklraz
ON
sklraz.snomer_full = sklad.d_nomer
WHERE
d_nomer1 = 'B'
GROUP BY
sklad.d_nomer;
Нямам никакъв опит с Firebird, а и този explain нищо не ми говори. Но, опитай да елиминараш част от join-овете и условията и гледай кога драстично ще се ускори. Така ще разбереш точно коя част ти се бави.
Най-малкото, какво става ако избереш само от едната таблица:
SELECT COUNT(*) FROM sklad WHERE d_nomer1 = 'B'
Колко бързо е това? Съвпадат ли типовете на полетата, по които свързваш таблиците? Има ли индекси на тях?... Колко е общият брой записи в другите две таблици?...
| |
Тема
|
Re: Моля за помощ за SQL заявка
[re: st75]
|
|
Автор |
croesus (хлевоуст) |
Публикувано | 14.06.11 20:49 |
|
Какво точно върши следната част:
max(sklad.d_name)
Максимална стойност от текстово поле (наименование на изделието, както казваш)??
| |
Тема
|
Re: Моля за помощ за SQL заявка
[re: st75]
|
|
Автор |
wqw (АзСъмЖив) |
Публикувано | 16.06.11 00:35 |
|
Пробвай с UNION така някак
SELECT s.d_nomer
, (SELECT d_name FROM sklad WHERE d_nomer = s.d_nomer) AS d_name
, SUM(col) AS col
, SUM(scol) AS scol
FROM (
SELECT nom_nomer_full AS d_nomer
, col
, 0 AS scol
FROM eksbel
UNION ALL
SELECT snomer_full
, 0
, scol
FROM sklraz
) s
GROUP BY s.d_nomer
| |
Тема
|
Re: Моля за помощ за SQL заявка
[re: st75]
|
|
Автор |
Mixy (@#$%^) |
Публикувано | 17.06.11 12:07 |
|
>>> Проблема е, че таблиците са големи...
Все пак, по колко реда са?
Mixy
| |
|
|
|
|