Вставка таблицы с использованием хранимых процедур? - PullRequest
1 голос
/ 18 октября 2019

(Отправка для пользователя «Снежинка», в надежде получить дополнительную помощь)


Есть ли другой способ ускорить вставку таблицы с использованием хранимой процедуры? Я начал создавать usp с целью вставки примерно миллиона строк тестовых данных в таблицу с целью нагрузочного тестирования.

Я попал на этот этап, показанный ниже, и установил значение итерации равным 10000.

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

Да - я использую хранилище данных XS, но даже если это значение увеличивается до MAX - этоЭто медленный способ быть полезным.

- создать тестовую таблицу

CREATE OR REPLACE TABLE myTable
(
   myInt NUMERIC(18,0)
);

- проверить js usp с помощью оператора while с намерением вставить несколько строк вТаблица (Миллионы) для нагрузочного тестирования

CREATE OR REPLACE PROCEDURE usp_LoadTable_test()
RETURNS float
LANGUAGE javascript
EXECUTE AS OWNER
AS
$$
//set the number of iterations
   var maxLoops = 10;
//set the row Pointer
   var rowPointer = 1;
//set the Insert sql statement
   var sql_insert = 'INSERT INTO myTable VALUES(:1);';   
//Insert the fist Value
       sf_startInt = rowPointer + 1000;
       resultSet = snowflake.execute( {sqlText: sql_insert, binds: [sf_startInt] });
//Loop thorugh to insert all other values
   while (rowPointer < maxLoops)
   {
       rowPointer += 1;
       sf_startInt = rowPointer + 1000;
       resultSet = snowflake.execute( {sqlText: sql_insert, binds: [sf_startInt] });
   }

   return rowPointer;
$$;
CALL usp_LoadTable_test();

До сих пор я получил следующие рекомендации:

Рекомендация № 1

Одна вещь, которую вы можете сделать, это использовать «таблицу фидеров», содержащую 1000 или более строк вместо INSERT ... VALUES , например:

INSERT INTO myTable SELECT <some transformation of columns> FROM "feeder table"

Рекомендация № 2

При выполнениимиллион вставок в одну строку, вы потребляете миллион микроперегородок - каждый по 16 МБ.

Этот кусок памяти размером 16 ТБ может быть виден в вашем счете «Снежинка» ... Обычные таблицы сохраняются в течение минимум 7 дней после удаления.

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


Рекомендация# 3

Использовать функции генерирования данных, которые работают очень быстро, если вам нужны последовательные целые числа: https://docs.snowflake.net/manuals/sql-reference/functions/seq1.html


Любые другие идеи?

1 Ответ

1 голос
/ 21 октября 2019

Этот вопрос также задавался в Домике Снежинки несколько недель назад. Учитывая ответы, которые вы получили, вы все еще чувствуете себя без ответа, тогда, возможно, намекните, почему?

Если вы просто хотите таблицу с одним столбцом порядковых номеров, используйте GENERATOR (), как в # 3 выше. В противном случае, если вам нужен совет, поделитесь вашими конкретными требованиями.

...