ROWID (oracle) - l'utilité?
Ma compréhension est que le ROWID est une valeur unique pour chaque ligne du résultat renvoyé par une requête.
Pourquoi avons-nous besoin de cette ROWID? Il est déjà à la ROWNUM dans ORACLE.
Ont tout utilisé ROWID dans une requête SQL?
Vous devez vous connecter pour publier un commentaire.
ROWID est l'emplacement physique d'une ligne. Par conséquent, il est le moyen le plus rapide de localiser une ligne, plus rapide encore que d'une clé primaire de recherche. Ainsi, il peut être utile dans certains types de transaction où nous sélectionner certaines lignes, de stocker leurs ROWIDs et puis plus tard sur l'utilisation de la ROWIDs dans
where
de clauses DML à l'encontre de ces mêmes lignes.L'Oracle SELECT ... FOR UPDATE syntaxe utilise implicitement ROWID, lorsque nous mettons à jour le verrouillage de ligne à l'aide de OÙ les DE. Aussi le tableau des EXCEPTIONS (référencées lors de l'application de contraintes avec les EXCEPTIONS À la clause a), d'une colonne ROW_ID. Cela nous permet d'identifier rapidement les lignes qui sont en rupture de notre contrainte.
Ce dernier exemple montre à un autre usage général: quand on écrit quelque morceau de code générique et ont besoin d'un mécanisme pour le stockage de Liquides sans préoccupations concernant le type de données, les clés composites, etc.
ROWNUM sur l'autre main est une pseudo-colonne dont les balises d'une ligne dans un jeu de résultats. Il n'a pas de permanente de l'importance.
modifier
ROWID pour un enregistrement donné peut changer au cours de la durée de vie d'un système, par exemple par le biais d'un tableau de reconstruction. Aussi, si un enregistrement est supprimé et un nouveau record pourrait être donnée que ROWID. Par conséquent ROWIDs ne sont pas adaptés pour une utilisation en tant que Liquides dans le long terme. Mais ils sont assez bons pour une utilisation au sein d'une transaction.
Je sais maintenant un exemple pour cela.
supposons que vous avez un tableau avec aucune des clés primaires. donc, cette table peut avoir de doublons. Comment voulez-vous supprimer les doublons, mais de garder exactement de ce genre?
Oracle fournit ROWID comme une sorte de substitut pour la clé primaire. Vous pouvez écrire une requête imbriquée qui est de la corrélation de type [(groupe par toutes les colonnes de la ligne et de prendre MIN(ROWID) dans chaque groupe à l'intérieur de la requête, pour chaque groupe de supprimer les autres lignes du groupe dans outerquery)]
Exemple
noter que ROWID ne persiste pas dans une base de données d'EXPORTATION et d'IMPORTATION cycle.
vous ne devriez JAMAIS conserver un rowid dans vos tables une valeur de clé.
ROWID identifie de manière unique une ligne dans une table. ROWNUM vous donne le numéro de ligne d'un résultat pour une requête spécifique. Les deux sont très différents et ne sont pas interchangeables.
Il y a aussi la fonction ROW_NUMBER qui est une version plus moderne de ROWNUM, et se comporte légèrement différemment. Découvrez cet article ce qui explique la différence.
Un ROWID se compose de (mais pas nécessairement dans cet ordre, bien que la ROWNUM partie est la dernière partie de ROWID comme je me souviens bien):
L'identifiant unique de l'objet.
Le nombre relatif du fichier de données dans l'espace de table.
La relative numéro de bloc dans le fichier de données après la fileheader.
La relative rownum dans le bloc.
Vous pouvez facilement briser les ROWID dans ses champs composites (OBJID, FILENO, BLOCKNO, ROWNUM) à l'aide de la ROWIDTOCHAR() SQL-fonction, ou de l'utilisation:
Notez que le champ numéro de rangée (ou de la LIGNE dans la requête ci-dessus) est pas la même ROWNUM que le SQL pseudo colonne ROWNUM vous utilisez dans la requête de sélection, qui est juste la générées dynamiquement rownumber de la ligne dans le jeu de résultats.
Noter qu'en raison de cette mise en œuvre, les lignes, les blocs, les extensions et les segments ne sont pas transportables sans casser le ROWID, ce qui invalide index.
ROWID est l'accès le plus direct chemin vers le bloc dans lequel la ligne réside de façon unique et identifie la ligne, car il encode le fichier unique et unique bloc à l'intérieur du fichier et la ligne unique au sein du bloc.
Plus d'informations:
Voir: SGBD notes sur ROWID format
Remarque:
Si vous avez un peu de compréhension de la façon dont oracle des structures de base de données de fichiers et de blocs, et sais que certains de programmation C, vous pouvez très facilement faire un programme qui affiche le contenu du bloc de données par ROWID (un 8k, ou quelle que soit la taille de bloc est utilisé dans la base de données, le bloc qui commence à fileheadersize + BLOCKNO * TAILLE_BLOC. Le bloc contient le bloc d'en-tête et par la suite (en supposant que la table n'est pas en cluster) le rowdir, qui, pour chaque ligne donne le décalage par rapport à l'intérieur du bloc pour chaque ligne. Ainsi, par exemple, à la position 0 dans le rowdir est le taux de décalage de la 0-ième ligne dans le bloc, à la position 1 dans le rowdir la position relative de la 1ère ligne, etc. Le nombre de lignes est stocké quelque part dans le bloc d'en-tête (Voir orale de la documentation sur le bloc de mise en page).
Avec un peu de connaissances en programmation et à la recherche de la documentation sur la base de données oracle fichiers un des blocs pour la mise en page exacte de blocs, vous pouvez voir la façon dont les lignes sont stockées sur le disque, et même de reconstruire toutes les valeurs de la ligne stocke pour chaque colonne. Chaque ligne contient les métadonnées de la longueur de la ligne et le nombre de colonnes, et pour chaque colonne, une indication pour le type de la colonne et de la bytesize et appropriés par la suite la valeur. Bytesize 0 signifie que les données de la colonne est vide (ou NULL).
ROWID, fondamentalement vous permet d'avoir deux lignes avec exactement les mêmes données. Alors que, généralement, vous voulez que votre Clé Primaire pour être un peu plus constructif que de un RowID, c'est juste un moyen simple de automatiquement s'assurer de l'unicité entre les lignes.