2013-05-21 2 views
1

Какой тип sql-запроса я бы использовал, чтобы включить следующее:Улучшение производительности для запроса количества SQL

| ID | SERIAL | LCN | INITLCN | 
|------|----------|-------|---------| 
| 1 | A  | A1 |   | 
| 2 | B  | A2 |   | 
| 3 | C  | A3 | A1 | 
| 4 | D  | A4 | A2 | 
| 5 | E  | A5 | A1 | 
|------|----------|-------|---------| 

в результате аналогичные этому;

| ID | COUNT | 
|------|---------| 
| 1 | 2 | 
| 2 | 1 | 
|------|---------| 

Используя мои навыки низкого SQL, мне удалось написать ниже запрос, однако он очень медленный;

select 
    a.id, 
    count (b.id) as parent 
from assets a 
left join assets b 
    ON (a.lcn = b.initlcn) 
group by a.id 
order by a.id; 
+2

Этот запрос не должен запускаться из-за 'и 'там –

+2

Сначала используйте INNER JOIN, он будет возвращать только те результаты, которые соответствуют, также индексируют столбцы соединения и, наконец, удостоверяются, что они являются TEXT или большими VARCHARS, пытаясь использовать идентификаторы – We0

+0

'и' удален. Название обновлено для отражения актуального вопроса. – Dan

ответ

0
select 
t1.ID, 
t1.LCN, 
COUNT(*) 
from 
Table1 t1 
INNER JOIN Table1 t2 ON t1.LCN = t2.INITLCN 
GROUP BY t1.LCN 

Смотреть это работает жить в sqlfiddle.

0

Возможно, два столовых соединения не являются nesecerry. попробовать этот

select 
a.id 
,b.cnt 
from assets a 
join (
select 
initlcn 
count(1) cnt 
from assets 
group by initlcn 
) 
b on (a.lcn=b.initlcn) 
+1

И вы присоединились к воздуху или что? :) –

0

вы можете проверить следующий запрос также -

Я проверил план выполнения для публикуемую запроса и следующий запрос, и я получаю хорошую разницу между обоими -

SELECT t_1.Id, t_2.Cnt 
    FROM Assets t_1, 
     (SELECT Initlcn, COUNT(*) Cnt FROM Assets GROUP BY Initlcn) t_2 
WHERE t_1.Lcn = t_2.Initlcn 
Смежные вопросы