Создает ли этот запрос SQL временные таблицы?

SELECT *
FROM (
        (SELECT table1.id1, table1.id1_type AS id1,
         FROM child AS table2 STRAIGHT_JOIN parent AS table1 ON table1.id1=table2.id1
         AND table1.id2=table2.id2
         AND table1.time=table2.time
         WHERE table1.id1=123456
           AND ((table1.time>=0
                 AND table1.time<=1361936895)))
      UNION ALL
        (SELECT table1.id1 AS id1, table1.id1_type
         FROM child AS table2 STRAIGHT_JOIN step_parent AS table1 ON table1.id1=table2.id1
         AND table1.id2=table2.id2
         AND table1.time=table2.time
         WHERE table1.id1=123456
                 AND table1.time<=1361936895)))) AS T
WHERE id1_type NOT IN (15)
ORDER BY time DESC LIMIT 2000

Я использую следующий запрос sql (два соединения, одно объединение все), и я вижу сильное увеличение задержки после добавления объединений внутри. Я вижу, как на моих машинах растет использование дискового пространства, и мне интересно, не потому ли, что я создаю временные таблицы?

В качестве дополнительного контекста, когда я добавил объединения, я также добавил псевдонимы «table1», «table2», чтобы избежать двусмысленности при выборе столбцов. Я начал замечать, что это использование пространства увеличивается.

Любые предложения о том, почему это добавление или запрос в целом вызывают огромный всплеск хранилища для этих запросов, будут оценены :)


person sparkFinder    schedule 14.03.2013    source источник
comment
STRAIGHT_JOIN подразумевает MySQL   -  person msmucker0527    schedule 14.03.2013


Ответы (1)


Механизм базы данных должен решить, что, по его мнению, является лучшей стратегией для выполнения вашего запроса. Спулинг к временным таблицам - определенно одна из его возможностей.

Псевдонимы таблиц действительно не должны иметь к этому никакого отношения, правый столбец - это правый столбец, независимо от того, какой ярлык вы для него используете.

Ради интереса, вы пробовали использовать join вместо Straight_join? Вы ограничиваете параметры оптимизатора запросов, указав direct_join.

person MattW    schedule 14.03.2013
comment
Я использовал direct_join, так как знаю, что дочерние строки будут подмножеством parent и foster_parent. Я рад узнать, что псевдонимы не вызывают использование временной таблицы. - person sparkFinder; 14.03.2013
comment
Я в основном специалист по SQL Server, так что с прямым соединением я не очень хорошо знаком, но, судя по тому, что я прочитал, мне интересно, есть ли у вас это задом наперед. Разве не придется выполнять полное сканирование дочерней таблицы, а затем искать, совпадают ли условия в родительской таблице или step_parent для каждой строки? Попробуйте это либо с обычным соединением, либо с изменением порядка таблицы в пределах прямых_соединений, и посмотрите, что произойдет. - person MattW; 14.03.2013
comment
Правильно - в дочерней таблице меньше строк, и я присоединяюсь именно к индексам родительского первичного ключа (не упомянутым в задаче), что, насколько я понимаю, дает меньше строк для прохождения. - person sparkFinder; 14.03.2013