SQL Server 2005 SP3 недостаточно памяти для выполнения запроса - PullRequest
1 голос
/ 22 июля 2010

Я пытаюсь выполнить огромный запрос с почти 200 внутренними объединениями в базе данных. Это дает мне следующую ошибку

Msg 701, Level 17, State 123 Line 1

Я использую базу данных на двухъядерной машине с частотой 2,7 ГГц и 2 ГБ оперативной памяти. Есть ли способ заставить этот запрос выполнить?

Ответы [ 3 ]

3 голосов
/ 22 июля 2010

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

Характеристики максимальной емкости для SQL Server

Columns per SELECT statement   4,096
REFERENCES per table           253
Tables per SELECT statement    Limited only by available resources
2 голосов
/ 22 июля 2010

200 объединений на самом деле очень распространено, если вы попадаете в ловушку EAV . Если у вас есть одна сущность с 200 столбцами, для вас есть 200 объединений!

Конечно, у SQL Server нет проблем с 200 объединениями, но вполне возможно, что он неправильно рассчитывает объем необходимой памяти. Это особенно вероятно для hash joins, которые обменивают память на лучшую производительность. Таким образом, первым шагом будет замена всех объединений циклами, например inner loop join. Соединение цикла требует очень мало памяти.

Если это не сработает, посмотрите на план выполнения. Реальный план, вероятно, не сможет преодолеть ошибку памяти, но вы можете увидеть примерный план выполнения:

SET SHOWPLAN_ALL ON

Из документации:

Когда SET SHOWPLAN_ALL включен, SQL Сервер возвращает информацию об исполнении за каждое утверждение без выполнения это, и операторы Transact-SQL не выполнен

Это может дать представление о том, что SQL планирует делать.

0 голосов
/ 22 июля 2010

Просто из любопытства проиндексированы все ваши поля FK?

Есть ли способ, которым вы можете разделить это на несколько запросов с меньшим количеством объединений? Например, если вы делаете вставку, можете ли вы вставить только основные поля, которые обеспечивают уникальность записи, а затем выполнить отдельные обновления, чтобы получить остальную информацию?

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