Primeiro, você pode tentar adicionar índices aos campos ProgramName e CustID se ainda não os tiver.
Desduplicação
Você pode agrupar seus registros para identificar dupes e, ao fazer isso, pegue o valor mínimo de ID para cada grupo. Em seguida, basta excluir todos os registros cujo ID não seja um dos MinID's.
Método na Cláusula
delete from
ProgramsList
where
id not in
(select min(id) as MinID
from ProgramsList
group by ProgramName, CustID)
Método de junção
Você pode ter que executar isso mais de uma vez, se houver muitos membros por grupo.
DELETE P
FROM ProgramsList as P
INNER JOIN
(select count(*) as Count, max(id) as MaxID
from ProgramsList
group by ProgramName, CustID) as A on A.MaxID = P.id
WHERE A.Count >= 2
Algumas pessoas têm problemas de desempenho com o In-Clause, outras não. Depende muito dos seus índices e tal. Se um estiver muito lento, tente o outro.
Relacionado:https://stackoverflow.com/a/4192849/127880