none
problema con la creazione di tabelle tramite script RRS feed

  • Domanda

  • il problema è specifico per la ottimizzazione in funzione di DB molto ingombranti 

    ho uno script di creazione tabella   cke pone le colonne in un certo ordine 

    creo la tabella 

    faccio insert con questo ordine 

    poi vedo che per queestione di alineamento due colonne  che prima stavano in fondo [ ma sono lunghe 8 e presumibilemnte allineate a 8 ] devono essere  spostate in cima  [ subito dopo i bigint che sono lunghi 8 e allineati ] 

    riordino le colonne nello script  di creazione , faccio drop table della tabella vecchia  e  cerco di crEARE  la nuova 

    sulle istruzioni di insert basate sul nuovo tracciato   mi dà incompatibilità di tipo, valore o campo e non esegue lo script 

    se però   commento le istruzioni di insert  lo script si completa e ho la tabella col nuovo tracciato

    a questo punto

    1 )   dall'esterno dello script faccio una insert  sul tracciato nuovo 

    2)  riattivo le insert interne dello script 

    3) rieseguo lo script che cancella la tabella e la ricrea  il questo si completa e fa le insert come deve 

    sospetto che dipenda dal fatto  che conserva  il piano di esecuzione della query  e da dentro lo script riesegue il piano sul tracciato precedente 

    potete darmi lumi ?? 

    e soprattutto è da considerare un bug oppure è normale ?? 



    claudio cannella

    venerdì 4 giugno 2021 19:31

Risposte

  • hai usato lo script sulla tabella per creare struttura e dati ?

    hai controllato la parte di insert dei dati per verificare che non ci fosse qualcosa di sbagliato ?


    Edoardo Benussi
    e[dot]benussi[at]gmx[dot]com

    lunedì 7 giugno 2021 07:24
    Moderatore
  • script del 'prima' 

     

    declare @tim0 varchar(30) ,  @tima0 varchar(30) , @tim1 varchar(30)
    declare @tima1 varchar(30), @idtab int
    BEGIN TRANSACTION
    select @tim0=convert (varchar(30),sysutcdatetime(),126)
    set @tima0=@tim0

    CREATE TABLE ##tempiquery
    (
    ID bigint NOT NULL constraint PK_TQ primary key ,
    num_rec bigint NOT NULL,
    cod_tab int NOT NULL,
    tipo_trans smallint NOT NULL,
    fl_vers smallint not null  default -1,
    cod_ist smallint not null ,
    inizio datetime2(7) NOT NULL,
    fine datetime2(7) NOT NULL
    )  ON [PRIMARY]

    select '##tempiquery'as 'nometab',Has_Perms_By_Name(N'##tempiquery', 'Object', 'ALTER') as ALT_Per, 
    Has_Perms_By_Name(N'##tempiquery', 'Object', 'VIEW DEFINITION') as View_def_Per, 
    Has_Perms_By_Name(N'##tempiquery', 'Object', 'CONTROL') as Contr_Per 
    select @tima1=convert (varchar(30),sysutcdatetime(),126)
    commit--40

     begin transaction

    insert into ##tempiquery  values ( -47,0,132000,-3001 ,0 ,-1 ,'2019-10-10T08:00:00.0',@tima0)
    insert into ##tempiquery  values ( -46,1 ,-4 ,-3001,0,-1,@tim0,@tima1)
    select @tim0=convert (varchar(30),sysutcdatetime(),126)
    insert into ##tempiquery  values (-45 ,02,-4,-1001,0,-1,@tima1,@tim0)
    commit--50


    claudio cannella

    • Contrassegnato come risposta opaklaus mercoledì 18 agosto 2021 20:31
    giovedì 15 luglio 2021 09:20

