Я подозреваю, что при правильном SQL и индексах вы сможете добиться равной производительности с помощью одного SELECT, однако в исходном вопросе недостаточно информации, чтобы дать руководство по этому вопросу.
Я думаю, что вам лучше всего делать это как хранимую процедуру и вызывать ее.
CREATE PROCEDURE get_Count
@somefilter int
AS
delete from temp;
select * into temp from sometable where somefield = @somefilter;
select sum(someotherfield) from yetanothertable
where account in (select * from temp);
Однако пример, позволяющий избежать использования метода IN через JOIN, вероятно, решит проблему производительности,Используйте EXPLAIN SELECT, чтобы увидеть, что происходит, и оптимизировать оттуда.Например, следующий
select sum(transactions.value) from transactions
inner join user on transactions.user=user.id where user.name='Some User'
намного быстрее, чем
select sum(transactions.value) from transactions
where user in (SELECT id from user where user.name='Some User')
, потому что количество строк, отсканированных во втором примере, будет всей таблицей, тогда как в первом индексы могут бытьиспользуется.
Rev1
Принимая медленный отправленный SQL, кажется, что происходит полное сканирование таблицы, где SQL сообщает WHERE .. IN Например,
where (a.accountnumber in (select accountno from ews_db.dbo.get_all_customers))
. Вышеприведенное будет содержать множество записей, которые могут не потребоваться.Это вместе с другими вложенными выборками таблиц не позволяет оптимизатору извлекать только совпадающие записи, как это было бы в случае использования JOIN
на внешнем уровне.
При построении сложных запросов такого типаЯ обычно начинаю с внутренней детализации, потому что нам нужна внутренняя детализация, чтобы мы могли выполнять объединения и операции агрегирования.
Я имею в виду это, если у вас есть типичная БД с клиентами, у которых orders
которые создают transactions
, которые содержат items
, тогда я начну с items
и добавлю остальные детали с помощью объединений.
В качестве только пример Я предлагаю построитьзапрос больше похож на следующий:
select name,
program_name,
SUM(handle) + SUM(refund) AS [Total Sales],
SUM(refund) AS Refunds,
SUM(handle) AS [Net Sales],
SUM(credit - refund) AS Payout,
CAST(SUM(comm) AS money) AS commission,
FROM ews_db.dbo.get_all_customers AS cu
INNER JOIN amtoteactivity AS a ON a.accoutnumber = cu.accountnumber
INNER JOIN ews_db.dbo.amtotetrack AS track ON track.our_code = a.program_name
INNER JOIN amtotecommissions AS commision ON co.program_name = a.program_name
WHERE customers.country='US'
AND t.tracktype = 2
AND a.transaction_type = 'Bet'
AND a._date = ''@yy/@mm/@dd'
AND a.program_name = co.program_name
AND co.pool_type = (case when a.pool_type in ('WP','WS','PS','WPS') then 'WN' else a.pool_type end)
GROUP BY name,program_name,co.commission
ПРИМЕЧАНИЕ : Выше не работает и для иллюстрации.Мне нужно иметь базу данных онлайн, чтобы построить реальный запрос.Я надеюсь, что вы поймете общую идею и создадите ее.
Мой главный совет для сложных запросов, которые не работают, - просто полностью начать снова отбрасывать то, что у вас уже есть.Иногда я делаю это три или четыре раза при создании действительно сложного запроса.
Всегда создавайте эти запросы постепенно, начиная с самых подробных и заканчивая разработкой.Проверяйте результаты на каждом этапе, поскольку это помогает визуализировать данные.