I’m a SQL performance guy for the most part. When I look at SQL a key thing is to understand the nature of the SQL and how it fits in to the application. This is sort of philosophical, I’m trying to understand the why of the SQL. And one attribute I look for is how is it being used to process the result set of rows.
And a killer is the ever-popular row-by-row operation. This is hardly efficient no matter how you look at it. This is a philosophical issue at the core, how is the writer of the code is seeing the solution from a grand perspective.
A good analogy is baking a cake, and getting the ingredients in particular. The situation is this, you need to bake a cake and have none of the ingredients in your kitchen to bake this cake. You have a list of the ingredients; flour, sugar, milk, eggs and so on. How do you go about buying them?
Would you get in your car, drive to the store get the flour, pay for it, get back in your car, drive home put it on the counter, and check off flour from your list. Then get back I the car, and do this cycle over again for sugar and each ingredient. I sure hope not. I suspect you would take the list and go to the store once, in the store get all ingredients in your cart (tram) and pay for the whole lot once and now go home and bake the cake.
But even this isn’t likely best, why even bake the cake at home at all? How about have the store do all the for you. Many grocery stores (at least in the USA) can bake cakes right in the store, and they are pretty good at it since they have staff and equipment to do it. (And there are septicity shops where you can get even more elaborate baking creations, which you could do yourself, maybe on the fourth or fifth try.)
If you all you want is simple cake, you can just pick it up, pay for it and go. Akin to a simple query in the database. If you want to have a custom cake you call ahead and they have it ready for you when you arrive. More like a complex query with lots of tables and maybe some fancy mathematical operations and such.
Certainly, a lot of folks have gotten past the idea of getting “one row at a time” for their SQL. But the second part of letting the database do most of the work is where many folks have trouble. This is mainly due to their philosophy and training on coding, they are very good Java, Python, C++ or like programmers. To them the database is just data, and they only want to get it from there into their application code. There are queries bringing back millions of rows and then the application does more processing on them. This is baking the cake at home, fun as baking a cake is, from a performance point of view it’s not ideal.
Using a stored PL/SQL packaged procedure to get the work done is best. Push the business logic into the database inside a PL/SQL block. The database is really good at this and can likely process those millions of rows faster than your application layer can. This is buying the already baked and decorated cake from the store.
As I said at the top, if you want an efficient system, don’t bake a cake at home, let the store bake it for you.
No comments:
Post a Comment