Melt butter and oil in a Dutch oven over medium-low heat. Add celery, onion, carrot, and salt. Cook and stir until tender, about 5 minutes. Stir in peas and garlic. Nestle ham bone into the pot; add stock and diced ham. Fill pot with water to about 1 1/2 inches from the top. Mix and bring soup to a boil.
Reduce heat to low and cover. Simmer, scraping the bottom of the pot and stirring every 30 minutes, until peas are mostly disintegrated, about 2 1/2 hours. Turn ham bone and skim surface for fat once every hour. Take bone out, remove any meat, and return meat to the pot. Season with salt and pepper.