SQL Server: следует ли использовать таблицы information_schema через таблицы sys?

В SQL Server есть две схемы для метаданных:

  • INFORMATION_SCHEMA
  • SYS

Я слышал, что таблицы INFORMATION_SCHEMA основаны на стандарте ANSI. При разработке, например, хранимые процедуры, целесообразно ли использовать таблицы INFORMATION_SCHEMA поверх таблиц sys?

Ответ 1

Я всегда старался использовать представления Information_schema по запросу схемы sys.

Представления соответствуют требованиям ISO, поэтому теоретически вы должны иметь возможность легко переносить любые запросы на разные РСУБД.

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

Я предоставил некоторые ссылки с дополнительной информацией о представлениях и запросах в каталоге SQL Server.

http://msdn.microsoft.com/en-us/library/ms186778.aspx

http://msdn.microsoft.com/en-us/library/ms189082.aspx

Ответ 2

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

В представлениях Information_Schema отображаются только объекты, совместимые со стандартом SQL-92. Это означает, что нет представления схемы информации даже для довольно простых конструкций, таких как индексы (они не определены в стандарте и остаются в качестве деталей реализации). Не говоря уже о каких-либо свойствах SQL Server.

Кроме того, это не совсем панацея от переносимости, которую можно принять. Реализации все еще различаются между системами. Oracle не реализует его "из коробки" вообще и в документах MySql говорит:

Пользователи SQL Server 2000 (которые также следуют стандарту) могут заметить сильное сходство. Однако в MySQL было опущено много столбцов, которые не относящихся к нашей реализации, и добавили столбцы, которые MySQL-специфичны. Одной из таких столбцов является столбец ENGINE в Таблица INFORMATION_SCHEMA.TABLES.

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

например. См. Вопрос SQL-запрос замедляется с 1 секунды до 11 минут - почему? и планы выполнения.

INFORMATION_SCHEMA

Plan

SYS

Plan

Ответ 3

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

Ответ 4

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

Например, в первом запросе ниже используется data_schema.tables, чтобы проверить, существует ли таблица. Второй использует sys.tables, чтобы сделать то же самое.

if exists (select * from information_schema.tables where table_schema = 'dbo' and table_name = 'MyTable')
    print '75% cost';

if exists (select * from sys.tables where object_id = object_id('dbo.MyTable'))
    print '25% cost';

Когда вы просматриваете IO для них, первый запрос имеет 4 логических чтения для sysschobjs и sysclsobjs, а второй - нет. Кроме того, первый из них выполняет два некластеризованных индекса и поиск ключей, а второй - только для одного кластерного индекса. Первая стоит ~ 3 раза больше, чем вторая по планам запросов. Если вы должны делать это много раз в большой системе, скажем, для времени развертывания, это может скомпенсировать и вызвать проблемы с производительностью. Но это действительно относится только к сильно загруженным системам. Большинство ИТ-систем бизнес-систем не имеют таких проблем с производительностью.

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