Hashing is the process of comparing multiple records from 2 tables. Say you have 10 records in each of the 3 tables... hashing them all together would result in 1000 results, which would all be compared against the where clause to filter the results. INNER JOINS could potentially get a query plan that filters the results of the first hash first, which could result in say 20 records hashed against the 2nd 10, instead of 100, which results in a total of 300 records getting hashed instead of 1000.
A V-sproc is a way of organizing joins in a stored procedure to force an optimized query execution plan. It would look like this:
CREATE PROCEDURE vsproc AS BEGIN
FROM tags AS t
INNER JOIN trailers as tr ON t.trailer_id = tr.trailer_id
) AS tr
INNER JOIN films AS f
ON tr.film_id = f.film_id
ORDER BY tr.trailer_id DESC
Notice each "scope" only joins 2 tables. You start with the scope that will limit results the most, and increasingly expand # of comparisons on outer bands of the query. This is most effective when joining several tables... you can really optimize execution time a lot by controlling the order of filtering and not trusting the DB to optimize the plan itself (which fails without fail).