Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Tempdb Penuh Saat Menanyakan Hitungan Berbeda Dari Semua Tabel

Anda harus selalu mempertimbangkan pertentangan sebelum menambahkan file TempDb. Menambahkan 7 file TempDb tambahan tidak akan membantu.

Tidak, seharusnya tidak. Tetapi apakah Anda yakin bahwa Anda tidak berurusan dengan sejumlah besar data atau Anda tidak memiliki proses lain yang berjalan di SQL? Kursor, tabel Temp, dan bahkan variabel tabel menggunakan TempDb secara ekstensif. Periksa objek mana yang menghabiskan lebih banyak ruang TempDb:

SELECT
    SUM (user_object_reserved_page_count)*8 as usr_obj_kb,
    SUM (internal_object_reserved_page_count)*8 as internal_obj_kb,
    SUM (version_store_reserved_page_count)*8  as version_store_kb,
    SUM (unallocated_extent_page_count)*8 as freespace_kb,
    SUM (mixed_extent_page_count)*8 as mixedextent_kb
FROM sys.dm_db_file_space_usage

Jadi, jika pengguna dan objek internal Anda lebih banyak, itu jelas berarti Anda memiliki ruang TempDb rendah karena kursor dan penggunaan internal SQL Server (Misalnya:tabel perantara, gabungan Hash, agregasi Hash, dll.)

Anda dapat menggunakan kode di bawah ini untuk mendapatkan jumlah semua tabel di semua database

  DECLARE @Stats TABLE (DBNAME VARCHAR(40), NAME varchar(200), Rows INT)
INSERT INTO @Stats
EXECUTE sp_MSForEachDB 
        'USE ?; SELECT DB_NAME()AS DBName, 
        sysobjects.Name
    , sysindexes.Rows
FROM
    sysobjects
    INNER JOIN sysindexes
    ON sysobjects.id = sysindexes.id 
WHERE
    type = ''U''
    AND sysindexes.IndId < 2'

    SELECT * FROM @Stats

Saya telah menulis artikel di TempDb rekomendasi ; Saya menyarankan Anda untuk membacanya untuk memahami objek yang dapat memengaruhi TempDb dan bagaimana menyelesaikan masalah umum itu. Idealnya, total ukuran TempDb Anda harus dihitung berdasarkan pengamatan yang dalam kasus Anda> 24 GB.

** Sunting 1***

Jika Anda tidak yakin tentang pembaruan statistik, gunakan kueri di bawah ini untuk menghitung semua tabelCatatan:Ganti basis data yang statistiknya tidak Anda inginkan

    DECLARE @ServerStats TABLE (DatabaseName varchar(200), TableName varchar(200), RowsCount INT)
INSERT INTO @ServerStats
exec sp_msforeachdb @command1='
use #;
if ''#'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'',''ReportServer'')
begin
print ''#''
exec sp_MSforeachtable @command1=''
SELECT ''''#'''' AS DATABASENAME, ''''?'''' AS TABLENAME, COUNT(*)  FROM ? ;
''
end 
', @replacechar = '#'

SELECT * FROM @ServerStats

demikian pula Anda dapat mengambil yang berbeda di semua tabel untuk semua database dengan kueri di bawah ini

    DECLARE @ServerStatsDistinct TABLE (DatabaseName varchar(200), TableName varchar(200), RowsCount INT)
INSERT INTO @ServerStatsDistinct
exec sp_msforeachdb @command1='
use #;
if ''#''  NOT IN (''master'', ''model'', ''msdb'', ''tempdb'',''ReportServer'')
begin
print ''#''
exec sp_MSforeachtable @command1=''
SELECT ''''#'''' AS DATABASENAME, ''''?'''' AS TABLENAME, COUNT(*)  FROM  (
    SELECT DISTINCT *
    FROM ?
) a  ;
''
end 
', @replacechar = '#'

SELECT * FROM @ServerStatsDistinct



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara memasukkan baris baru dengan benar di nvarchar

  2. Apa cara terbaik untuk memastikan integritas referensial pada database yang direplikasi?

  3. Pilih catatan antara dua tanggal dalam dua kolom

  4. Ekspor hasil prosedur tersimpan yang disetel ke Excel di SSMS

  5. menulis fungsi di sql server