MSSQL varie: differenze tra le versioni

Da Emigar.
Jump to navigation Jump to search
Nessun oggetto della modifica
Nessun oggetto della modifica
 
(19 versioni intermedie di uno stesso utente non sono mostrate)
Riga 2: Riga 2:


==ricalcolo statistiche per database==
==ricalcolo statistiche per database==
use miudb
use MioDB
go
go
EXEC sp_updatestats;
EXEC sp_updatestats;
go
go


==Elenco files e spazio occupato==




Elenco files e spazio occupato


SELECT
SELECT
Riga 17: Riga 15:
f.physical_name AS PhysicalFilePath,
f.physical_name AS PhysicalFilePath,
f.type_desc AS FileType,
f.type_desc AS FileType,
cast(f.size*8.0/1024.0 as float) mb,
f.size, -- Vediamo se questo valore è leggibile
f.max_size,
f.max_size,
f.growth
f.growth
Riga 24: Riga 22:
INNER JOIN
INNER JOIN
sys.databases AS d ON f.database_id = d.database_id
sys.databases AS d ON f.database_id = d.database_id
order by f.size;
order by f.type_desc,f.size;




select type_desc,cast(sum(size)*(8.0/1024) as float) as mb,count(*) as num from sys.master_files group by type_desc






==shrink datafiles e log==




==spostamento datafiles==
===metodo detach attach===
Metti offline il database
ALTER DATABASE MioDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
EXEC sp_detach_db 'MioDB';
GO

Copia o sposta i file verso il nuovo percorso.

Riattacca il database:
CREATE DATABASE MioDB
ON
(
FILENAME='/nuovo_storage/MioDB.mdf'
),
(
FILENAME='/nuovo_storage/MioDB_log.ldf'
)
FOR ATTACH;
GO

===metodo rename file===
* elencare files e percorsi:
SELECT name,physical_name,state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'MioDB');
* Mettere offline il database:
ALTER DATABASE MioDb SET OFFLINE;
GO
Se serve forzare transazioni in corso:
ALTER DATABASE MioDB SET OFFLINE WITH ROLLBACK IMMEDIATE;
GO
* Spostare o copiare i datafile
mv /vecchio_percorso/miodb01.mdf /nuovo_percorso/
mv /vecchio_percorso/miodb01_log.ldf /nuovo_percorso/
* rinominare i files nel DB
ALTER DATABASE MioDB MODIFY FILE (NAME = MioDB_DATA, FILENAME = '/nuovo_percorso/miodb01.mdf');
GO
ALTER DATABASE MioDB MODIFY FILE (NAME = MioDB_LOG, FILENAME = '/nuovo_percorso/miodb01_log.ldf');
GO
* rimettere online il DB
ALTER DATABASE MioDB SET ONLINE;
GO
===metodo online===
* aggiungi un nuovo file
ALTER DATABASE NomeDatabase
ADD FILE (
NAME = 'NomeNuovoFile',
FILENAME = 'D:\NuovoPercorso\NomeNuovoFile.ndf',
SIZE = 100MB,
FILEGROWTH = 100MB
);
* sposta i dati tutti nel nuovo file
DBCC SHRINKFILE ('NomeVecchioFile', EMPTYFILE);
* rimuovi il vecchio file
ALTER DATABASE NomeDatabase REMOVE FILE NomeVecchioFile;

==sessioni bloccate==

SELECT
r.session_id AS [Sessione Bloccata],
r.blocking_session_id AS [ID Bloccante],
t.text AS [Query Bloccante],
w.wait_type AS [Tipo di Attesa],
w.wait_duration_ms AS [Durata Attesa (ms)]
FROM sys.dm_exec_requests r
JOIN sys.dm_os_waiting_tasks w ON r.session_id = w.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.blocking_session_id <> 0;






<pre>
SELECT
s.session_id,
s.login_name,
s.host_name,
s.program_name,
s.status AS session_status,
r.start_time,
r.total_elapsed_time,
r.wait_type,
r.blocking_session_id,
st.text AS query_text
FROM sys.dm_exec_sessions AS s
LEFT JOIN sys.dm_exec_requests AS r ON s.session_id = r.session_id
LEFT JOIN sys.dm_exec_connections AS c ON s.session_id = c.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
WHERE s.is_user_process = 1 -- Filtra solo i processi utente (esclude quelli di sistema)
ORDER BY s.session_id;
</pre>




<pre>
SELECT
r.session_id,
r.status,
r.wait_type,
r.wait_time,
r.blocking_session_id,
r.cpu_time,
r.total_elapsed_time / 1000 AS elapsed_seconds,
t.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.status = 'suspended'
ORDER BY r.total_elapsed_time DESC;
</pre>


==sessione che usa il tempdb==
<pre>
SELECT
s.session_id,
s.login_name,
s.host_name,
s.program_name,
r.status,
r.command,
(su.user_objects_alloc_page_count
+ su.internal_objects_alloc_page_count) * 8 / 1024 AS TempDB_MB,
st.text
FROM sys.dm_db_session_space_usage su
JOIN sys.dm_exec_sessions s
ON su.session_id = s.session_id
LEFT JOIN sys.dm_exec_requests r
ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) st
WHERE s.session_id > 50
ORDER BY TempDB_MB DESC;
</pre>


