2010-07-21 3 views
1

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

Msg 701, Level 17, State 123 Line 1 

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

+2

Ugh - Я пытаюсь вспомнить, как использовать Profiler/etc для обзора производительности (в частности, использование памяти - 2 ГБ очень мало для сервера, особенно для базы данных) ... –

+2

будет иметь базу данных, что этот хранилище данных основанный на использовании [модели значения атрибута объекта] (http://en.wikipedia.org/wiki/Entity-attribute-value_model)? –

+1

Ух, купите больше памяти – HLGEM

ответ

2

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

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

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

SET SHOWPLAN_ALL ON 

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

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

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

+0

Это сработало! В плане выполнения были показаны хэш-соединения, и я заменил их на объединения циклов. Кажется, это трюк. Огромное спасибо. – kartikq

3

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

Maximum Capacity Specifications for SQL Server

Columns per SELECT statement 4,096 
REFERENCES per table   253 
Tables per SELECT statement Limited only by available resources 
+0

Ну, на самом деле это хранилище данных с денормализованной схемой звезд. Я не думаю, что смогу сделать редизайн схемы. – kartikq

+2

денормализованные и еще 200 объединений? –

0

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

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

Смежные вопросы