Zaur Bahramov Ответов: 2

T-SQL : сгенерируйте комбинацию чисел и сохраните ее в таблице


У меня есть запрос, который генерирует все возможные комбинации из 6 чисел в диапазоне от 1 до 90. Однако он перестает работать через некоторое время генерируя следующую ошибку:
"An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown."

Есть ли способ обойти это и как сохранить результат в таблицу (не временную таблицу)?

Что я уже пробовал:

WITH Numbers(N)
     AS (SELECT number
         FROM  master..spt_values
         WHERE type='P'
         AND number BETWEEN 1 AND 90)
SELECT *
FROM   Numbers N1
       JOIN Numbers N2
         ON N2.N > N1.N
       JOIN Numbers N3
         ON N3.N > N2.N
       JOIN Numbers N4
         ON N4.N > N3.N
       JOIN Numbers N5
         ON N5.N > N4.N
       JOIN Numbers N6
         ON N6.N > N5.N

2 Ответов

Рейтинг:
12

Sandeep Mewara

Ссылка: https://support.microsoft.com/en-in/help/2874903[^]

Причина:
Эта проблема возникает из-за того, что SSMS недостаточно памяти для выделения больших результатов.

Примечание SSMS-это 32-разрядный процесс. Поэтому он ограничен 2 ГБ памяти. SSMS накладывает искусственное ограничение на количество текста, которое может быть отображено на одно поле базы данных в окне результатов. Этот предел составляет 64 КБ в режиме "сетка" и 8 КБ в режиме "текст". Если результирующий набор слишком велик, объем памяти, необходимый для отображения результатов запроса, может превысить ограничение SSMS в 2 ГБ. Поэтому большой результирующий набор может вызвать ошибку, описанную в разделе "симптомы".


Как было предложено там, чтобы обойти эту проблему, попробуйте один из следующих методов:
Method 1: Output the results as text
Настройте окно запроса так, чтобы результаты запроса выводились в виде текста. Текстовый вывод использует меньше памяти, чем сетка, и этого может быть достаточно для отображения результатов запроса. Чтобы внести это изменение, выполните следующие действия:

Щелкните правой кнопкой мыши окно запроса.
Нажмите кнопку Результаты, чтобы.
Нажмите кнопку Результаты в текст.

Method 2: Output the results to a file
Настройте окно запроса для вывода результатов запроса в файл. Вывод файла использует минимальный объем памяти. Это позволяет сохранить больше памяти для хранения набора результатов. Чтобы внести это изменение, выполните следующие действия:

Щелкните правой кнопкой мыши окно запроса.
Нажмите кнопку Результаты, чтобы.
Нажмите Кнопку Результаты В Файл.
Выполните запрос, а затем выберите расположение, в котором будет сохранен файл результатов.

Method 3: Use sqlcmd
Используйте инструмент sqlcmd[^] вместо SSMS для выполнения SQL-запросов. Этот метод позволяет выполнять запросы без ресурсов, необходимых для пользовательского интерфейса SSMS. Кроме того, вы можете использовать 64-разрядную версию Sqlcmd.exe чтобы избежать ограничения памяти, которое влияет на 32-разрядный процесс SSMS.


Рейтинг:
1

Patrice T

Цитата:
У меня есть запрос, который генерирует все возможные комбинации из 6 чисел в диапазоне от 1 до 90. Однако через некоторое время он перестает работать

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

Расскажите нам, на какой вопрос/использование вы пытаетесь ответить.
Ваш подход, вероятно, ошибочен.


Zaur Bahramov

На самом деле повторов нет, а кортежи уникальны, так что это "только" 622,614,630 (90*89*88*87*86*85/6!).

Patrice T

И вы думаете, что только 600 миллионов записей-это разумно ?