Использует ли полнофункциональные имена влияние производительности? - программирование
Подтвердить что ты не робот

Использует ли полнофункциональные имена влияние производительности?

Влияет ли использование полных имен таблиц в SQL Server на производительность?

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

Все таблицы с полной квалификацией

USE [DBFoo]
SELECT * FROM [DBFoo].[dbo].[people] a
INNER JOIN [DBBar].[dbo].[passwords] b on b.[EntityID] = a.[EntityID]

Предпочтительный?

USE [DBFoo]
SELECT * FROM [dbo].[people] a
INNER JOIN [DBBar].[dbo].[passwords] b on b.[EntityID] = a.[EntityID]

Это действительно имеет значение?

4b9b3361

Ответ 1

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

Обратите внимание, что это всего лишь привязка к компиляции, а не исполнение. Поэтому, если вы выполняете один и тот же запрос в тысячу раз, только первое исполнение "ударит" время поиска, что означает, что время поиска меньше в случае полностью квалифицированных имен. Это также означает, что использование полностью квалифицированных имен сохранит служебные данные компиляции (первый раз, когда выполняется запрос).

Остальное будет повторно использовать скомпилированный, где имена разрешены для ссылок на объекты.

Эта статья MSDN дает справедливое руководство по лучшим практикам SQL Server. (Проверьте раздел с именем: Как обратиться к объектам)

В этой ссылке более подробно описывается набор шагов для решения и проверки ссылок на объекты перед выполнением: http://blogs.msdn.com/b/mssqlisv/archive/2007/03/23/upgrading-to-sql-server-2005-and-default-schema-setting.aspx

Переходя по второй ссылке, вывод гласит, что:

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

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

Ответ 2

Влияет ли использование полных имен таблиц на SQL-сервере на производительность?

Существует тривиальное наказание, потому что текст запроса длиннее, поэтому на SQL Server отправляется больше байтов и анализируется.

Штраф академичен, честность не будет лучше или хуже из-за префиксов.

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

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

Существует значимость для определения имен объектов (см. CREATE VIEW ... WITH SCHEMABINDING), но нет никаких последствий для производительности.

Ответ 3

Наличие префикса БД вызовет проблему, если вы перенесите или переименуете имя базы данных. Это может быть причиной, по которой DBA советовал так

Ответ 4

Влияет ли использование полных имен таблиц в SQL Server на производительность? Да. Повторное использование кэшей плана устраняет необходимость "перекомпилировать" план.

BTW: Исследуйте параметр sniffing, чтобы повторное использование плана не отрицательно влияло на производительность... оборотная сторона.

MSDN: Алгоритмы для соответствия новым операторам SQL существующим, неиспользуемым планам выполнения в кеше требуют, чтобы все ссылки на объекты были полностью квалифицированы. Например, первый из этих операторов SELECT не соответствует существующему плану, а второй соответствует:

SELECT * FROM Person;

SELECT * FROM Person.Person;

Источник: https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx

Итак, MSDN рассматривает имя schema.name как полное имя, которое соответствует. Не убежден, что это коррелирует с лучшей практикой таблиц сглаживания, необходимых для того, чтобы intellisense был полезен... мутные воды.