Heat the olive oil and butter over medium heat in large pot.
When the butter is melted and foamy, add the onions and celery. Cook gently for 3 minutes, stirring frequently.
Add the garlic, oregano and black pepper, cook 1 minute, stirring frequently.
Add the asparagus (all but the reserved tips, if using) and the chicken broth. Raise the heat to high and bring to a boil. Lower the heat to medium-low and cover. Cook for 20 minutes, or until the asparagus is very tender, stirring occasionally. Keep the soup at a simmer, raising or lowering the heat as needed.
Remove the pot from the heat. Purée the soup with an immersion blender until smooth. If you do not have an immersion blender, use a regular blender (see notes).
Add the half-and-half and stir to combine. Return the pot to low heat and cook gently until warmed through. Do not let the soup come to a boil.
Taste and add salt if needed. As a reference, we added ½ teaspoon to ours.
Serve garnished with the reserved asparagus tips, if using, and Parmesan cheese.