2012-02-02 3 views
3

У меня есть две таблицы. Одна таблица содержит информацию об активах, другую таблицу об их отношении. Как можно оптимизировать текущий запрос и получить аналогичные результаты.Проблема оптимизации SQL

SELECT a1.ID FROM Asset a1 
WHERE a1.AssetId = 
(SELECT r.DestinationAssetId 
FROM Relation r 
INNER JOIN Asset a2 ON a2.AssetId = r.SourceAssetId 
WHERE a2.ID = '1112174' and r.RelationshipType = 'Video File') 

Результаты: 13412331 (Идентификатор актива, который связан с a2.ID = «1125574»)

Лично мне не нравится этот глупый вспомогательный запрос, он каким-либо образом я могу избежать этого и оптимизируйте этот запрос.

Спасибо!

+0

Какую базу данных вы используете? Почему вы не можете подключиться к активу? –

+0

MSQL, я могу присоединиться к Relation to Asset, и я делаю это в подзапросе. Но как получить одинаковые результаты в одном запросе. –

+0

Оптимизация также предполагает, что колонки JOINed имеют соответствующие типы данных и что подходящие индексы находятся на своем месте. Вы должны взглянуть на план _query_, который SQL Server генерирует, чтобы видеть, где он проводит свое время. – HABO

ответ

4

Вы можете потерять подзапрос:

SELECT dest.ID 
FROM 
Asset src 
JOIN Relation r ON src.AssetId = r.SourceAssetId 
JOIN Asset dest ON dest.AssetID = r.DestinationAssetID 
WHERE src.ID = '1112174' and r.RelationshipType = 'Video File' 

Его не так много оптимизации производительности мудрый, но это немного аккуратнее.

+0

'dest' вместо' desc'. –

+1

@af: Таа - сделал это в половине случаев, когда я набрал его! подумал, что я их всех заметила. –

+0

@ DarkTygur, я согласен с Джоном. Первая таблица FROM, лежащая в основе конкретного идентификатора, который он ищет, затем присоединяется к остальным для других элементов квалификационной информации. – DRapp

1

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

SELECT a1.ID 
FROM Asset a1 
INNER JOIN Relation r ON a1.AssetId = r.DestinationAssetId 
INNER JOIN Asset a2 ON a2.AssetId = r.SourceAssetId 
WHERE a2.ID = '1112174' and r.RelationshipType = 'Video File' 
2

На первый взгляд, это выглядит, как это будет делать то же самое:

SELECT a1.ID 
FROM Relation r 
INNER JOIN Asset a2 ON a2.AssetId = r.SourceAssetId 
INNER JOIN Asset a1 ON a1.AssetId = r.DestinationAssetId 
WHERE a2.ID = '1112174' and r.RelationshipType = 'Video File' 
Смежные вопросы