Привет, разработчики. Я изучаю способы быстрого выбора строк из множества таблиц с одинаковой структурой. В таблицах слишком много данных для одной таблицы. Итак, каждая таблица содержит данные за 1 месяц. Например, log_2011_01, log_2011_02 и т. д. В таблицах есть столбец даты и времени created_at.
Мне нужно создать хранимую процедуру, она должна содержать 2 параметра даты и времени для поиска между этими датами и некоторыми другими.
Теперь я вижу следующую реализацию: хранимая процедура должна вычислить набор таблиц между двумя датами и сгенерировать sql для выбора данных с union_all . Я думаю, что я буду тяжеловат и не готов к хайлоаду, не так ли? Есть ли другие возможности сделать это? Спасибо
Ответ 1 · рейтинг 2 · Devart
Согласен с другими комментариями, но я пытался помочь вам с SP. Этот SP создает запрос, который может быть выполнен с подготовленным заявления.
-- SP definition:
DELIMITER $$
CREATE PROCEDURE iterateMonths(IN fromDate DATE, IN toDate DATE)
BEGIN
DECLARE tempDate DATE;
DECLARE query VARCHAR(1000); -- Query string, length might be increased
SET tempDate = fromDate - INTERVAL (dayofmonth(fromDate) - 1) DAY;
WHILE tempDate <= toDate
DO
IF query IS NOT NULL THEN
SET query = concat(query, '\r\nUNION ALL\r\n');
ELSE
SET query = '';
END IF;
SET query = concat(query, 'SELECT * FROM log_', DATE_FORMAT(tempDate, '%Y_%m'));
SET tempDate = tempDate + INTERVAL 1 MONTH;
END WHILE;
SELECT query; -- Output generated query
END
$$
DELIMITER ;
-- Call the SP
SET @fromDate = '2010-07-29';
SET @toDate = '2011-08-29';
CALL iterateMonths(@fromDate, @toDate);
-- Output:
SELECT * FROM log_2010_07
UNION ALL
SELECT * FROM log_2010_08
UNION ALL
SELECT * FROM log_2010_09
UNION ALL
SELECT * FROM log_2010_10
UNION ALL
SELECT * FROM log_2010_11
UNION ALL
SELECT * FROM log_2010_12
UNION ALL
SELECT * FROM log_2011_01
UNION ALL
SELECT * FROM log_2011_02
UNION ALL
SELECT * FROM log_2011_03
UNION ALL
SELECT * FROM log_2011_04
UNION ALL
SELECT * FROM log_2011_05
UNION ALL
SELECT * FROM log_2011_06
UNION ALL
SELECT * FROM log_2011_07
UNION ALL
SELECT * FROM log_2011_08