Сложность представлений - комплексная или строительные блоки? - PullRequest
2 голосов
/ 08 июня 2011

При создании ряда представлений для базы данных, лучше иметь несколько всеобъемлющих представлений или большее количество «строительных блоков», которые можно объединить для достижения желаемого результата - или представляет собой смесь двухне обязательно плохо?

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

Существуют ли практические правила, помогающие определить, будет ли конкретное представление жизнеспособным?

Ответы [ 3 ]

2 голосов
/ 08 июня 2011

Разработка SQL в целом не подходит для парадигмы разработки программного обеспечения: она не может использоваться повторно, не приводит к определениям DRY и ее трудно поддерживать. Но самое главное, что большинство методов, которые улучшают этот статус-кво и приводят к улучшению качества кода, - это проблемы времени выполнения. И проблема времени выполнения SQL не имеет ничего общего с неоптимальной конструкцией кода в коде, она приводит к плохим планам, которые дают результаты в десятки и сотни раз медленнее, чем оптимальный план. Другими словами, когда основа определения запроса DRY без разумных блоков приводит к плану сканирования таблицы, который выполняется 10 секунд, а уродливое одноразовое представление имеет лучший план, который выполняется за 10 мс, вы забываете все о DRY и идете с уродливым но быстрый просмотр. Различия во времени выполнения между хорошим планом и плохим планом слишком велики.

Вот почему с разработкой SQL хорошие проекты заканчиваются несколькими хорошо настроенными запросами, которые постоянно измеряются и проверяются на производительность. Мне грустно говорить, но по моему опыту, чем «здоровее» код SQL был от классического кода (DRY, многоразового использования, поддерживаемого), тем больше проблем у него было в реальном мире при работе с большим объемом данных. Мне бы очень хотелось, чтобы был простой способ развертывания многократно используемых блоков SQL, которые можно было бы собрать в сложные структуры. Просто так не работает. Я достаточно знаю о том, как работает оптимизация SQL-запросов, чтобы понять, что оптимизаторы запросов смотрят на полученный сложный блок в целом, и они не могут использовать внутренние блоки как «единицы работы», им поручено оптимизировать конечный конечный результат. А оптимизация таких сложных запросов с учетом путей доступа к данным, затрат на ввод-вывод, размера данных, вероятностей распределения значений столбцов просто очень-очень сложна, на несколько порядков сложнее, чем задача, скажем, оптимизатор C # должен сделать.

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

1 голос
/ 08 июня 2011

Степень, в которой SQL позволяет вам создавать представления или любые объекты базы данных по этому вопросу, ограничена.Если у вас много представлений «строительных блоков», при составлении другого представления из этих строительных блоков оптимизатор запросов может несколько раз присоединиться к одной и той же таблице.Кроме того, таблицы, которые не требуются, также могут быть объединены.Таким образом, хотя концепция строительного блока может обеспечить степень повторного использования, ее следует использовать с осторожностью.Вместо этого сосредоточьтесь на разработке представления для конкретного требования, а затем рассмотрите возможность его разделения на строительные блоки.

1 голос
/ 08 июня 2011

Я просто разобрался с этим вопросом на этой неделе.Вот мой опыт.

Каждое представление должно соответствовать конкретной задаче.Мы пытались построить представление поверх представления (и т. Д.) И очень быстро столкнулись с проблемами производительности (конечно, в процессе производства).Переключение на один запрос, который возвратил конкретные данные вместо построения данных из представлений стандартных блоков, вернул производительность в соответствие с ожиданиями.

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

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

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

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