I am writing this because most people think that unless your DME throws a code for a O2 sensor, the sensors are good.   This is not always the case.

My 2003 Z4 Roadster (M54 Engine) with 60,000 miles ran fine, but my fuel economy went from an average of 30-34 MPG, down to about 24MPG.   Something is not right.
I started all the normal maintenance items you would do but nothing was effective.  So now I start researching.

This is when I discovered that O2 Sensors can fail but not throw a code.  Now I have to prove that they are faulty.  I also had to become acquainted with dynamic engine fuel management.

To do this I have a Laptop loaded with the Autoenginuity Scanner software and the BMW extended codes so I can read every module on the car, not just ODB-II.  With this tool I am able to dynamically, in 'real time', read the O2 sensors on an X-Y graph on the laptop.  Now I can watch the sensors in action as they are working.

First, some terminoligy:
In a BMW and most other cars with four (4) O2 sensors, these sensors are labeled.  You have 'upstream' sensors, O2 sensors that are between the engine exhaust manifold and the Catalytic Converter(s) .   You also have 'downstream' sensors, O2 sensors that are after the Catalytic Converter(s). 

On BMW's six cylinder engines, there are two "banks" of cylinders.   Bank 1 is cylinders 1-3 and bank 2 is cylinders 4-6. 
The upstream O2 sensors are labeled B1S1 and B2S1.  Bank1, Sensor1 and Bank2, Sensor 1 respectively.  The downstream sensors are B1S2 and B2S2.  Understand?

So, basically here is how an O2 sensor works.

When reading voltage from a normal O2 sensor, it is supposed to read or output between 0V (nominally .2V) for a lean condition and 1V (nominally .9V) for a rich condition when the engine in 'closed loop' mode.  When reading or looking at this voltage on a graph on the laptop, the trigger pulses (more like a sign wave) should increase in frequency with the rpm's.

An oxygen sensor will typically generate up to about 0.9 volts when the fuel mixture is rich and there is little unburned oxygen in the exhaust. When the mixture is lean, the sensor output voltage will drop down to about 0.2 volts or less. When the air/fuel mixture is balanced or at the equilibrium point of about 14.7 to 1, the sensor will read around .45 volts.
When the computer receives a rich signal (high voltage) from the O2 sensor, it leans the fuel mixture to reduce the sensor's reedback voltage. When the O2 sensor reading goes lean (low voltage), the computer reverses again making the fuel mixture go rich.  This constant flip-flopping back and forth (or cross-counts) of the fuel mixture occurs at different speeds depending on the engine rpm. This transition rate is slowest on engines with feedback carburetors, typically once per second at 2500 rpm. Engines with throttle body injection are somewhat faster (2 to 3 times per second at 2500 rpm), while engines with multiport injection are the fastest (7 to 10 times per second at 2500 rpm).
O2 Sensor Troubleshooting
What I observed on my laptop screen.
I had noticed that sometimes the wave form would 'lose' a pulse or two, like the sensor just paused and it would not ramp up in the frequency as fast as the rpms.. Additionally, the maximum  voltage from both upstream sensors was between .35 and .45 volts which put the midpoint (or the equilibrium point) around .2 volts instead of .4 or .5 volts.

What that tells me is that the upstream O2 sensors are not doing what they are supposed to be doing, but are NOT faulty enough for the computer to throw a CEL.  The O2 sensors are reporting a lean condition and the DME is increasing the fuel injector pulse width and duration (dumping more fuel in the cylinders) trying to get the oxygen levels down in the exhaust, as it is being read by the upstream O2 sensors. Since the O2 sensors are  faulty and not reporting properly, this will never happen.  Looking at the diagram above and my explaination, you can see that I had two different failures of the O2 sensor.  Reduced cross-counts and lean reporting.

Ok, the upstream (B1S2, B2S1) sensors are faulty.  Time to replace.

On this engine there are two different part numbers for each sensor.