Recent comments

None


İçerik Ara











Yasal Uyarı
Bu sitede sunulan tüm bilgi ve dökümanlar Turgay Sahtiyan tarafından yazılmaktadır. Yazıların kaynak göstermek şartıyla kullanılması serbesttir.

© Copyright 2009-2013
Takvim
<<  Ekim 2017  >>
PaSaÇaPeCuCuPa
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
Keywords

As you know,statistics are used for row estimation during query plan generation phase. So they are really important for performance. If the “Auto Create Statistics” database option is On, for every column on where clause or join, statistics are automatically created by database engine.

[more]

These auto created statistics can be unused in the following days. So, how can we find these unused statistics?

As you know, if auto update statistics database option on, statistics are automatically updated if %20+500 row changed threshold is reached and related statistics are used. So first rule for automatic update operation is %20+500 row changes threshold (this thresholds are tracked in sysindexes.rowmodctr column), and second rule is related statistics must be used to be update.

Below script searches all statistics and find number of changes and last update time for all statistics. If the number of changes are higher than threshold but statistic is not updated, that means this statistic is not used since last update time.

use AdventureWorks2008
GO
select TableName, StatsName, auto_created, UpdatedRowCount, TableRowCount
      , case TableRowCount when 0 then 0 else UpdatedRowCount*1./TableRowCount end as UpdatedPercentage
      , StatsLastUpdatedTime 
from(
select OBJECT_NAME(id) as TableName
      ,s.name as StatsName
      ,s.auto_created
      ,rowmodctr as UpdatedRowCount
      ,(select SUM(row_count) from sys.dm_db_partition_stats where object_id=i.id and (index_id=0 or index_id=1)) as TableRowCount
      ,STATS_DATE(i.id,i.indid) as StatsLastUpdatedTime
from sysindexes i
left join sys.stats s on s.object_id=i.id and s.stats_id=i.indid
)xx
order by (case TableRowCount when 0 then 0 else UpdatedRowCount*1./TableRowCount end) desc

Sample result;

image

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2012 ile beraber gelen güvenlik yeniliklerinden biri de windows group’lar için default schema atayabilme özelliğidir. Bugünkü makalemde bu konu üzerine konuşuyor olacağız.

[more]

SQL Server 2012’den önceki sürümlerde herhangi bir windows ya da domain group SQL Server üzerinde yetkilendirilirken default schema ataması yapılamıyordu. Dolayısıyla bu group’un içerisinde bulunan bir kullanıcı eğer dbo yetkisinde değil ise oluşturduğu objelerin scheması kendi adını alıyordu. Bu da yönetilebilirliği azaltan bir durumdu.

SQL Server 2012 ile beraber artık windows group’lara default schema atayabilmekteyiz. Dolayısıyla artık aynı grup vasıtasıyla yetkilendirilen 100’lerce login kendi schema’larını değil default schema olarak atanan schema’yı kullanabilecekler.

Şimdi bu dediklerimizi ufak bir örnek yaparak pekiştirelim. Örnekleri hem 2008 hem 2012 instance’ımda yapacağım ve aralarındaki farkı göstermeye çalışacağım.

İlk olarak aşağıdaki TSQL komutları vasıtasıyla WinGroup1 adındaki windows login’i için yeni bir login create ediyoruz ve daha sonra da bu login için deneme1 veritabanında yeni bir user create ediyoruz.

USE [master]
GO
CREATE LOGIN [TURGAYS03\WinGroup1] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
GO
USE [deneme1]
GO
CREATE USER [TURGAYS03\WinGroup1] FOR LOGIN [TURGAYS03\WinGroup1]
GO

Farklılık bu noktadan sonra başlamakta. Aşağıdaki script ile WinGroup1 user’ına default schema ataması yapmak istiyorum. SQL Server 2012’de çalışan bu kod, SQL Server 2008’de bu özellik desteklenmediği için hata almakta.

USE [deneme1]
GO
CREATE SCHEMA [WinGroup1] AUTHORIZATION [TURGAYS03\WinGroup1]
GO
USE [deneme1]
GO
ALTER USER [TURGAYS03\WinGroup1] WITH DEFAULT_SCHEMA=[WinGroup1]
GO

SQL Server 2008’de alınan hata aşağıdaki gibi.

Msg 15259, Level 16, State 2, Line 1
The DEFAULT_SCHEMA clause cannot be used with a Windows group or with principals mapped to certificates or asymmetric keys.

Aynı işlemi SSMS üzerinden yaparsak ;

image

Default schema atama işlemini SQL Server 2008’de yapamadığımızı gördük. Peki bu durum tam olarak ne gibi bir sıkıntı oluşturmakta.

Aynı user’a table create etme hakkı verip daha sonra bu grubun içerisinde olan bir user ile SSMS’I açıp tablo create ediyoruz.

use [deneme1]
GO
GRANT CREATE TABLE TO [TURGAYS03\WinGroup1]
GO

--Aşağıdaki işlem WinGroup1 windows grubunun içinde bulunan
--WinUser1 kullanıcı ile SSMS açılıp yapılmıştır.
use [deneme1]
GO
create table denemetbl(a int)

Bu işlemi SQL Server 2012’de yaptığımızda gruba hangi schemayı default olarak atadıysak yeni create ettiğimiz table’ın scheması’da bu schema oluyor.

Fakat aynı işlemi SQL Server 2008’de yaptığımızda, default schema ataması yapamadığımızdan dolayı yeni create edilen user’ın schema’sı kullanıcı adı (WinUser1) olmakta.

Grubun içinde 100’lerce kullanıcı olduğunu düşünün. Bu durumda her kullanıcı için ayrı schema oluşturulacağı için yönetilebilirlik oldukça azalacaktır. Ayrıca kullanıcının silinmesi gerekliliğinde de schema değişiklikleri yapılması gerekmekte ki bu durum çoğu durumda oldukça sıkıntı çıkarmakta.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan