Our Blogs

WE LOVE TO SHARE

So here are our latest blogs sharing what we have learnt lately, we hope it will make your life easier.

Documentation Debt

We have come to value working software over comprehensive documentation. - Agile Manifesto At OptimalBI we consider documentation to be a necessary overhead. We will not do work without creating and recording a plan. We value planning and understand the need to record...

Dimensional Modelling Advice

All of my Business Intelligence clients have had intelligent and enthusiastic technical experts who were intimidated by dimensional modelling. I have to confess that I'm also still intimidated. I'm less intimidated than I used to be, but I know in my heart that I'm a...

PL/SQL Parameters

In Clean Code, Martin recommends that: The ideal number of arguments for a function is zero (niladic). Next comes one (monadic), followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very...

Comparing sets in SQL

I was shown the following technique for comparing tables when I was a junior programmer many years ago. WITH A as (SELECT something) , B as (SELECT another_similar_thing) SELECT * FROM A MINUS SELECT * FROM B UNION ALL SELECT * FROM B MINUS SELECT * FROM A; This...

Drop if exists considered harmful

I read lots of examples on the internet that check if an object exists, and then drop it before creating it. You'd be excused for thinking that this is good practise. It's not. Dropping an object has negative side effects: Fisher emphasizes that all of the GRANTs and...

Show and Know beats Care and Prayer

As a consultant I rarely see systems that are operating well. People don't take their cars to the mechanic when they are functioning properly. I appreciate that this colours my experience. Still, I'm continually surprised to find smart people working in the "Care and...

The Exec Exec trick

SQL Server's Transact SQL has some weird constraints. One of which is that certain statements must be the first one in their batch. This causes all kinds of head-aches for dynamic SQL. I start with a statement that I want to execute, that I have generated dynamically....