web-dev-qa-db-fra.com

SQL Server: dois-je utiliser des tables information_schema sur des tables sys?

Dans SQL Server, il existe deux schémas pour les métadonnées:

  • INFORMATION_SCHEMA
  • SYS

J'ai entendu dire que INFORMATION_SCHEMA les tables sont basées sur la norme ANSI. Lors du développement, par exemple les procédures stockées, s'il est sage d'utiliser INFORMATION_SCHEMA tables sur sys tables?

49
juur

J'essaierais toujours d'utiliser le Information_schema vues sur l'interrogation directe du schéma sys.

Les vues sont conformes ISO, donc en théorie, vous devriez pouvoir migrer facilement toutes les requêtes à travers différents SGBDR.

Cependant, dans certains cas, les informations dont j'ai besoin ne sont tout simplement pas disponibles dans une vue.

J'ai fourni quelques liens avec des informations supplémentaires sur les vues et l'interrogation d'un catalogue SQL Server.

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

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

31
codingbadger

À moins que vous n'écriviez une application dont vous savez pertinemment qu'elle devra être portable ou que vous ne souhaitiez que des informations assez basiques, je utiliserais par défaut les vues système SQL Server propriétaires pour commencer.

Le Information_Schema les vues montrent uniquement les objets compatibles avec la norme SQL-92. Cela signifie qu'il n'y a pas de vue de schéma d'informations pour les constructions même assez basiques telles que les index (ceux-ci ne sont pas définis dans la norme et sont laissés comme détails d'implémentation.) Sans parler des fonctionnalités propriétaires de SQL Server.

De plus, ce n'est pas tout à fait la panacée pour la portabilité que l'on peut supposer. Les implémentations diffèrent toujours entre les systèmes. Oracle ne l'implémente pas du tout "out of the box" et les documents MySql disent:

Les utilisateurs de SQL Server 2000 (qui suit également la norme) peuvent remarquer une forte similitude. Cependant, MySQL a omis de nombreuses colonnes qui ne sont pas pertinentes pour notre implémentation et a ajouté des colonnes spécifiques à MySQL. L'une de ces colonnes est la colonne ENGINE de la table INFORMATION_SCHEMA.TABLES.

Même pour les constructions SQL de type pain and butter telles que les contraintes de clé étrangère, le Information_Schema les vues peuvent être considérablement moins efficaces que les sys. vues car elles n'exposent pas les ID d'objet qui permettraient une interrogation efficace.

par exemple. Voir la question Ralentissement des requêtes SQL de 1 seconde à 11 minutes - pourquoi? et les plans d'exécution.

INFORMATION_SCHEMA

Plan

sys

Plan

32
Martin Smith

INFORMATION_SCHEMA convient mieux au code externe qui peut avoir besoin de s'interfacer avec une variété de bases de données. Une fois que vous avez commencé à programmer in la base de données, la portabilité sort de la fenêtre. Si vous écrivez des procédures stockées, cela me dit que vous vous êtes engagé sur une plate-forme de base de données particulière (pour le meilleur ou pour le pire). Si vous vous êtes engagé sur SQL Server, utilisez par tous les moyens les vues sys.

10
Peter Radocchia

Je ne répéterai pas certaines des autres réponses mais ajouterai une perspective de performance. Les vues information_schema, comme Martin Smith le mentionne dans sa réponse, ne sont pas la source la plus efficace de ces informations car elles doivent exposer les colonnes standard qui doivent être collectées à partir de plusieurs sources sous-jacentes. Les vues sys peuvent être plus efficaces de ce point de vue, donc si vous avez des exigences de performances élevées et n'avez pas à vous soucier de la portabilité, vous devriez probablement opter pour les vues sys.

Par exemple, la première requête ci-dessous utilise information_schema.tables pour vérifier si une table existe. Le second utilise sys.tables pour faire la même chose.

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';

Lorsque vous affichez le IO pour ceux-ci, la première requête a 4 lectures logiques vers sysschobjs et sysclsobjs, tandis que la seconde n'en a aucune. De plus, la première fait deux recherches d'index non cluster et une clé recherche alors que le second ne recherche qu’un seul index clusterisé. Le premier coûte environ 3 fois plus que le second selon les plans de requête. Si vous devez effectuer cette opération plusieurs fois dans un grand système, par exemple pour le temps de déploiement, cela et causer des problèmes de performances. Mais cela ne s'applique vraiment qu'aux systèmes lourdement chargés. La plupart des systèmes informatiques ne présentent pas ces niveaux de problèmes de performances.

Encore une fois, le coût global de ceux-ci est très faible individuellement par rapport à d'autres requêtes dans la plupart des systèmes, mais si votre système a beaucoup de ce type d'activité, il pourrait s'additionner.

1
Tombala