none
eliminare record - RRS feed

  • Domanda

  • salve

    ho una tabella con 400.000 record

    ho un campo ID come campo chiave

    analizzando la tabella noto che ho 50 record che hanno solo il valore ID e tutti gli altri campi vuoti

    ho provato ad eseguire

    DELETE FROM [MioDatabase].[dbo].[MiaTabella]

    WHERE iD = 373643 or id 373642

    GO

    ma e' da 15 minuti che sta eseguendo la vista

    come posso risolvere?

    GRAZIE

    martedì 14 aprile 2020 10:46

Risposte

  • Ciao,

    potresti controllare se la query di eliminazione è ha incontrato un lock ed è quindi bloccata in attesa della risorsa, la DMV sys.dm_os_waiting_tasks può darti informazioni utili.

    A mali estremi, puoi eseguire il kill dello SPID che sta eseguendo la DELETE (ovviamente la transazione verrà respinta).

    Ciao


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn

    martedì 14 aprile 2020 21:30
    Moderatore
  • Un'operazione di delete potrebbe andare lunga anche in questi casi:

    - un trigger di delete svolge ulteriori operazioni onerose

    - esistono tabelle correlate con foreign key su cui sono definite azioni (cascading delete/update) onerose

    Nel caso in cui l'update fosse bloccata da lock di altri processi potresti impostare un lock timeout piccolo, p.es. 5sec,  in modo da accorgerti subito della loro presenza:

    /* attende il lock 5sec */
    set lock_timeout 5000
    delete...

    Da come hai scritto la where assumiamo che il campo id sia un numerico (int, etc): è così?

    ciao

    G.

    mercoledì 15 aprile 2020 15:53

Tutte le risposte

  • Ciao,

    potresti controllare se la query di eliminazione è ha incontrato un lock ed è quindi bloccata in attesa della risorsa, la DMV sys.dm_os_waiting_tasks può darti informazioni utili.

    A mali estremi, puoi eseguire il kill dello SPID che sta eseguendo la DELETE (ovviamente la transazione verrà respinta).

    Ciao


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn

    martedì 14 aprile 2020 21:30
    Moderatore
  • Un'operazione di delete potrebbe andare lunga anche in questi casi:

    - un trigger di delete svolge ulteriori operazioni onerose

    - esistono tabelle correlate con foreign key su cui sono definite azioni (cascading delete/update) onerose

    Nel caso in cui l'update fosse bloccata da lock di altri processi potresti impostare un lock timeout piccolo, p.es. 5sec,  in modo da accorgerti subito della loro presenza:

    /* attende il lock 5sec */
    set lock_timeout 5000
    delete...

    Da come hai scritto la where assumiamo che il campo id sia un numerico (int, etc): è così?

    ciao

    G.

    mercoledì 15 aprile 2020 15:53
  • oltre alle risposte corrette già ricevute non capisco perchè tu, a fronte di 50 record con questa caratteristica, esegua la seguente istruzione di delete

    DELETE FROM [MioDatabase].[dbo].[MiaTabella]

    WHERE iD = 373643 or id 373642

    GO

    perchè cancelli solo 2 record?


    Edoardo Benussi
    Microsoft MVP - Cloud and Datacenter Management
    e[dot]benussi[at]outlook[dot]it

    lunedì 20 aprile 2020 07:45
    Moderatore