Вы когда-нибудь сталкивались запрос, SQL Server не может выполнить, поскольку она ссылается слишком много таблиц?

голоса
15

Вы когда-нибудь видели там сообщения об ошибках?

- SQL Server 2000

Не удалось выделить вспомогательную таблицу для просмотра или разрешения функции.
Было превышено максимальное количество таблиц в запросе (256).

- SQL Server 2005

Слишком много имен таблиц в запросе. Максимально допустимая 256.

Если да, то что вы сделали?

Сдавшийся? Будучи убеждена клиента, чтобы упростить их требования? Денормализованные базы данных?


@ (Каждый хочет, чтобы я отправил запрос):

  1. Я не уверен, если я могу вставить 70 килобайт кода в окне редактирования ответа.
  2. Даже если я могу это это не поможет, так как это 70 килобайт кода будет ссылаться на 20 или 30 взглядов, я бы также размещать так как в противном случае код будет бессмысленным.

Я не хочу звучать как я хвастовство здесь, но проблема не в запросах. Запросы являются оптимальными (или, по крайней мере, почти оптимально). Я потратил много времени, оптимизируя их, глядя на каждого столбца и каждой отдельной таблицы, которые могут быть удалены. Представьте себе отчет, который имеет 200 или 300 столбцов, которые должны быть заполнены одной ЗЕЬЕСТОМ (потому что, как он был разработан несколько лет назад, когда он был еще маленький отчетом).

Задан 05/08/2008 в 15:54
источник пользователем
На других языках...                            


8 ответов

голоса
1

Я никогда не встречал такого рода ситуации, и, честно говоря, идея ссылки> 256 таблиц в запросе меня-сын смертельный страх.

Ваш первый вопрос должен вероятно, «Почему так много?», За которым следует « что биты информации мне НЕ нужно?» Я бы беспокоился о том , что объем данных, возвращаемых из такого запроса начнет влиять на производительность приложения довольно сильно, тоже.

Ответил 05/08/2008 в 15:57
источник пользователем

голоса
0

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

Ответил 05/08/2008 в 15:58
источник пользователем

голоса
1

@chopeen Вы можете изменить путь вы вычисляющие эти статистические данные, и вместо того, чтобы сохранить отдельную таблицу всех параметров на каждый продукт .. когда заказ размещен, проходные продукты и обновлять соответствующие записи в таблице статистики. Это перенесет много нагрузки расчета на страницу оформления заказа, а не работает все в одном огромном запросе при выполнении отчета. Конечно, есть некоторые статистические данные, которые не собираются работать, а так, например, отслеживать следующие покупки клиентов после покупки конкретного продукта.

Ответил 05/08/2008 в 16:19
источник пользователем

голоса
8

Для SQL Server 2005, я бы рекомендовал использовать таблицы переменных и частично строить данные, как вы идете.

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

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

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

После завершения, вы можете сделать простой SELECT * из переменной таблицы и вернуть этот набор результатов пользователю.

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

Ответил 05/08/2008 в 16:19
источник пользователем

голоса
0

Сообщение запроса: D

Кроме того, я чувствую, как один из возможных проблем можно было бы иметь тонну (чтение 200+) из имя / значение таблиц, которые могут конденсированными в одну таблицу перекодировки.

Ответил 05/08/2008 в 16:26
источник пользователем

голоса
1

Это происходит все время при написании отчетов служб отчетов для установки Dynamics CRM работает на SQL Server 2000. CRM имеет хорошо нормализованной схемы данных , что приводит к большим объединений. Там на самом деле исправление вокруг этой воли до предела от 256 до целых 260: http://support.microsoft.com/kb/818406 (мы всегда думали , что это большая шутка со стороны команды SQL Server).

Решение, как aludes Dillie-O, чтобы, чтобы определить соответствующими «суб-соединение» (предпочтительно те, которые используются несколько раз) и фактор их в темпе-таблице переменные, которые затем используют в вашем главном присоединяется. Это крупный PIA и часто убивает производительность. Мне жаль тебя.

@Kevin, люблю этот тройник - говорит, что это все :-).

Ответил 02/11/2008 в 16:50
источник пользователем

голоса
0

У меня была такая же проблема ... мой ящик развития работает SQL Server 2008 (вид работало нормально), но на производстве (с SQL Server 2005), вид не сделал. Я в конечном итоге создание представлений, чтобы обойти это ограничение, используя новые представления как часть запроса в представлении, что бросил ошибку.

Вид глупо, учитывая логическое исполнение такого же ...

Ответил 19/08/2010 в 18:29
источник пользователем

голоса
0

Если бы один и тот же вопрос в SQL Server 2005 (работал в 2008 году), когда я хотел, чтобы создать представление. Я решил проблему путем создания хранимой процедуры вместо представления.

Ответил 07/03/2012 в 16:59
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more