Tutte le risposte

  • hai usato lo script sulla tabella per creare struttura e dati ?

    hai controllato la parte di insert dei dati per verificare che non ci fosse qualcosa di sbagliato ?


    Edoardo Benussi
    e[dot]benussi[at]gmx[dot]com

    lunedì 7 giugno 2021 07:24
    Moderatore
  • ovvio che sì le cose normali le ho già fatte io 

     ma copiando lístruzione dello script in un áltra finestra di  SSMS   quella istruzionla esegue e dopo loscripit riprende a compilarsi e a fuunzionare  è questo il fatto che non capisco 


    claudio cannella

    sabato 19 giugno 2021 15:57
  • ciao Claudio,

    puoi pubblicare gli script che generano il problema oppure, se preferisci, inviarmeli in privato via mail ?


    Edoardo Benussi
    e[dot]benussi[at]gmx[dot]com

    lunedì 21 giugno 2021 08:14
    Moderatore
  • arrivo!!

    claudio cannella

    giovedì 15 luglio 2021 09:09
  • script del 'prima' 

     

    declare @tim0 varchar(30) ,  @tima0 varchar(30) , @tim1 varchar(30)
    declare @tima1 varchar(30), @idtab int
    BEGIN TRANSACTION
    select @tim0=convert (varchar(30),sysutcdatetime(),126)
    set @tima0=@tim0

    CREATE TABLE ##tempiquery
    (
    ID bigint NOT NULL constraint PK_TQ primary key ,
    num_rec bigint NOT NULL,
    cod_tab int NOT NULL,
    tipo_trans smallint NOT NULL,
    fl_vers smallint not null  default -1,
    cod_ist smallint not null ,
    inizio datetime2(7) NOT NULL,
    fine datetime2(7) NOT NULL
    )  ON [PRIMARY]

    select '##tempiquery'as 'nometab',Has_Perms_By_Name(N'##tempiquery', 'Object', 'ALTER') as ALT_Per, 
    Has_Perms_By_Name(N'##tempiquery', 'Object', 'VIEW DEFINITION') as View_def_Per, 
    Has_Perms_By_Name(N'##tempiquery', 'Object', 'CONTROL') as Contr_Per 
    select @tima1=convert (varchar(30),sysutcdatetime(),126)
    commit--40

     begin transaction

    insert into ##tempiquery  values ( -47,0,132000,-3001 ,0 ,-1 ,'2019-10-10T08:00:00.0',@tima0)
    insert into ##tempiquery  values ( -46,1 ,-4 ,-3001,0,-1,@tim0,@tima1)
    select @tim0=convert (varchar(30),sysutcdatetime(),126)
    insert into ##tempiquery  values (-45 ,02,-4,-1001,0,-1,@tima1,@tim0)
    commit--50


    claudio cannella

    • Contrassegnato come risposta opaklaus mercoledì 18 agosto 2021 20:31
    giovedì 15 luglio 2021 09:20
  • script del dopo 

    declare @tim0 varchar(30) ,  @tima0 varchar(30) , @tim1 varchar(30)
    declare @tima1 varchar(30), @idtab int
    BEGIN TRANSACTION
    select @tim0=convert (varchar(30),sysutcdatetime(),126)
    set @tima0=@tim0

    CREATE TABLE ##tempiquery
    (
    ID bigint NOT NULL constraint PK_TQ primary key ,
    num_rec bigint NOT NULL,
    inizio datetime2(7) NOT NULL,
    fine datetime2(7) NOT NULLcod_tab int NOT NULL,
    tipo_trans smallint NOT NULL,
    fl_vers smallint not null  default -1,
    cod_ist smallint not null ,

    )  ON [PRIMARY]

    select '##tempiquery'as 'nometab',Has_Perms_By_Name(N'##tempiquery', 'Object', 'ALTER') as ALT_Per, 
    Has_Perms_By_Name(N'##tempiquery', 'Object', 'VIEW DEFINITION') as View_def_Per, 
    Has_Perms_By_Name(N'##tempiquery', 'Object', 'CONTROL') as Contr_Per 
    select @tima1=convert (varchar(30),sysutcdatetime(),126)
    commit--40

     begin transaction

    insert into ##tempiquery  values ( -47,0, '2019-10-10T08:00:00.0',@tima0,132000,-3001 ,0 ,-1)
    insert into ##tempiquery  values ( -46,1,@tim0,@tima1 ,-4 ,-3001,0,-1)
    select @tim0=convert (varchar(30),sysutcdatetime(),126)
    insert into ##tempiquery  values (-45 ,02,@tima1,@tim0,-4,-1001,0,-1)
    commit--50

    istruzione copiata all'esterno insert into ##tempiquery  values ( -47,0,,'2019-10-10T08:00:00.0',@tima0,132000,-3001 ,0 ,-1 )



    claudio cannella

    giovedì 15 luglio 2021 09:27
  • viene anche a me il sospetto che ci sia una cache dell'execution plan.

    prova a verificare qui

    https://www.sqlshack.com/understanding-sql-server-query-plan-cache/


    Edoardo Benussi
    e[dot]benussi[at]gmx[dot]com

    lunedì 19 luglio 2021 07:12
    Moderatore
  • l'articolo non è un capolavoro di chiarezza tuttavia  sembra confermare  che l'hashe del piano di esecuzione viene calcolato su 'inserte into temp[iquery valuees" ma non considera la parte di parametri fra parentesi e quindi se cambio l'ordine delle colonne o aggiungo una colonna lui cerca di inserire ancora col tracciato vecchio , mentre se  creo una query ad hoc  lui sostituisce l'hash nuovo a quello vecchio e quindi dopo le insert dello scripti funzionano


    claudio cannella

    giovedì 22 luglio 2021 05:52