2013-08-07 3 views
1

Я должен написать запрос, который требует объединения трех таблиц. Запрошенный мной проект отлично работает, но для его выполнения требуется много времени.Запрос Sql, занимающий много времени с внутренним соединением

SELECT v.LinkID, r.SourcePort, r.DestPort, r.NoOfBytes, r.StartTime , r.EndTime, r.Direction, r.nFlows 
FROM LINK_TBL v 
INNER JOIN NODEIF_TBL n 
INNER JOIN RAW_TBL r ON 
    r.RouterIP=n.ifipaddress 
    and n.NodeNumber=v.orinodenumber 
    and v.oriIfIndex=r.OriIfIndex; 

Есть ли проблемы с производительностью w.r.t в этом запросе?

+0

У вас нет условий соединения для 'NODEIF_TBL' – Phil

+0

@Phil. Привет, Я сопоставляю 2 столбца из NODEIF_TBL с двумя разными столбцами из остальных таблиц, я думаю, что это соединение таблиц, правильно? Или вы хотели передать что-то еще. Я не так хорош в sql. – Ajit

+0

См. Ниже ответы, все они правильные – Phil

ответ

3

Попробуйте один поставить на условиях стыки

SELECT v.LinkID, r.SourcePort, r.DestPort, r.NoOfBytes, r.StartTime , r.EndTime, r.Direction, r.nFlows 
FROM LINK_TBL v 
INNER JOIN NODEIF_TBL n ON (n.NodeNumber=v.orinodenumber) 
INNER JOIN RAW_TBL r ON (r.RouterIP=n.ifipaddress and v.oriIfIndex=r.OriIfIndex) 
+0

Hi Dianuj, время o/p составляет 50,25 секунды, когда исходный запрос дает 49,89 с. Но я думаю, что вы можете присоединиться к тому, что нужно использовать всегда. Спасибо – Ajit

+0

столбцы таблицы имеют соответствующие индексы? –

+0

Нет. Я никогда не делал индексацию. Может быть, это поможет. – Ajit

2

Попробуйте это:

SELECT v.LinkID, r.SourcePort, r.DestPort, r.NoOfBytes, r.StartTime , r.EndTime, r.Direction, r.nFlows 
FROM LINK_TBL v 
INNER JOIN NODEIF_TBL n ON 
    n.NodeNumber=v.orinodenumber 
INNER JOIN RAW_TBL r ON 
    r.RouterIP=n.ifipaddress 
and v.oriIfIndex=r.OriIfIndex; 
+1

'ON и' generate будет ошибка –

+0

Извините за опечатку, обновленный запрос tyhe. –

+0

Привет Сунил, в вашем запросе есть незначительное улучшение. Это 49.47s против 49.89s. Можете положить на него больше света? Кроме того, можете ли вы сказать мне, что вместо этого в INNER JOIN я непосредственно пишу предложение where, такое как T1.a = T2.b и T2.c = T3.d, тогда какая разница? – Ajit

1

Джойн порядок несколько странно. Я не работаю с MySQL, так может быть, это просто какой-то единственный способ, чтобы присоединиться, но обычно вы присоединитесь как:

FROM 
    a 
    INNER JOIN b ON a.id1 = b.id2 
    INNER JOIN c ON b.id3 = c.id4 

Поскольку вы используете INNER JOIN таким образом, вы первый отфильтровывать с Ь присоединяется и только тогда используйте оставшееся соединение для фильтрации, тем самым сохраняя множество действий сравнения. Представьте, что каждая таблица имеет 1 тысячу строк. Когда вы добавляете c, это становится 1 миллионом сравнений. Между тем, в моем примере это будет только 1000 + 1000 сравнений вместо 1000 * 1000.

+0

Спасибо, человек, вы это объяснили очень хорошо. Будем, помните об этом впредь. Мне также нужно индексировать мои таблицы, как это было предложено Диануй. – Ajit