Form numarası ile detaylı süreç ilgilerine ulaşmak için kullanılır.
SQL
select wi.Library, l.Name, p.Name, pv.Id, pv.Version, wi.Id 'WorkItemId', wi.State, wi.Name, wi.EndDate, wi.SelectedAction from wflInstances i, wflWorkItems wi, wflProcessVersions pv, wflProcesses p, wflLibraries l where i.Number=47700 and i.Id = wi.Instance and pv.Process = p.Id and wi.ProcessVersion = pv.Id and l.Id = wi.Library order by i.EndDate desc
Sql üzerinde optimizasyon veya tablolarla ilgili gelişmiş sorgu ve görüntülemeler için bu bölümde bulunan sorguları kullanabiliriz.
Tablo alanları listeleme - tbl.name ile tablo adı içerisinde veya col.name ile alan adı içerisinde
select tbl.name 'TableName', col.name 'ColumnName', typ.name, col.length from syscolumns col, sys.tables tbl, systypes typ where col.id = tbl.object_id and tbl.name like 'wfl%' and col.xtype = typ.xtype -- and col.name like '%email%' order by tbl.name, colid
Veri tabanı tablo alan kullanımı
exec sp_spaceused
Index listesi
select 'table_name'=object_name(i.id) ,i.indid ,'index_name'=i.name ,i.groupid ,'filegroup'=f.name ,'file_name'=d.physical_name ,'dataspace'=s.name from sys.sysindexes i ,sys.filegroups f ,sys.database_files d ,sys.data_spaces s where objectproperty(i.id,'IsUserTable') = 1 and f.data_space_id = i.groupid and f.data_space_id = d.data_space_id and f.data_space_id = s.data_space_id order by f.name,object_name(i.id),groupid go
Alanlarla İndex
select sys.objects.object_id, sys.objects.name as tablename, sys.indexes.name as indexname, sys.columns.name as columnname from sys.objects inner join sys.indexes on sys.objects.object_id = sys.indexes.object_id inner join sys.index_columns on sys.index_columns.object_id = sys.indexes.object_id and sys.index_columns.index_id = sys.indexes.index_id inner join sys.columns on sys.columns.object_id = sys.index_columns.object_id and sys.columns.column_id = sys.index_columns.column_id where sys.objects.type_desc = 'USER_TABLE' and sys.indexes.is_primary_key = 0 order by tablename, indexname, columnname
Tablo isimleri, satır sayıları ve kapladığı alanları listeleyen prosedür. Parametre almaz. :exec GetAllTableSizes
CREATE PROCEDURE GetAllTableSizes
AS
/*
Obtains spaced used data for ALL user tables in the database
*/
DECLARE @TableName VARCHAR(100) --For storing values in the cursor
--Cursor to get the name of all user tables from the sysobjects listing
DECLARE tableCursor CURSOR
FOR
select [name]
from dbo.sysobjects
where OBJECTPROPERTY(id, N'IsUserTable') = 1
FOR READ ONLY
--A procedure level temp table to store the results
CREATE TABLE #TempTable
(
tableName varchar(100),
numberofRows int,
reservedSize varchar(50),
dataSize varchar(50),
indexSize varchar(50),
unusedSize varchar(50)
)
--Open the cursor
OPEN tableCursor
--Get the first table name from the cursor
FETCH NEXT FROM tableCursor INTO @TableName
--Loop until the cursor was not able to fetch
WHILE (@@Fetch_Status >= 0)
BEGIN
--Dump the results of the sp_spaceused query to the temp table
INSERT #TempTable
EXEC sp_spaceused @TableName
--Get the next table name
FETCH NEXT FROM tableCursor INTO @TableName
END
--Get rid of the cursor
CLOSE tableCursor
DEALLOCATE tableCursor
--Select all records so we can use the reults
SELECT *
FROM #TempTable order by 2 desc
--Final cleanup!
DROP TABLE #TempTable
GO
Veri tabanı üzerinde obje bulma If-Else
--SP IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id(N'[dbo].[SP_YIL_AY_GUN_INSERT]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) BEGIN DROP PROCEDURE dbo.[SP_YIL_AY_GUN_INSERT] END --index IF EXISTS (SELECT name FROM sysindexes WHERE name = 'IDX_EBOrderNO') drop index [IDX_EBOrderNO] ON [dbo].[schBayer_OrderHeaders] go -- IF exists table IF EXISTS (SELECT * FROM sysobjects WHERE xtype = 'U' AND name = 'schBayer_Products') BEGIN DROP TABLE dbo.[schBayer_Products] END
Eğer veri tabanına sık sık erişiliyorsa AUTO_CLOSE OFF yapılmalı
exec sp_MsForEachDB ' ALTER DATABASE [?] SET AUTO_CLOSE OFF '
Prosedürlerin Okuma-Yazma Süreleri
SELECT TOP 10 ObjectName = OBJECT_NAME(qt.objectid) ,DiskReads = qs.total_physical_reads -- The worst reads, disk reads ,MemoryReads = qs.total_logical_reads --Logical Reads are memory reads ,Executions = qs.execution_count ,AvgDuration = qs.total_elapsed_time / qs.execution_count ,CPUTime = qs.total_worker_time ,DiskWaitAndCPUTime = qs.total_elapsed_time ,MemoryWrites = qs.max_logical_writes ,DateCached = qs.creation_time ,DatabaseName = DB_Name(qt.dbid) FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt WHERE qt.dbid = db_id() -- Filter by current database ORDER BY qs.total_elapsed_time DESC
En uzun süreyi alan sorgular listesini kontrol eder.
SELECT TOP 100
qs.total_elapsed_time / qs.execution_count / 1000000.0 AS average_seconds,
qs.total_elapsed_time / 1000000.0 AS total_seconds,
qs.execution_count,
SUBSTRING (qt.text,qs.statement_start_offset/2,
(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 individual_query,
o.name AS object_name,
DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
where qt.dbid = DB_ID()
ORDER BY average_seconds DESC;
-- Queries doing most I/O:
SELECT TOP 100
(total_logical_reads + total_logical_writes) / qs.execution_count AS average_IO,
(total_logical_reads + total_logical_writes) AS total_IO,
qs.execution_count AS execution_count,
SUBSTRING (qt.text,qs.statement_start_offset/2,
(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 indivudual_query,
o.name AS object_name,
DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
where qt.dbid = DB_ID()
ORDER BY average_IO DESC;
SQL - index fragmentation script - 30 dan yüksek parçalanmaya sahip indexleri listeler, bu indexlerin yeniden rebuild edilmesi gerekir.
SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName, ind.name AS IndexName, indexstats.index_type_desc AS IndexType, indexstats.avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats INNER JOIN sys.indexes ind ON ind.object_id = indexstats.object_id AND ind.index_id = indexstats.index_id WHERE indexstats.avg_fragmentation_in_percent > 30 ORDER BY indexstats.avg_fragmentation_in_percent DESC
Tablodan tekrar eden kayıtların temizlenmesi için kullanılabilecek sorgu
WITH cte AS (
SELECT
Id,
Field1,
Field2,
ROW_NUMBER() OVER (
PARTITION BY
Field1,
Field2
ORDER BY
Field1,
Field2
) row_num
FROM
Table_Name
)
DELETE FROM cte
WHERE row_num > 1;