Welcome to Sign in | Help
in Search

TIMESTAMP

Last post 04-10-2008, 2:46 PM by cretzu. 18 replies.
Page 1 of 2 (19 items)   1 2 Next >
Sort Posts: Previous Next
  •  04-09-2008, 3:46 PM 4598

    TIMESTAMP

    Salut,

    Am o problema pe care nu prea stiu cum sa o rezolv.

    Am un tabel in BD de genu Participanti[..., Nume, Prenume, ....., UltimaModificare] si as dori ca de fiecare data cand se modifica ceva ( adica la valoarea oricarui camp ) la un anumit participant sa retin in campul UltimaModificare data ultimei modificari. M-am gandit la doua cazuri:
    1. Am pus ca si tip al campului UltimaModificare timestamp. Acest camp insa nu pot sa il convertesc la datetime -ul la care s-a facut modificarea ???
    2. M-am gandit ca ar tre sa modific acest tip de date pe datetime iar apoi sa pun un trigger pe update pe tabel care sa imi faca aceasta modificare a campului UltimaModificare in functie de data sistemului.

    Cum ar fi m optim dpdv al perfonrmantei ??

    Daniel.

    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
    Filed under: ,
  •  04-09-2008, 4:10 PM 4599 in reply to 4598

    Re: TIMESTAMP

    cretzu:
    Salut,

    Am o problema pe care nu prea stiu cum sa o rezolv.

    Am un tabel in BD de genu Participanti[..., Nume, Prenume, ....., UltimaModificare] si as dori ca de fiecare data cand se modifica ceva ( adica la valoarea oricarui camp ) la un anumit participant sa retin in campul UltimaModificare data ultimei modificari. M-am gandit la doua cazuri:
    1. Am pus ca si tip al campului UltimaModificare timestamp. Acest camp insa nu pot sa il convertesc la datetime -ul la care s-a facut modificarea ???
    2. M-am gandit ca ar tre sa modific acest tip de date pe datetime iar apoi sa pun un trigger pe update pe tabel care sa imi faca aceasta modificare a campului UltimaModificare in functie de data sistemului.

    Cum ar fi m optim dpdv al perfonrmantei ??

    Daniel.

    1. Dpdv al tipului TIMESTAMP SQL Server nu respecta standardul ANSI SQL 1992. Mai precis tipul de data SQL Server TIMESTAMP nu are nimica a face cu DATETIME / SMALLDATETIME. Vezi "timestamp data type" in BOL.
    2. Un camp tip DATETIME plus declansator (trigger) AFTER UPDATE ar fi solutia cea mai simpla pentru ceea ce doresti.
    3. Optim cred ca ar fi dacă ai adauga în UPDATE .. SET UltimaModificare = GETDATE()
  •  04-09-2008, 4:15 PM 4600 in reply to 4599

    Re: TIMESTAMP

    Iar dpdv al performantei ?? Nu cumva ideea de trigger ar scadea din performantele aplicatiei ?
    Se prefigureaza ca in tabel vor fi cam 1 mil de inregistrari .
    Am m vazut un exemplu cu timestamp

    declare @x timestamp
    select @x = convert(timestamp,getdate())
    select @x, convert(datetime,@x) as readabledatetime

    acest exemplu cand se ruleaza da rezultatul asteptat, problema in este ca daca acel camp timestamp este la nivelul tabellului atunci acesta nu se m poate modifica :( sub nicio forma.


    Merci, pentru sfat.


    Daniel.


    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
  •  04-09-2008, 4:25 PM 4602 in reply to 4600

    Re: TIMESTAMP

    Trigger-ul sau "update"-ul sunt OK. Vezi si BOL ---> Recursive Triggers

    Teoretic, performanta nu ar trebui sa sufere...

  •  04-09-2008, 4:29 PM 4604 in reply to 4600

    Re: TIMESTAMP

    ...iar daca vrei sa "vezi" si vechile valori, poti "pune" trigger-ul sa insereze "istoricul" intr-un alt tabel. De asemenea, vezi si clauza OUTPUT pentru UPDATE (2005)
  •  04-09-2008, 4:34 PM 4605 in reply to 4604

    Re: TIMESTAMP

    merci diana :) acu am aj si la clauza de OUTPUT

    Daniel

    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
  •  04-09-2008, 4:53 PM 4606 in reply to 4604

    Re: TIMESTAMP

    Am pus triggerul pe un tabel cu 1 mil de inregistrari ... :( si i-am dat apoi un UPDATE pe campul Nume ... cu 'x' ....
    si ruleaza de cam 12 minute :( si m are

    sunt curios apoi ... daca scot trigger-ul in cat timp imi face update-ul pe campul Prenume cu 'Y'

    Daniel

    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
  •  04-09-2008, 5:15 PM 4607 in reply to 4606

    Re: TIMESTAMP

    cretzu:
    Am pus triggerul pe un tabel cu 1 mil de inregistrari ... :( si i-am dat apoi un UPDATE pe campul Nume ... cu 'x' ....
    si ruleaza de cam 12 minute :( si m are

    sunt curios apoi ... daca scot trigger-ul in cat timp imi face update-ul pe campul Prenume cu 'Y'

    Daniel

    Mda... si sigur ai index pe Nume ... ?

    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  04-09-2008, 5:18 PM 4608 in reply to 4607

    Re: TIMESTAMP

    Nu am index pe Nume, dar cred ca nici nu m-ar ajuta in aceasta situatie. Ar tre dupa ce face update-ul sa faca si reindexare :( care ar dura enorm, parerea mea.
    Nu prea am atata nervi sa ii dau si un index pe nume :) si sa astept sa vad cum se comporta.


    Daniel.


    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
  •  04-09-2008, 5:22 PM 4609 in reply to 4606

    Re: TIMESTAMP

    cretzu:
    Am pus triggerul pe un tabel cu 1 mil de inregistrari ... :( si i-am dat apoi un UPDATE pe campul Nume ... cu 'x' ....
    si ruleaza de cam 12 minute :( si m are

    sunt curios apoi ... daca scot trigger-ul in cat timp imi face update-ul pe campul Prenume cu 'Y'

    Daniel

    Intrebarea este daca acesta este un scenariu curent (sa zicem) pentru aplicatia ta sau este o exceptie ?

    Publica codul sursa sa vedem si noi.


  •  04-09-2008, 5:33 PM 4610 in reply to 4609

    Re: TIMESTAMP

    Pai din aplicatia C# ar putea din greseala o anumita functie de SAVE sa faca un astfel de update pe toate articolele.
    Coduri din aplicatie nu pot publica pentru ca nu prea aj la ele :( ma ocup de SQL si cam atat.

    Eu zic ca este un scenariu curent.
    Cat desptre codul de SQL ... acesta este urmatorul.

    ALTER TABLE Participant ADD UltimaModificare DATETIME CONSTRAINT  Ultima_Default DEFAULT getdate()

    IF EXISTS (SELECT * FROM sysobjects
                WHERE id = OBJECT_ID(N'[dbo].[Participant_TRTimeStamp]')
                        AND type in (N'TR')
                )
        DROP TRIGGER [dbo].[Participant_TRTimeStamp]
    GO

    CREATE TRIGGER [dbo].[Participant_TRTimeStamp]
    ON [dbo].[Participant]
    AFTER UPDATE
    AS
    BEGIN
        UPDATE Participant SET UltimaModifcare = getdate()
        WHERE ID_Participant =
            (
                SELECT ID FROM INSERTED
            )
    END
    GO

    iar apoi am incercat cu UPDATE PArticipant SET Nume = 'x'
    Nu am index pe campul Nume pentru ca asta ar incetini si m mult



    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
  •  04-09-2008, 5:47 PM 4611 in reply to 4610

    Re: TIMESTAMP

    cretzu:
    Pai din aplicatia C# ar putea din greseala o anumita functie de SAVE sa faca un astfel de update pe toate articolele.
    Coduri din aplicatie nu pot publica pentru ca nu prea aj la ele :( ma ocup de SQL si cam atat.

    Eu zic ca este un scenariu curent.
    Cat desptre codul de SQL ... acesta este urmatorul.

    ALTER TABLE Participant ADD UltimaModificare DATETIME CONSTRAINT  Ultima_Default DEFAULT getdate()

    IF EXISTS (SELECT * FROM sysobjects
                WHERE id = OBJECT_ID(N'[dbo].[Participant_TRTimeStamp]')
                        AND type in (N'TR')
                )
        DROP TRIGGER [dbo].[Participant_TRTimeStamp]
    GO

    CREATE TRIGGER [dbo].[Participant_TRTimeStamp]
    ON [dbo].[Participant]
    AFTER UPDATE
    AS
    BEGIN
        UPDATE Participant SET UltimaModifcare = getdate()
        WHERE ID_Participant =
            (
                SELECT ID FROM INSERTED
            )
    END
    GO

    iar apoi am incercat cu UPDATE PArticipant SET Nume = 'x'
    Nu am index pe campul Nume pentru ca asta ar incetini si m mult



    CREATE TABLE Produs
    (
      ID INT IDENTITY(1,1) PRIMARY KEY,
      Denumire VARCHAR(50) NOT NULL,
      UltimaModificare DATETIME DEFAULT GETDATE() NOT NULL
    )
    GO

    /*
    WHILE 1 = 1
      INSERT INTO Produs (Denumire) VALUES ('A')
    GO
    */

    CREATE TRIGGER trgProdusUpdate
    ON Produs
    AFTER UPDATE
    AS
    IF NOT UPDATE(UltimaModificare)
      UPDATE Produs
      SET UltimaModificare = GETDATE()
      FROM Produs INNER JOIN inserted ON Produs.ID = inserted.ID
    GO

    UPDATE Produs
    SET Denumire = 'C'
    GO

    In declansator foloseste jonctiune si nu subinterogare.
  •  04-09-2008, 5:49 PM 4612 in reply to 4611

    Re: TIMESTAMP

    Merci pentru sfat :) chiar ma gandeam ca poate se poate scrie m  bine update-ul ala :)

    Daniel.

    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
  •  04-09-2008, 5:52 PM 4613 in reply to 4611

    Re: TIMESTAMP

    De asemenea daca nu te declari multumit poti testa si o solutie folosind "server trace" (daca ai SQL Server 2005).
    Vezi BOL plus [1] si [2].
  •  04-09-2008, 5:59 PM 4615 in reply to 4613

    Re: TIMESTAMP

    Ca si date comparative pe un tabel cu 60.000 de intreg

    1. Dc folosesc un timestamp atunci update-ul se face in cam 7 sec
    2. daca folosesc un datetime cu trigger update-ul se face in 30 sec.

    E o diferenta cam mare :(

    O sa incerc sa testez si server trace ... daca zici ca s-ar putea sa se imbunatateasca rezultatul.


    DAniel.

    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
Page 1 of 2 (19 items)   1 2 Next >
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems