2013-12-23 6 views
3

У меня есть две таблицы Продажа и Покупка. Мой запрос дает мне желаемый результат, я осторожно отношусь к этой производительности, поэтому PLZ направляет меня, если это может быть лучше. Мои таблицы:
Таблица ПродажаРабочая оптимизация запросов SQL Server 2005

UserId | ProductId | ProductName | ProductPrice 
1  | p_101  | Cycle   | 500 
1  | p_121  | Car   | 500000 
2  | p_111  | Cycle   | 5000 

Таблица Purchase

UserId | ProductId | ProductName | ProductPrice 
1  | p_109  | CellPhone  | 150 
2  | p_121  | Car   | 500000 
3  | p_111  | Book   | 15 

Желаемая таблицы вывода

Type | ProductId | ProductName | ProductPrice 
Sell | p_101  | Cycle   | 500 
Sell | p_121  | Car   | 500000 
Purchase| p_109  | CellPhone  | 150 

Рабочий запрос:

SELECT type, P1.ProductId, P1.ProductName, P1.ProductPrice 
    FROM 
     (
     SELECT s.UserId, 'Sell' as type, s.ProductId, s.ProductName, s.ProductPrice FROM [Sell] s 
     UNION 
     SELECT p.userid, 'Purchase' as type, p.ProductId, p.ProductName, p.ProductPrice FROM [Purchase] p 
     ) as P1 
    WHERE userid=1 
+0

У вас есть план выполнения запроса? Любые индексы? Это ms-sql? Это может быть лучше подходит для dba.stackexchange.com ... Число строк в этих таблицах? – rene

+3

Просто мысль: Move 'WHERE userid = 1' to internal Выбирает – Nalaka526

+0

@rene, nop ... У меня нет выполнения и индексов запросов. – Sohail

ответ

3

Лучшая конструкция заключается в том, чтобы объединить обе таблицы и иметь столбец transaction_type, который либо будет иметь «Покупка», либо «Продать» в качестве значений. Если вы это сделаете, вам не придется делать UNION или UNION ALL.

Настоящий проект представляет собой простой и быстрый способ получить записи. Обратите внимание, что я использовал UNION ALL, который быстрее, чем UNION, поскольку UNION использует DISTINCT для уникальных записей, которые, как я думаю, в вашем случае не применяются. Если вы предоставите подробную информацию об индексе и плане выполнения, я могу увидеть, есть ли лучший способ.

SELECT s.userid, 
    'Sell' as type, 
    s.ProductId, 
    s.ProductName, 
    s.ProductPrice 
FROM Sell s 
WHERE UserId = 1 
UNION ALL 
SELECT p.userid, 
    'Purchase' as type, 
    p.ProductId, 
    p.ProductName, 
    p.ProductPrice 
FROM Purchase P 
WHERE UserId = 1 
+0

, если я запускаю оба запроса на сервере sql 2005 и нажмите «Показать примерный план выполнения». Он показывает, что оба запроса используют 50%, 50% от процессора ... с UNION и UNION ALL. но [эта ссылка] (http://stackoverflow.com/questions/49925/what-is-the-difference-between-union-and-union-all) сделала меня лучше к вашему ответу. – Sohail

+0

Сколько записей вы есть в вашем столе? У вас есть уникальный код для UserId? Кроме того, как я сказал в ответе выше, можно ли использовать только 1 таблицу со столбцом transaction_type? –

+0

от 100 до 150 записей. и у меня нет индекса на UserId. – Sohail

-1

Его лучше использовать объединения, а не подзапросы. Таким образом, на ваши запросы не будет накладных расходов, особенно при работе с большими объемами данных.

+0

Правда, насколько это возможно, но я не вижу присоединения к запросу OPs. –

+0

@Emil Rena: Где я могу использовать соединение? – Sohail

+1

Предположительно, где-то есть таблица пользователей, вы можете присоединиться к этому. Ответ [Adarsh's] (http://stackoverflow.com/a/20742625/1402923) - лучший способ пойти. – RobH

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