ВНУТРЕННЕЕ РЕШЕНИЕ НА нескольких атрибутах не работает - PullRequest
0 голосов
/ 03 июля 2018

Мне нужно обновить столбец значениями из другой таблицы ... но это происходит вечно или прерывается. Определенная безопасность (isin) может быть указана на нескольких биржах (микрофон) ... поэтому я думаю, что мне нужно иметь два условия в INNER JOIN ... ON (??). Верны ли мои попытки ниже? У меня около 170 000 записей в таблице с 40 000 уникальных изинов.

Первая попытка:

SQL:
SET SESSION SQL_BIG_SELECTS = 1;
UPDATE securities_live t1
INNER JOIN securities_prev t2
    ON t1.isin = t2.isin AND t1.mic = t2.mic
SET t1.prev_close = t2.close;

Вторая попытка:

SQL:
SET SESSION SQL_BIG_SELECTS = 1;
UPDATE securities_live t1
INNER JOIN securities_prev t2
    ON (t1.isin = t2.isin AND t1.mic = t2.mic)
SET t1.prev_close = t2.close;

Редактировать в отношении индексов для обеих таблиц на данный момент:

Indexes (securities_live):
Primary|Unique=Yes|Packed=no|Column=id|Cardinality=166776|Collation=A

Indexes (securities_prev):
Primary|Unique=Yes|Packed=no|Column=id|Cardinality=166776|Collation=A

В обеих таблицах у меня есть первичный ключ в столбце 'id'. Так, например в таблице securities_live 'Создать новый индекс' один для столбца isin, а другой для столбца mic? Как насчет имени индекса и типа индекса (первичный, индексный, уникальный, полнотекстовый)? Размер

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Как отметили комментаторы, поскольку у вас установлены индексы, я предлагаю вам попробовать их по частям. Делайте их в 5k раз, пока он не будет завершен. Попробуй 10к. Очевидно, вы не можете сделать 170 КБ или 40 КБ. У меня было много раз, когда в базе данных были миллионы строк, и мне приходилось делать их по 100 тысяч или меньше за раз. Это было из-за ограничений оборудования.

Например,

UPDATE top(1000) securities_live t1
INNER JOIN securities_prev t2
    ON t1.isin = t2.isin AND t1.mic = t2.mic
SET t1.prev_close = t2.close;

Вы можете использовать Order By, чтобы знать, что это за записи, и вам нужно следить за тем, что было обновлено.

Смотрите здесь,

как я могу обновить 100 лучших записей на сервере sql

Извините, я только что прочитал, что вы использовали MySQL,

MySQL - запрос ОБНОВЛЕНИЯ с LIMIT

0 голосов
/ 03 июля 2018

Для этого запроса:

UPDATE securities_live t1 INNER JOIN
       securities_prev t2
       ON t1.isin = t2.isin AND t1.mic = t2.mic
    SET t1.prev_close = t2.close;

Я бы предложил индекс на securities_prev(isin, mic, close).

Однако я подозреваю, что вы обновляете все или почти все записи. Если это так, обычно быстрее обрезать таблицу и заново заполнить ее insert. Update лучше всего использовать для обновления относительно небольшого числа строк.

0 голосов
/ 03 июля 2018

Попробуйте:

SET SESSION SQL_BIG_SELECTS = 1;
UPDATE securities_live t1
INNER JOIN securities_prev t2
    ON (t1.isin = t2.isin AND t1.mic = t2.mic)
SET t1.prev_close = t2.close;
...