MSSQL Collate sotunu ve çözümü

Veritabanınızın collate ayarlarını değiştirmek isterseniz single moda geçmelisiniz.

ALTER DATABASE SAP SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE SAP COLLATE TURKISH_CI_AS
ALTER DATABASE SAP SET MULTI_USER

Cannot resolve the collation conflict between
“Turkish_CI_AS” and “SQL_Latin1_General_CP1_CI_AS” in the equal to operation.
Hatasını alıyorsanız sorgu sonuna COLLATE TURKISH_CI_AS eklemelisiniz.

SELECT A.*
FROM ALGU_SAP_CUSTOMERS  A,ALGU_SAP_ORDERHEAD B,ALGU_SAP_ORDERITEM C,ALGU_SAP_MATERIALS D
WHERE A.CUSTOMER = B.CUSTOMER AND B.DOCNUM = C.DOCNUM AND C.MATERIAL = D.MATERIAL
COLLATE TURKISH_CI_AS

SQL Sunucu – Ön Bellek Temizlenmesi

SQL sunucunuz çok yavaşladıysa ve işlemler bellek yetmezliğinden dolayı hatalar vermeye başladıysa SQL Server servisini yeniden başlatırsanız, tüm cache bilgisi otomatik olarak temizlenir. Ancak SQL Server servisini yeniden başlatmak mümkün değil ise  aşağıdaki komutlarla da cache temizlenebilir, tempdb shrink işlemi işe yaramadığında bu komutu kullanmıştım:

DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE

MS SQL REPLACE fonksiyonu

Replace fonksiyonu ile belirtilen karakterler yerine yeni karakterlerin konulması.

UPDATE [dbo].[Table1] 
SET UBARCODE=REPLACE(UBARCODE,'M','S'), PROJECT='90',QUANTITY=10,
KONTROL=0, BARCODE='C10101210003'
 WHERE UBARCODE IN
 ('0M3AAA00061',
 '0M3AAA00062',
 '0M3AAA00063',
 '0M3AAA00064',
 '0M3AAA00065')

MS SQL Server Veritabanı Bakım Planında Neler Olmalı?

Birkçok bakım planı sihirbaz kullanılarak görev olarak tanımlanabilmekte. Ancak 7/24 çalışan sitemlerde bu görevleri çalıştıracak boşluklar bulmak oldukça zor olabilmektedir. Zira bazı bakım işlemleri ya sistemin tüm kaynaklarını istemekte veya sistemin hiç kullanılmamasını istemektedir. Bu yüzden özelikle resmi tatillerde veritabanının kullanılmadığı zamanlarda bu bakımları yapmak sistemciler için önemlidir. Hangi sırada ve hangi bakımlar yapılmalıdır MS SQL sunucunuzda. Burada yazacaklarım tamamen veritabanının bakımı ile ilgili görevlerdir. Tabiki  sunucunun işletim sistemi ve donanım bakımları da yapılmalıdır.

1. Beckup Transaction Log: Logların yedeği alınmalı.

2. Beckup User Database: Bakım yapılacak kullanıcı veritabanları yedeklenmeli.

3. Check Database Integrity: Yedeği alınan veritabanlarının bütünkükleri kontrol edilmeli.

EXEC sp_msforeachdb 'DBCC CHECKDB(''?'')'

4. Shrink Database: Yedeği alınan veritabanları sıkıştırılmalı.

EXEC sp_MSForEachDB 'DBCC SHRINKDATABASE (''?'' , 0)'

5. Rebuild Index: Indexler yeniden yaratılmalı.

SET NOCOUNT ON
GO
--Set the fillfactor
DECLARE @FillFactor TINYINT
SELECT @FillFactor=80
DECLARE @StartTime DATETIME
SELECT @StartTime=GETDATE()
if object_id('tempdb..#TablesToRebuildIndex') is not null
begin
drop table #TablesToRebuildIndex
end
DECLARE @NumTables VARCHAR(20)
SELECT
s.[Name] AS SchemaName,
t.[name] AS TableName,
SUM(p.rows) AS RowsInTable
INTO #TablesToRebuildIndex
FROM
sys.schemas s
LEFT JOIN sys.tables t
ON s.schema_id = t.schema_id
LEFT JOIN sys.partitions p
ON t.object_id = p.object_id
LEFT JOIN sys.allocation_units a
ON p.partition_id = a.container_id
WHERE
p.index_id IN ( 0, 1 ) -- 0 heap table , 1 table with clustered index
AND p.rows IS NOT NULL
AND a.type = 1 -- row-data only , not LOB
GROUP BY
s.[Name],
t.[name]
SELECT @NumTables=@@ROWCOUNT
DECLARE RebuildIndex CURSOR FOR
SELECT
ROW_NUMBER() OVER (ORDER BY ttus.RowsInTable),
ttus.SchemaName,
ttus.TableName,
ttus.RowsInTable
FROM
#TablesToRebuildIndex AS ttus
ORDER BY
ttus.RowsInTable
OPEN RebuildIndex
DECLARE @TableNumber VARCHAR(20)
DECLARE @SchemaName NVARCHAR(128)
DECLARE @tableName NVARCHAR(128)
DECLARE @RowsInTable VARCHAR(20)
DECLARE @Statement NVARCHAR(300)
DECLARE @Status NVARCHAR(300)
FETCH NEXT FROM RebuildIndex INTO @TableNumber, @SchemaName, @tablename, @RowsInTable
WHILE ( @@FETCH_STATUS = 0 )
BEGIN
SET @Status='Table '+@TableNumber+' of '+@NumTables+': Rebuilding indexes on '+@SchemaName+'.'+@tablename + ' ('+@RowsInTable+' rows)'
RAISERROR (@Status, 0, 1) WITH NOWAIT --RAISERROR used to immediately output status
SET @Statement = 'ALTER INDEX ALL ON ['+@SchemaName+'].['+@tablename +'] REBUILD WITH (FILLFACTOR = '+CONVERT(VARCHAR(3), @FillFactor)+' )'
EXEC sp_executesql @Statement
FETCH NEXT FROM RebuildIndex INTO @TableNumber, @SchemaName, @tablename, @RowsInTable
END
CLOSE RebuildIndex
DEALLOCATE RebuildIndex
drop table #TablesToRebuildIndex
Print 'Total Elapsed Time: '+CONVERT(VARCHAR(100), DATEDIFF(minute, @StartTime, GETDATE()))+' minutes'
GO

6. Reorganize Index: Indexler yenilenmeli.

7. Update Statistics: Güncellenmeli.

8. Beckup System Database: Sistem veritabanları güncellenmeli.

9. History Cleanup: Temizlik.

USE msdb
GO
DECLARE @DaysToKeepHistory DATETIME
SET @DaysToKeepHistory = CONVERT(VARCHAR(10), DATEADD(dd, -30,GETDATE()), 101)
EXEC sp_delete_backuphistory @DaysToKeepHistory
GO

10. Mainteance Cleanup: Eski bakım ve yedeklerin temizlenmesi.