There are a number of issues that come to mind:
- NULL handling - a lot of folks have trouble understanding that NULL is a very different beast than "0" (zero), and that you CANNOT usually compare IF myCol = NULL - you need to use "IS NULL" or "IS NOT NULL" and so forth.
NULL has its place - when it really means the absence of a choice or value - but in many cases, you're probably better off defining a default value (on an INT column often "0") that will represent "nothing" or "no choice has been made" etc.
- Indexing - a lot of confusion around indexing and what the pros and cons, benefits and drawbacks are. There's no point in indexing every column - and even if you've identified a column to be used often in a SELECT ... WHERE clause, if the selectivity of the column is not sufficiently small (some experts say if a single value of a column doesn't select out 1% or less of your data, don't bother indexing), often it won't really help since a full-table scan (index scan) will be cheaper.
And also, with indexing - if you use T-SQL functions in your WHERE clauses, like "UPPER(myCol) = (value)" or "LEFT(myCol, 10) = (value)", then you will not see the intended benefit from an index, either.
Indexing can be a huge boost to your performance - but index wisely!
Cheers,
Marc