整理自實務專案,涵蓋結構描述、空間分析、效能診斷、維運管理四大類常用 T-SQL 腳本,持續更新中。
SELECT
CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,
a.colorder AS 字段序號,
a.name AS 字段名,
CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN '√' ELSE '' END AS 標識,
CASE WHEN EXISTS (
SELECT 1 FROM sysindexes si
JOIN sysindexkeys sik ON si.id = sik.id AND si.indid = sik.indid
WHERE si.id = a.id AND sik.colid = a.colid
AND (si.status & 0x800) = 0x800 -- 主鍵
) THEN 'PK' ELSE '' END AS 主鍵,
t.name AS 資料類型,
a.length AS 長度,
CASE WHEN a.isnullable = 1 THEN 'Y' ELSE 'N' END AS 允許空值,
ISNULL(g.[value], '') AS 擴充說明
FROM syscolumns a
JOIN systypes t ON a.xtype = t.xusertype
JOIN sysobjects d ON a.id = d.id AND d.xtype = 'U'
LEFT JOIN sys.extended_properties g ON g.major_id = a.id AND g.minor_id = a.colorder
WHERE d.name <> 'dtproperties'
ORDER BY d.name, a.colorder;
SELECT
OBJECT_NAME(f.parent_object_id) AS 子表,
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS 子欄位,
OBJECT_NAME(f.referenced_object_id) AS 父表,
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS 父欄位,
f.name AS 外鍵名稱
FROM sys.foreign_keys f
JOIN sys.foreign_key_columns fc ON f.object_id = fc.constraint_object_id
ORDER BY 子表, 父表;
SELECT
t.name AS 表名,
p.rows AS 資料列數,
SUM(a.total_pages) * 8 / 1024.0 AS 總空間_MB,
SUM(a.used_pages) * 8 / 1024.0 AS 已用空間_MB,
SUM(a.data_pages) * 8 / 1024.0 AS 資料空間_MB
FROM sys.tables t
JOIN sys.indexes i ON t.object_id = i.object_id
JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN sys.allocation_units a ON p.partition_id = a.container_id
WHERE t.is_ms_shipped = 0 AND i.index_id IN (0,1)
GROUP BY t.name, p.rows
ORDER BY 總空間_MB DESC;
SELECT
name AS 邏輯檔名,
physical_name AS 實體路徑,
size * 8 / 1024.0 AS 目前大小_MB,
FILEPROPERTY(name, 'SpaceUsed') * 8 / 1024.0 AS 已用_MB,
(size - FILEPROPERTY(name, 'SpaceUsed')) * 8 / 1024.0 AS 可用_MB
FROM sys.database_files;
SELECT TOP 20
qs.total_worker_time / qs.execution_count AS 平均_CPU_ms,
qs.total_logical_reads / qs.execution_count AS 平均邏輯讀取,
qs.execution_count AS 執行次數,
SUBSTRING(qt.text, qs.statement_start_offset/2 + 1,
(CASE WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), qt.text)) * 2
ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) AS SQL片段,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_worker_time DESC;
SELECT
migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) AS 改善指數,
mid.statement AS 物件,
mid.equality_columns, mid.inequality_columns, mid.included_columns,
'CREATE INDEX IX_' + REPLACE(REPLACE(REPLACE(mid.statement, '[', ''), ']', ''), '.', '_')
+ ' ON ' + mid.statement
+ ' (' + ISNULL(mid.equality_columns, '') + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ', ' ELSE '' END + ISNULL(mid.inequality_columns, '') + ')'
+ ISNULL(' INCLUDE (' + mid.included_columns + ')', '') AS 建議建立腳本
FROM sys.dm_db_missing_index_groups mig
JOIN sys.dm_db_missing_index_group_stats migs ON mig.index_group_handle = migs.group_handle
JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE mid.database_id = DB_ID()
ORDER BY 改善指數 DESC;
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += 'KILL ' + CAST(spid AS NVARCHAR) + '; '
FROM sys.sysprocesses
WHERE dbid = DB_ID('YourDB') AND spid <> @@SPID;
EXEC (@sql);
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += 'ALTER INDEX ALL ON ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) + ' REBUILD WITH (ONLINE = ON, MAXDOP = 2); '
FROM sys.tables
WHERE is_ms_shipped = 0;
EXEC (@sql);
EXEC sp_MSforeachtable 'UPDATE STATISTICS ? WITH FULLSCAN';