I’m facing issues with a SQL query that’s taking a long time to execute. It’s currently running for about 16 minutes, and that’s way too long for my needs.
Here’s the SQL query I’m working with:
WITH training_programs AS
(
select program_modules.section_id, learner_id, program_modules.program_title, program_modules.min_score, program_modules.prog_id, enrollment_date,
0 as isFromCompleted, finished_date, organization_id
from learner_special_programs WITH (NOLOCK)
inner join program_modules WITH (NOLOCK) on program_modules.prog_id = learner_special_programs.prog_id
UNION all
select program_modules.section_id, learner_id, program_modules.program_title, program_modules.min_score, program_modules.prog_id, enrollment_date,
0 as isFromCompleted, learner_programs.finished_date, organization_id
from learner_programs WITH (NOLOCK)
inner join program_modules WITH (NOLOCK) on program_modules.prog_id = learner_programs.prog_id
UNION all
select program_modules.section_id, learner_id, program_modules.program_title, program_modules.min_score, program_modules.prog_id,
null as enrollment_date, 1 as isFromCompleted, null as finished_date, organization_id
from learner_programs_archived WITH (NOLOCK)
inner join program_modules on program_modules.prog_id = learner_programs_archived.prog_id
)
select distinct
u.last_name +', '+ u.first_name fullname,
u.username as login,
u.phone_number as phone,
u.email_address as email
from users u
where u.organization_id in ('1000004')
The low performance seems to stem from the multiple UNION ALL operations. If anyone knows better ways to construct this query or has suggestions for indexing to speed things up, I would greatly appreciate your input.