Index Dans SQL

Résolu
crn_c21 Messages postés 302 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 4 février 2011 - 24 oct. 2008 à 15:47
crn_c21 Messages postés 302 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 4 février 2011 - 26 oct. 2008 à 20:29
Bonjour,

Dans une table SQL 2005, j'ai un champ IdRlt(clè primaire).Dans ce champ, j'ajoute et je supprime des lignes très régulièrement et je dois donc chercher avant de faire une nouvelle insertion le premier identifiant "libre". Dans une procédure stockée, je cherche le premier identifiant libre à partir de 1 et tant que je ne trouve pas , j'incrémente de 1.

Mon problème est que cette table possède plusieurs millions d'enregistrements et que la procédure stockée est très longue .

Quelqu'un aurait-il une autre idée pour rechercher le premier IdRlt "libre"?

Merci de votre aide

2 réponses

crn_c21 Messages postés 302 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 4 février 2011
26 oct. 2008 à 20:29
Merci pour cette réponse, je vais approfondir!

le besoin se fait sentir car la base de données est parcouru par un programme VB6(dont nous n'avons plus les sources!! et développer par un bricoleur) où bcp de variables sont déclarées en Integer (donc limité à 32568 me semble-t-il)

Une solution transitoire m'est venu(sous la douche!! lol).Puisque je supprime bcp d'enregistrement,j'ai mis un trigger sur le Deleted qui insert l'Id dans une table annexe. Cette table reprend les Id "libres".

A tester pour voir le gain de temps

Encore merci
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
26 oct. 2008 à 16:47
Salut,

As tu vraiment besoin de combler les trous ?

Si oui, essaie de faire quelquechose autour de cette requête là, basée sur une CTE et ROW_NUMBER (exemple basé sur la table [Person].[Address] de la base AdventureWorks) :

WITH IDsAndRowNumbers AS
(
    SELECT [AddressID] AS ID,
        ROW_NUMBER() OVER (ORDER BY [AddressID] ASC) AS RowNumber
    FROM [Person].[Address]
)
SELECT TOP 1 [ID], [RowNumber]
FROM IDsAndRowNumbers
WHERE [RowNumber]<>[ID]

Cette requête permet de sortir l'ID de la première entrée où le numéro séquentiel généré par ROW_NUMBER est différent du numéro séquentiel de la clé, ce qui indique un gap.
Prévoir ce qu'il faut en sortie pour les cas où aucun gap n'est trouvé, etc etc

Ca devrait mieux tourner qu'un curseur mais je pense qu'en cas d'opérations d'insert intensives tu devras basculer sur une autre stratégie.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous