Adding to Dan's answer, you can get blocking even if there are good indexing in place. Say that there is an INSERT statement which inserts a row where City = 'Paris'. This statement is left uncommitted for whatever reason.
At the same time, there is a SELECT query that wants to retrieve data where City = 'Paris', possibly in combination with other parameters. There is an index on the City column. This SELECT query will be blocked since there is an uncommitted row which the query would like to read.
This assumes the default isolation level READ COMMITTED, and the default variation of the isolation level. If you use the isolation level READ UNCOMMITTED, there will not be any blocking, and in this case, the result will include the uncommitted row. Nor will there be any blocking if you have enabled READ_COMMITTED_SNAPSHOT for the database, since in this case the SELECT query will read from the snapshot, and the result will not include the uncommitted row. In both cases, the result could, depending on requirements, be considered to be incorrect.