My vote goes to entertainment value, because the stories don't completely add up. When he was implementing the case-insensitive logins he would, of course, first have to run a query to see if there are any users whose login names collide without case sensitivity. That query would run (according to the slides) really slowly, because it would have to essentially do something like:
SELECT a.id, b.id, a.username FROM users AS a, users AS B
WHERE a.id != b.id AND a.username = b.username AND
BINARY(a.username) != BINARY(b.username)
At that point he'd realize the query is taking forever, and use mysql-top or something equivalent to kill the query.
Edit: I realize that most likely the username column had a UNIQUE index already, making this query unnecessary.
--
In his example of find_in_batches where he has to make some changes that applies to all users he makes it sound like the User.all is the big problem because it does a `SELECT * FROM users`. But even when you break up the work in parts you have to be careful, because by the time you're done processing a few of the existing users may have changed already. So as your database becomes too large to do your updates in one big atomic transaction block you almost always have to follow a process like this:
1. find set of rows that match the problem (in batches)
2. apply the (expensive) fix/migration on those rows
3. go back to 1 until the result set is empty
4. do (1) and (2) in a big transaction (but since there are only a few rows, that's fine)
Of course there are a hundred ways to upgrade a live database safely, but there always must be some kind of process in place otherwise your database is going to go down all the time.