Most Popular Posts

Apr 16, 2010

My Bets on Relational Databases

Relational database engines emerged because they could process large and complex data sets faster than ISAM engines. Notice the subtle qualification – large and complex data sets. Today relational engines scale down and compete well on small and flat data sets as well, but that wasn’t always the case. For years we, who wanted to use database servers in our work, had to prove to our management that we would deal with data sets large enough to justify the purchase of database software as well as appropriate hardware for it. Younger software developers probably don’t understand that since they can download SQL Server Express or Oracle SQL Developer for free, not to mention the open source database servers. Briefly, database servers have become commodity.

ISAM engines are extinct today, because the pioneers of the database industry foresaw the continuous growth of the data volumes that would need to be processed. While that growth has been steady in absolute measures, it has reached a tipping point relative to the capacity of a single [computing] box. For the first 25 years of their existence database engines were predominantly single-box, because data could fit on a single hard disk and a single CPU was sufficient to process it. About 10 years ago RAID controllers multiplied disk capacity several times and SANs became popular shortly after. At that same time multi-processor architectures increased the processing power of the machines. While that extended the life of single box architectures by another decade, it revealed that the end was approaching.

About 5 years ago a new pattern emerged – Map Reduce. It gives up the ability to execute arbitrary relational queries in favor of the ability to distribute storage across a large number of machines as well as to process those large data sets in parallel. Both proprietary and community implementations of the Map Reduce pattern have been growing and improving their feature sets. The first question that arises is: will relational databases continue to exist?

Relational databases will not go away. They will continue serving their mission which is to execute complex relational queries against large data sets.

The main factor in my bet is the demand for executing complex queries. Our civilization is complex and so it has complex needs. The Map Reduce pattern seems to represent the next generation of ISAM. We’ve already witnessed ISAM yielding to relational databases. In fact, both Google’s and Hadoop’s implementations of Map Reduce include relational engines – Big Table and HBase respectively. The next question is: what would relational database servers look like?

Relational database servers will become relational database clusters with hundreds of storage and relational nodes. Those relational clusters are likely to employ a non-uniform architecture with regard to storage, i.e. each storage node is likely to have a set of dedicated relational nodes that will execute queries against data form that storage node eventually joining it with data from other nodes.

Here are some clarifications. I assume that if a system can scale out to 200 nodes, it can scale out to 2,000 nodes. I cannot guess whether today’s relational database servers will evolve incrementally or whether they will be rewritten from scratch based on a scalable pattern like Map Reduce.

P.S. My bet on the SQL language will follow.

Apr 14, 2010

How to Share a Local Installation of Visual Studio 2010 Help

I don’t want to debate whether you should use a local Visual Studio 2010 Help installation or the MSDN web site. If you have already decided to use a local Help installation, you may want to access it from multiple machines, because it doesn’t make much sense to install the exact same content on every machine you use to develop software.

Why is this use case problematic? With the launch of Visual Studio 2010 and .NET 4, the formats of the local Help and the MSDN have been unified. So the user experience is very similar whichever way one chooses to use help. The local Help installation consists of a static file store exposed through an http agent. The user interface is the default web browser. The problem is that the http agent rejects requests unless they reference the host as ‘’ or ‘localhost’.

The most obvious solution would be to install a web proxy on the machine where you have the local Help installation. That web proxy should simply redirect all the incoming traffic to the Help http agent. If IIS (Internet Information Server) had a built-in proxy module, I’d probably use it. Unfortunately, IIS only has a redirection module which is not the same and doesn’t solve the problem. So you have to install a standalone proxy. You could probably find a one-screen sample from WCF (Windows Communication Foundation), but you’ll still have to customize it and maintain it. I wouldn’t sign up for that.

What I recommend is a quick and easy way to point a local Help agent to a remote Help sore:

  • Find a drive letter that is available on all machines that will share the same Help installation. Let’s say that’s H:.
  • Share the root folder where you installed the Help content.
  • Map the H: drive letter to that folder on all machines from where you want to access that Help installation.
    • If you want to access it from the machine where you installed the Help, you should map the H: drive letter on that machine too.
    • Make sure you check the Reconnect at Logon checkbox.
  • Modify the manifest\queryManifest.3.xml file of the local Help store as follows:

<queryManifest version="1.0">


            <catalog productId="VS" productVersion="100" productLocale="EN-US" productDisplayName="" sourceType="index">



  • Set the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Help\v1.0\LocalStore registry key to “H:” on each machine from where you want to access the Help installation.

Apr 7, 2010

My Low-Sodium No Sugar Flax Bread Recipe

I’ve been making bread at home for about 10 years. I began experimenting with my own recipes a couple of years ago. Now I can consistently produce a delicious bread. My objective has been to find the optimal balance between healthiness and taste. In particular, I’ve been trying to use minimum refined carbohydrates and salt. Below is my “optimum” recipe followed by some variations with reinforced and with relaxed constraints.


  • 2 1/4 cups water
  • 1/2 tsp salt
  • 1/2 cup ground flax seed
  • 2 cups all-purpose unbleached flour
  • 2 cups whole wheat flour
  • 1 1/2 tsp yeast

I recommend using broad and shallow cups as opposed to narrow and deep ones. My experience shows that while water easily fills out a cup of any shape, that is not true for flour. Using narrow and deep cups may result in an overwatered dough that will have to be baked further.

I use a bread machine for both knitting and baking. Feel free to bake it in the stove. The bread will come out better.


  1. If you keep the yeast in the refrigerator, put 1 1/2 tsp of yeast into a larger container, e.g. in a tbsp, and let it warm up to room temperature.
  2. Pour 2 1/4 cups of water in a larger bowl and microwave it for 1 minute. It should be just warm, not hot. Pour that warm water into the bread machine’s bucket.
  3. Add 1/2 tsp of salt.
  4. Add 1/2 cup of ground flax seed.
  5. Add 2 cups of all-purpose unbleached flour.
  6. Spread about a third of the yeast over the flour. Make sure you don’t drop it in the water - that would be a waste.
  7. Add 1 cup of whole wheat flour.
  8. Spread about half of the remaining yeast over the flour. Make sure you don’t drop it in the water.
  9. Add 1 cup of whole wheat flour.
  10. Spread the rest of the yeast over the flour. Make sure you don’t drop it in the water.
  11. Use the longest program on your bread machine. That’s usually “French Bread” and it takes about 4 hours.


More Whole Wheat Flour

To make the bread healthier, replace 1 cup of white flour with 1 cup of whole wheat flour. The bread will not rise as much. It will also need a little bit (1/16 cup) more water. If you still like the bread, you can replace the remaining cup of white flour with whole wheat flour following the same rule. In that case you may also need to increase the salt to 1 tsp to make it rise a bit more and to improve its taste.

More White Flour

If you like puffy bread, you can replace 1 cup of whole wheat flour with white flour. When I did that, my bread got out of the bucket. So if you want to use white flour exclusively, you should bake it in the stove.