Для лучшей производительности вы должны использовать:
SELECT DISTINCT dt.*
FROM
DocumentType dt
INNER JOIN Document d ON dt.id=d.document_type_id and d.showon_id = 42
Объединения очень эффективны при соединении нескольких таблиц, где в качестве вложенного запроса в предложении Where потребуется выполнить отдельный выбор результатов, который отфильтрует результаты предложения From. Оператор соединения также гораздо более читабелен.
Я бы также добавил индекс showon_id, в дополнение к первичным ключам и отношениям внешнего ключа.
Мой ответ отличается от ответа wmasm только перемещением фильтра showon_id до внутреннего соединения. Я думаю, что для MS SQL 2k5 интерпретатор достаточно умен, чтобы делать это автоматически, но вы всегда хотите работать с наименьшим возможным набором результатов. Приведение ваших фильтров к внутренним операторам соединения может ограничить число строк, с которыми должен работать запрос при объединении множества таблиц. Однако если вы сделаете это, вы должны понимать, что это происходит для каждого сравнения строк, поэтому сложные фильтры (такие как x = '% a' или вызовы функций) лучше оставить для предложения Where, чтобы внутренние объединения могли отфильтровывать ненужные сравнения .