Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tempdb đầy đủ khi truy vấn số lượng riêng của tất cả các bảng

Bạn nên luôn cân nhắc tranh chấp trước khi thêm tệp TempDb. Thêm 7 tệp TempDb bổ sung sẽ không thực sự hữu ích.

Không, nó không nên. Nhưng bạn có chắc rằng bạn không xử lý một lượng lớn dữ liệu hoặc bạn không có quy trình khác đang chạy trên SQL? Con trỏ, bảng Temp và thậm chí các biến bảng sử dụng TempDb rộng rãi. Kiểm tra đối tượng nào đang tiêu tốn nhiều dung lượng TempDb hơn:

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

Vì vậy, nếu người dùng và các đối tượng nội bộ của bạn nhiều hơn thì điều đó rõ ràng có nghĩa là bạn có không gian TempDb thấp do sử dụng con trỏ và SQL Server nội bộ (Ví dụ:bảng trung gian, tham gia băm, tổng hợp băm, v.v.)

Bạn có thể sử dụng mã dưới đây để nhận tổng số bảng trong tất cả cơ sở dữ liệu

  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

Tôi đã viết một bài báo trên TempDb khuyến nghị ; Tôi khuyên bạn nên đọc nó để hiểu các đối tượng có thể ảnh hưởng đến TempDb và cách giải quyết các vấn đề chung của nó. Tốt nhất, tổng kích thước TempDb của bạn nên được tính toán dựa trên quan sát mà trong trường hợp của bạn là> 24 GB.

** Chỉnh sửa 1 **

Nếu bạn không chắc chắn về cập nhật số liệu thống kê, hãy sử dụng truy vấn bên dưới để tính tổng số bảng Lưu ý:Thay thế cơ sở dữ liệu mà bạn không muốn có số liệu thống kê

    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

tương tự, bạn có thể phân biệt trong tất cả các bảng cho tất cả cơ sở dữ liệu với truy vấn dưới đây

    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. Trình tạo dữ liệu cho máy chủ SQL?

  2. Người dùng không có quyền truy cập cơ sở dữ liệu

  3. Chèn vào nhiều bảng dựa trên dữ liệu bảng khác

  4. Cách tạo truy vấn từ bảng phân cấp phụ huynh

  5. Hàm IndexOf trong T-SQL