2012-06-26 1 views
1

Я только что узнал о временных таблицах, и использование их дало мне некоторые действительно хорошие скорости в некоторых моих больших запросах.Создание и использование временных таблиц

Проблема заключается в том, что когда я создаю таблицу, она не длится для полной длины следующего запроса, который использует его, или до конца скрипта.

Я создаю его с помощью:

$dbh->exec("CREATE TEMPORARY TABLE _temp_unique_invoice_ref ENGINE = MEMORY AS 
     (SELECT jobRef, invoiceRef FROM invoices_out_reference GROUP BY invoiceRef)") ; 

запросе после того, как она давно несколько сот строк и пытается воспользоваться временной таблицей много раз в подзапросах, но он работает только для первого подзапроса и остальная часть запроса не отвечает, что таблица не существует.

Сценарий также осложняется тем фактом, что этот запрос будет запускаться каждые 10 секунд потенциально многими пользователями, поэтому он может выполняться много раз до истечения 10 секунд.

Как я могу сделать эту работу, не используя ключевое слово TEMPORARY, и т.д. и т. Д.?


Следующий запрос - это только один большой запрос. Подготовить вызывается на том же объекте, так что это может вызвать новое соединение? Будет ли он работать, если я поставлю синтаксис create table в начале более крупного запроса и завершаю его;?

+0

Почему вы не собираетесь создавать таблицы (не временные), и как только ваша работа будет выполнена, удалите эту таблицу? – sushil

ответ

0

Вы можете использовать ::

Insert into temp_table select from table 

Он автоматически создает таблицу с описанием же, как таблицы, и когда вы закончите ее падения.

0

Информация о вашей установке недостаточна. Итак, я стараюсь угадать: может быть, вы создаете новое соединение для каждого запроса, а временная таблица привязана к соединению, поэтому не существует в других?

1

Временная таблица не может использоваться несколько раз в одном запросе.

Если данные не слишком велик, вы можете, однако, создавать копии с

CREATE TEMPORARY t2 SELECT * FROM t; 
CREATE TEMPORARY t3 SELECT * FROM t; 
CREATE TEMPORARY t4 SELECT * FROM t; 

и использовать их в большом запросе.