[[Categoria:Database]]
[[Categoria:Database]]

Versione attuale delle 12:14, 18 giu 2026


ricalcolo statistiche per database

use MioDB
go
EXEC sp_updatestats;
go

Elenco files e spazio occupato

SELECT 
   d.name AS DatabaseName,
   f.name AS LogicalFileName,
   f.physical_name AS PhysicalFilePath,
   f.type_desc AS FileType,
   cast(f.size*8.0/1024.0 as float) mb,
   f.max_size,
   f.growth
FROM 
   sys.master_files AS f
INNER JOIN 
   sys.databases AS d ON f.database_id = d.database_id
   order by f.type_desc,f.size;


select type_desc,cast(sum(size)*(8.0/1024) as float) as mb,count(*) as num from sys.master_files group by type_desc


shrink datafiles e log

spostamento datafiles

metodo detach attach

Metti offline il database

ALTER DATABASE MioDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
EXEC sp_detach_db 'MioDB';
GO

Copia o sposta i file verso il nuovo percorso.

Riattacca il database:

CREATE DATABASE MioDB
ON
(
   FILENAME='/nuovo_storage/MioDB.mdf'
),
(
   FILENAME='/nuovo_storage/MioDB_log.ldf'
)
FOR ATTACH;
GO

metodo rename file

  • elencare files e percorsi:
SELECT name,physical_name,state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'MioDB');
  • Mettere offline il database:
ALTER DATABASE MioDb SET OFFLINE;
GO

Se serve forzare transazioni in corso:

ALTER DATABASE MioDB SET OFFLINE WITH ROLLBACK IMMEDIATE;
GO
  • Spostare o copiare i datafile
mv /vecchio_percorso/miodb01.mdf /nuovo_percorso/
mv /vecchio_percorso/miodb01_log.ldf /nuovo_percorso/
  • rinominare i files nel DB
ALTER DATABASE MioDB MODIFY FILE (NAME = MioDB_DATA, FILENAME = '/nuovo_percorso/miodb01.mdf');
GO
 ALTER DATABASE MioDB MODIFY FILE (NAME = MioDB_LOG, FILENAME = '/nuovo_percorso/miodb01_log.ldf');
GO
  • rimettere online il DB
ALTER DATABASE MioDB  SET ONLINE;
GO

metodo online

  • aggiungi un nuovo file
ALTER DATABASE NomeDatabase 
ADD FILE ( 
   NAME = 'NomeNuovoFile', 
   FILENAME = 'D:\NuovoPercorso\NomeNuovoFile.ndf', 
   SIZE = 100MB, 
   FILEGROWTH = 100MB 
);
  • sposta i dati tutti nel nuovo file
DBCC SHRINKFILE ('NomeVecchioFile', EMPTYFILE);
  • rimuovi il vecchio file
ALTER DATABASE NomeDatabase REMOVE FILE NomeVecchioFile;

sessioni bloccate

SELECT 
   r.session_id AS [Sessione Bloccata],
   r.blocking_session_id AS [ID Bloccante],
   t.text AS [Query Bloccante],
   w.wait_type AS [Tipo di Attesa],
   w.wait_duration_ms AS [Durata Attesa (ms)]
FROM sys.dm_exec_requests r
JOIN sys.dm_os_waiting_tasks w ON r.session_id = w.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.blocking_session_id <> 0;


SELECT 
    s.session_id,
    s.login_name,
    s.host_name,
    s.program_name,
    s.status AS session_status,
    r.start_time,
    r.total_elapsed_time,
    r.wait_type,
    r.blocking_session_id,
    st.text AS query_text
FROM sys.dm_exec_sessions AS s
LEFT JOIN sys.dm_exec_requests AS r ON s.session_id = r.session_id
LEFT JOIN sys.dm_exec_connections AS c ON s.session_id = c.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
WHERE s.is_user_process = 1 -- Filtra solo i processi utente (esclude quelli di sistema)
ORDER BY s.session_id;


SELECT 
    r.session_id,
    r.status,
    r.wait_type,
    r.wait_time,
    r.blocking_session_id,
    r.cpu_time,
    r.total_elapsed_time / 1000 AS elapsed_seconds,
    t.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.status = 'suspended'
ORDER BY r.total_elapsed_time DESC;

sessione che usa il tempdb

SELECT
    s.session_id,
    s.login_name,
    s.host_name,
    s.program_name,
    r.status,
    r.command,
    (su.user_objects_alloc_page_count
     + su.internal_objects_alloc_page_count) * 8 / 1024 AS TempDB_MB,
    st.text
FROM sys.dm_db_session_space_usage su
JOIN sys.dm_exec_sessions s
    ON su.session_id = s.session_id
LEFT JOIN sys.dm_exec_requests r
    ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) st
WHERE s.session_id > 50
ORDER BY TempDB_MB DESC;