2015-08-17 6 views
1

Следующий запрос:запросов строит временную таблицу с внутренним соединением

SELECT *, t1.col AS some_col, t5.othercol AS other_col 
      FROM t1 
      JOIN t2 ON t2.id = t1.t2_id 
      JOIN t3 ON t3.id = t2.t3_id 
      JOIN t4 ON t4.id = t1.t4_id 
      JOIN t5 ON t5.id = t4.t5_id 
      ORDER BY timestamp DESC LIMIT 0, 20; 

медленно и процессор. Когда я ОБЪЯСНИТЬ запрос, я вижу, что он создает временную таблицу и filesort для таблицы 3 (t3). В may_keys он говорит PRIMARY, но он не использует это (ключ NULL).

Как только я подключу t3 к LEFT JOIN, он использует первичный ключ и снова работает. Что может быть причиной этого?

+0

показывают схемы и объяснить (s) – Drew

+0

это всегда хорошая практика, чтобы явно выбрать столбцы вместо '*', когда вы выбираете из нескольких таблиц. –

+0

Явно выберите cloumns вместо *, как указано выше. Создайте кластерный индекс или некластеризованный индекс для столбцов, которые используются в состоянии соединения, и заставят таблицу использовать этот индекс. Например, ИСПОЛЬЗОВАНИЕ AdventureWorks GO ВЫБЕРИТЕ КОНТАКТ ID ОТ ЛИЦА. КОНТАКТ С (ИНДЕКС (AK_Contact_rowguid)) GO –

ответ

0

Явно выберите cloumns вместо *, как указано выше. Создайте кластерный индекс или некластеризованный индекс для столбцов, которые используются в состоянии соединения, и заставят таблицу использовать этот индекс. Например

USE AdventureWorks 
GO 
SELECT ContactID 
FROM Person.Contact WITH (INDEX(AK_Contact_rowguid)) 
GO 
Смежные вопросы