IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[Performance] Recursivité mais ca va pas .


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 291
    Par défaut [Performance] Recursivité mais ca va pas .
    J'ai écris une requête recursive qui assez simple mais lorsque je commence a avoir trop individu. Les performances chute.

    Peutêtre avez vous des idées?


    alter proc [dbo].[RecursiveContacts] @node varchar(50) =null, @limitLevel int = 0,@level int = 0
    as
    Declare @child varchar(50)
    declare @ATemp varchar(50)
    --SET ANSI_NULLS OFF
    --SET NOCOUNT ON
    set @child =(select count(*) from dbo.CAM_Contacts where id_contact_parent = @node )
    print @child
    if @child>0
    Begin
    print 'Child Exixts'
    set @level = @level + 1
    while(((select count(*) from dbo.CAM_Contacts where id_contact_parent =@node and id_contact not in (select id_contact from #tmp___Comtacts))>0)
    and ( @level <= @limitLevel or @limitLevel =0) )
    Begin
    select top 1 @ATemp=id_contact from dbo.CAM_Contacts where id_contact_parent =@node and id_contact not in (select id_contact from #tmp___Comtacts)
    --print 'level '+ cast( @level as varchar(20))
    --print 'limit '+ cast( @limitLevel as varchar(20))
    --print 'dbo.[RecursiveContacts]' + cast( @ATemp as varchar) + ' '+ cast(@level as varchar)
    exec dbo.[RecursiveContacts] @ATemp, @limitLevel,@level
    End
    insert into #tmp___Comtacts (id_contact) select id_contact from dbo.CAM_Contacts where id_contact = @node
    End
    Else
    Begin
    insert into #tmp___Comtacts (id_contact) select id_contact from dbo.CAM_Contacts where id_contact = @node
    End








    create proc sp_retrieve_Contact_Child @id_Parents int
    as

    IF EXISTS (select name from tempdb..sysobjects where name like '#tmp___Comtacts%')
    begin
    --print 'drop temp'
    DROP Table #tmp___Comtacts
    end
    Begin
    Create table #tmp___Comtacts (id_contact int)
    create
    end
    exec dbo.[RecursiveContacts] @id_Parents
    select * from #tmp___Comtacts tmp inner join dbo.CAM_Contacts con on con.id_contact =tmp.id_contact




    CREATE TABLE [dbo].[CAM_Contacts](
    [id_contact] [int] IDENTITY(1,1) NOT NULL,
    [id_contact_parent] [int] NOT NULL CONSTRAINT [DF_CAM_Contacts_id_contact_parent] DEFAULT ((-1)),
    CONSTRAINT [PK_CAM_Contacts] PRIMARY KEY CLUSTERED
    (
    [id_contact] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]



    Pour lancer la procèdure

    sp_retrieve_Contact_Child 778
    sp_retrieve_Contact_Child 17832

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 291
    Par défaut
    avec cette transformation je gagne +- 20 seconde sur requête 30 secondes


    alter proc [dbo].[RecursiveContacts] @node varchar(50) =null, @limitLevel int = 0,@level int = 0
    as
    declare @ATemp varchar(50)
    declare @bExit bit
    --SET ANSI_NULLS OFF
    SET NOCOUNT ON
    set @bExit = 0;
    --print @child
    if (select count(*) from dbo.CAM_Contacts where id_contact_parent = @node )>0
    Begin
    --print 'Child Exixts'
    set @level = @level + 1
    while(( @level <= @limitLevel or @limitLevel =0) )
    Begin
    set @ATemp = null
    select top 1 @ATemp=id_contact
    from dbo.CAM_Contacts con
    where id_contact_parent =@node
    and NOT EXISTS (select * from #tmp___Comtacts tmp where con.id_contact = tmp.id_contact)
    print @ATemp
    if (@ATemp is null) begin set @bExit=1; break; end;
    exec dbo.[RecursiveContacts] @ATemp, @limitLevel,@level
    End
    insert into #tmp___Comtacts (id_contact) select id_contact from dbo.CAM_Contacts where id_contact = @node
    End
    Else
    Begin
    insert into #tmp___Comtacts (id_contact) select id_contact from dbo.CAM_Contacts where id_contact = @node
    End

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/04/2005, 22h21
  2. J'ai un P4 512 de ram mais ne fct pas bien
    Par savoir dans le forum Composants
    Réponses: 9
    Dernier message: 28/03/2005, 20h14
  3. Réponses: 9
    Dernier message: 12/01/2005, 17h00
  4. [classpath] définit mais ne fonctionne pas
    Par duhnic dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 13/12/2004, 09h57
  5. [Performance] La memoire n'est pas desalloulee
    Par sylvain_2020 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 18/11/2004, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo