понедельник, июля 30, 2007

Internal SQL Server error

В качестве последней задачи при работе с серверами ms sql 2000 пришлось менять структуры логов + нормализовать ранее ненормализованные данные, выделять отдельные словари, сложность была в том, что таблицы логов были огромны, данные, подлежащие нормализации и конвертации, как-то особенно ей не подвергались, ну и плюс наличие всякого рода мусора...ну да ладно, это вступление, суть не в этом, а в том, что после этой нормализации на нескольких серверах стала появляться ошибка:
Internal SQL Server error
причем на вставке только в одну и туже таблицу....лечили сначала перестройкой индексов, потом стали искать hotfix, нашли...

Cumulative list of the hotfixes that are available for SQL Server 2000 SP4

там же и описание нашей проблемы:

915436 (http://support.microsoft.com/kb/915436/) FIX: Error message when you run a complex insert query or a stored procedure in SQL Server 2000: "Internal SQL Server error"


сам hotfix выложен 19 июля 2007 года, для скачивания пока не доступен, а может просто не искали, так как решение проблемы нашлось само собой - читать дальше:

Hotfix information

A supported hotfix is now available from Microsoft, but it is only intended to correct the problem that is described in this article. Only apply it to systems that are experiencing this specific problem. This hotfix may receive additional testing. Therefore, if you are not severely affected by this problem, we recommend that you wait for the next SQL Server 2000 service pack that contains this hotfix.

To resolve this problem immediately, contact Microsoft Product Support Services to obtain the hotfix. For a complete list of Microsoft Product Support Services telephone numbers and information about support costs, visit the following Microsoft Web site:

Из описания проблемы обратил внимание на следующее:

SYMPTOMS

When you run a query or a stored procedure in SQL Server 2000, you may receive an error message that resembles the following:
Server: Msg 8624, Level 16, State 1, Line 1 Internal SQL Server error
This problem occurs when you use a complex insert query that joins several tables. Typically, this problem occurs when the query runs parallel across multiple processors.

When this problem occurs, you may also experience the following symptoms:
The query does not run.
You cannot see the SHOWPLAN_ALL or SHOWPLAN_TEXT output for the query.
Note State 1 and Line 1 in the error message help distinguish this problem from other types of 8624 error messages. If a different state and line number exist in the error message, you are probably not experiencing this problem.

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

insert into
select

на сам select план получил, решил посмотреть план с учетом insert statement, и...реально увидел сообщение об ошибке....из описания симптомов обратил внимание также на следующее:


This problem occurs when you use a complex insert query that joins several tables. Typically, this problem occurs when the query runs parallel across multiple processors.

Это как раз наш случай, вышеуказанный запрос выполнялся на многопроцессорной машине, при работе c sql server были задействованы все имеющиеся 4ре процессора:


Image Hosted by ImageShack.us

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

option (maxdop 1), т.е. просто указав, что для моей вставки будет использоваться ресурсы только одного процессора...


т.е.

insert into

select <....>

option (maxdop 1)

посмотрим план, и...ошибка исчезла...





ps: вообщем, для моего случая это стало решением...не знаю, может кому и пригодится, благодарности принимаются в виде пива:)

Комментариев нет: