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
<<  Aralık 2017  >>
PaSaÇaPeCuCuPa
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
Keywords

Bugün SQL Server 2008 R2 Service Pack 1 CTP olarak yayınlandı.

Aşağıda detaylara ve download linklerine erişebilirsiniz.

[more]

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=bd200f8e-ba8a-45e3-af59-e28a9e2d17df

Express Edition - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e70a4b51-53be-48d3-8030-80dc9e755be3

Feature Pack - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=15dcfec2-abb8-409d-91ff-c7c8e18c8409

 

Microsoft® SQL Server® 2008 R2 Service Pack 1 Community Technology Preview

 
Brief Description

Download Service Pack 1 for Microsoft® SQL Server® 2008 R2

Overview

SQL Server 2008 R2 Service Pack 1(SP1) Customer Technology Preview (CTP) is now available for download. SQL Server 2008 R2 service packs are cumulative updates and upgrade all service levels of SQL Server 2008 R2 to SP1 CTP. This service pack contains the cumulative updates up to SQL Server 2008 R2 SP1 cumulative update packages 6. You can use these packages to upgrade any of the following SQL Server 2008 R2 editions:

(1) SQL Server 2008 R2 Parallel Computing Edition
(2) SQL Server 2008 R2 Datacenter Edition
(3) SQL Server 2008 R2 Enterprise Edition and Developer Edition
(4) SQL Server 2008 R2 Standard Edition
(5) SQL Server 2008 R2 Web Edition
(6) SQL Server 2008 R2 Workgroup Edition
(7) SQL Server 2008 R2 Express Edition

Note : These packages are available for testing purposes only in a non-production environment. To upgrade SQL Server 2008 R2 Express Edition, obtain the SP1 version of Express Edition or Express Edition with Advanced Services.
What’s New in SQL Server 2008 R2 Service Pack 1

· Dynamic Management Views for increased supportability:

sys.dm_exec_query_stats DMV is extended with additional columns to improve supportabilities over troubleshooting long-running queries. New DMVs and XEvents on select performance counters are introduced to monitor OS configurations and resource conditions related to the SQL Server instance.

· ForceSeek for improved querying performance :

Syntax for FORCESEEK index hint has been modified to take optional parameters allowing it to control the access method on the index even further. Using old style syntax for FORCESEEK remains unmodified and works as before. In addition to that, a new query hint, FORCESCAN has been added. It complements the FORCESEEK hint allowing specifying ‘scan’ as the access method to the index. No changes to applications are necessary if you do not plan to use this new functionality.

· Data-tier Application Component Framework (DAC Fx) for improved database upgrades:

The new Data-tier Application (DAC) Framework v1.1 and DAC upgrade wizard enable the new in-place upgrade service for database schema management. The new in-place upgrade service will upgrade the schema for an existing database in SQL Azure and the versions of SQL Server supported by DAC. A DAC is an entity that contains all of the database objects and instance objects used by an application. A DAC provides a single unit for authoring, deploying, and managing the data-tier objects. For more information, see Designing and Implementing Data-tier Applications.

· Disk space control for PowerPivot:

This update introduces two new configuration settings that let you determine how long cached data stays in the system. In the new Disk Cache section on the PowerPivot configuration page, you can specify how long an inactive database remains in memory before it is unloaded. You can also limit how long a cached file is kept on disk before it is deleted.

For a detailed list of new features and improvements that are included in SQL Server 2008 R2 SP1, review the What's New Section in Release Notes.
Please note: This Customer Technical Preview (CTP) release is not supported by Microsoft Customer Support Services. Please submit feedback using the Microsoft SQL Server Connect Feedback Center. In addition, some of the fixes documented in this CTP release may not be included in the final release. There may also be fixes included in this CTP release that are not documented in the master KB article.

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


Memory kullanımı SQL Server açısından monitor edilmesi gereken ilk noktalardan biridir. DBCC MEMORYSTATUS komutu ile anlık olarak memory durumunun bir görüntüsünü alıp memory kullanımını kontrol edebiliriz.

Aşağıdaki KB Article’da DBCC MEMORYSTATUS’un nasıl kullanılabileceği detaylı olarak anlatılmakta.

İncelemenizi tavsiye ederim.

http://support.microsoft.com/kb/907877/en-us

 

İyi Çalışmalar

Turgay Sahtiyan

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’da master,model ve tempdb database’lerinin owner’ı değiştirilmeye çalışılırsa aşağıdaki gibi bir hata alınabilir.

[more]

image

Cannot change the owner of the master, model, tempdb or distribution database.
(Microsoft SQL Server, Error: 15109)

master,model ve tempdb database’lerinin owner’ları SSMS’ten ya da aşağıdaki T-SQL kodu ile değiştirilemez.

use model
EXEC dbo.sp_changedbowner @loginame = N'sa'

 

Bu değişikliği yapmak için detach-attach ya da backup-restore yöntemlerinin kullanılması gerekir.

System Database’lerin de detach-attach ve backup-restore yöntemlerinin nasıl kullanıldığı ile alakalı aşağıdaki makalelerimi okumanızı tavsiye ederim.

SQL Server da Master DB Database File larını Taşımak

SQL Server – master database backup – restore

SQL Server 2008 – Model ve MSDB Database lerinin Taşınması

SQL Server da TempDB Database File larını Taşımak

 

İyi Çalışmalar

Turgay Sahtiyan

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


Geçenlerde bir cluster ortamımıza SP2 upgrade geçerken karşımıza çıkan hata mesajından sonra tüm system database’lerinin owner’larını sa yapmaya karar verdik. Bu makalede üzerinde duracağımız sorgu ile owner’ı sa olmayan system database’lerini nasıl sorgulayabileceğimizi göreceğiz.

[more]

SP2 upgrade’in de karşımıza çıkan hata şu şekilde idi;

The database owner SID recorded in the master database differs from the database owner SID recorded in database 'msdb'. You should correct this situation by resetting the owner of database 'msdb' using the ALTER AUTHORIZATION statement.'

Hatanın sebebi master DB’si ile msdb DB’sinin owner’larının aynı olmaması. Bunun da nedeni daha önce msdb’i backup restore yapmış olmamız. Servisi single user modda açtıktan sonra msdb’nin owner’ı değiştirdik ve hatadan kurtulduk.

Bu hata ile karşılaştıktan sonra bütün ortamlarımızda owner’ı sa olmayan system database’lerini sorgulamaya karar verdik.

Aşağıdaki script’i SQL Server 2008 Registered Server üzerinden bütün SQL Server’larımızda uygulayarak çok kısa sürede sorgu sonucunu alabildik.

select dbid,name,sid,SUSER_SNAME(sid)
from sysdatabases d
where SUSER_SNAME(sid)<>'sa'
	and d.dbid<=4

 

Belki bir gün sizin de böyle bir şeye ihtiyacınız olur.

 

İyi çalışmalar

Turgay Sahtiyan

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’da sistemin nasıl çalıştığını kontrol etmek için bakacağımız belkide ilk yer SQL Server Error Log’larıdır. SQL Server ve Agent Error Log’ları sayesinde sistemde herhangi bir ciddi problem olup olmadığını kontrol etmemiz mümkündür.

Bugünkü yazımda SQL Server Error Log’ların sayısının nasıl arttırılacağını, yeni bir error log dosyasının nasıl create edilebileceğini, kısacası SQL Server’da Error Log’lar ile çalışırken hangi best practice’leri uygulamamız gerektiğinden bahsedeceğim.

[more]

Bu makalemde şu ana başlıklar üzerinde duracağız.

  • SQL Server’da Error Log’lar ile Çalışmak
  • Database Engine Error Log’ları
    • Database Engine Error Log’ları Hakkında Genel Bilgilendirme
    • Database Engine Error Log Recycle’ı Elle Tetiklemek (master.sys.sp_cycle_errorlog)
    • Database Engine Error Log’larının Sayısını Arttırmak
    • Database Engine Error Log’ları Okumak İçin Özelleştirilmiş Log Arama SP’si
    • Başarılı Backup İşlemi Log’larının Error Log’a Yazılmasını Engellemek
  • SQL Server Agent Error Log’ları
    • SQL Server Agent Error Log’ları Hakkında Genel Bilgilendirme
    • SQL Server Egent Error Log Recycle’ı Elle Tetiklemek (msdb.sys.sp_cycle_agent_errorlog)
  • Error Log Recycle İşlemini SQL Job ile Tetiklemek

SQL Server ve Agent Error Log’lar eğer değişiklik yapılmadıysa şu tarz bir folder’da bulunur.

C:\Program Files\Microsoft SQL Server\MSSQL10.S10ENT\MSSQL\Log

Bu folder’da bulunan ERRORLOG isimli dosyalar Database Engine’in Error Log’ları, SQLAGENT şeklinde başlayan dosyalar ise SQL Server Agent’ın Error Log’larıdır.

Database Engine Error Log’ları

SQL Server Database Engine için default olarak 1 adet aktif (ERRORLOG) ve 6 adet arşiv (ERRORLOG.1’den ERRORLOG.6’ya kadar olan dosyalar) olmak üzere 7 adet error log dosyası bulunmaktadır. Her SQL Server servisi restart olduğunda aktif olan log ERRORLOG.1 haline dönüşür ve ondan sonraki error log’lar da bir sıra kayar. Ve sondaki error log’da silinir. (Bu işleme recycle denilmektedir.)

Recycle işlemini şu şekilde gösterebiliriz.

el1

Recycle işleminin servis restart’ı ile olduğunu söylemiştik. Bu işlemi elle tetiklemekte mümkündür. Bir sonraki bölümde bu işlemin nasıl yapılabileceğine değiniyor olacağım.

Database Engine Error Log Recycle’ı Elle Tetiklemek (master.sys.sp_cycle_errorlog)

SQL Server Database Engine servisi restart olduğunda yeni bir error log dosyası oluşur ve en sondaki error log dosyası silinir demiştik. Bu işleme de Recycle dendiğini belirtmiştik. Detayları bir önceki bölümde inceleyebilirsiniz.

SQL Server servisinin uzun süre ayakta olduğu ya da bir hatadan dolayı çok fazla error basıldığı durumda aktif ErrorLog dosyası şişmeye başlar ve büyük bir boyuta erişir. Böyle bir durumda bu errorlog dosyasının içeriğine bakmak oldukça güç hale gelir.

İşte böyle bir durumda 0’dan yeni bir error log dosyası oluşturmak için servisi restart etmektense recycle işlemini elle tetiklememiz mümkündür.

Aşağıdaki SP execute edildiğinde aktif olan errorlog dosyası ERRORLOG.1 haline dönüşecek ve yeni bir error log dosyası 0’dan oluşturulacaktır.

EXEC master.sys.sp_cycle_errorlog;

 

Database Engine Error Log’larının Sayısını Arttırmak

Bir önceki bölümde anlattığım gibi servis restart olduğunda ya da recycle işlemi elle tetiklendiği zaman yeni bir error log dosyası oluşturulur ve en sondaki error log dosyasıda silinir. Yani default olarak 1 aktif 6 da arşiv olmak üzere 7 error log dosyasına izin verilir.

Error Log’lar sistemi analiz etmek için etkin yöntemlerden biri olduğu için eski error log dosyalarının hemen silinmesini istemeyebiliriz. Bu durumda saklanacak error log dosyası parametresini değiştirmemiz gerekir.

Bu değişikliği Management Studio üzerinden şu şekilde yapabiliriz.

  1. Management >> SQL Server Logs yazısına sağ tıklayıp configure ekranını açıyoruz. 

    el2
  2. Gelen ekranda kaç adet error log’un arşiv olarak saklanmasını istediğimizi belirtip OK’e basıyoruz. 

    el3

Database Engine Error Log’ları Okumak İçin Özelleştirilmiş Log Arama SP’si

SQL Server Log’larını okurken filter özelliği kullanabilmekteyiz. Ama bu filter özelliği sadece “like” yani “içinde geçen” şeklinde çalışmaktadır. Ve ne yazık ki “not like” yani “içinde geçmeyen” şeklinde bir filter verememekteyiz. Peki ne zaman ihtiyacımız olur not like aramasına. Örneğin başarılı backup işlemleri loglandığında ve çok sık aralıklarla TLog backup’ı aldığımızda log dosyası çok fazla sayıda backup bilgisi ile dolmaktadır. Ve biz bu backup loglarını exclude ederek raporu görüntülemek isteyebiliriz.

İşte bu amaçla yazmış olduğum SP’yi anlattığım makaleme buradan erişebilirsiniz.

Başarılı Backup İşlemi Log’larının Error Log’a Yazılmasını Engellemek

SQL Server da başarılı olan her backup işlemi bildiğiniz gibi SQL Server Log’a yazılmaktadır. TLog backup kullanımınız var ise ve çok sıklıkla backup alıyorsanız SQL Server Log a çok fazla sayıda kayıt yazılacaktır ve bu da log’un okunmasını zorlaştıracaktır. Şu linkten erişebileceğiniz makalemde başarılı backup işlemlerinin SQL Server Log’a yazılmasını nasıl engelleyeceğimizi görebilirsiniz.

SQL Server Agent Error Log’ları

SQL Server Agent Error Log’ları da Database Engine Error Log’ların da olduğu gibi servis restart olduğunda recycle olur. Tabi burada bahsettiğimiz servis database engine servisi değil SQL Server Agent servisidir.

Bir diğer farklılık ise Database Engine log’ları default olarak 1+6 log file’dan oluşmakta ve bu rakamda değişiklik yapılabilmekteyken SQL Agent Error Log’ları 1+9 log file’dan oluşmakta ve bu rakamlarda değişiklik yapılamamaktadır. Aktif olan SQL Agent Error Log’un dosya adı SQLAGENT.OUT, arşiv olan log file’ların adları ise SQLAGENT.x şeklindedir.

SQL Server Agent Error Log Recycle’ı Elle Tetiklemek (master.sys.sp_cycle_agent_errorlog)

SQL Server Agent Error Log recycle işlemini hem SSMS’ten hem de TSQL ile yapmamız mümkündür.

Management Studio’dan recycle işlemini yapmak için SQL Server Agent >> Error Logs yazısına sağ tıklayıp açılan ekrandan Recycle yazısını tıklamamız gerekir.

el4

Aynı işlemi TSQL ile şu şekilde yapabiliriz.

EXEC msdb.dbo.sp_cycle_agent_errorlog;

 

Error Log Recycle İşlemini SQL Job ile Tetiklemek

Error Log’ları servisler restart olduğunda recycle olur aynı zamanda elle tetiklememizde mümkündür diye belirtmiştik.

Şimdi bu işlemi otomatize etmek için bir SQL Server Job hazırlayacağız ve her ayın başında çalışan bu job vasıtasıyla hem database engine hem SQL Server Agent log’larını otomatik olarak recycle edeceğiz.

Bu şekilde otomatik olarak error log’ların boyutlarını kontrol altında tutmuş olacağız.

Bahsi geçen Job’ın script’ine aşağıda erişebilirsiniz.

USE [msdb]
GO
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'Error Log Recycle', 
		@enabled=1, 
		@notify_level_eventlog=0, 
		@notify_level_email=0, 
		@notify_level_netsend=0, 
		@notify_level_page=0, 
		@delete_level=0, 
		@description=N'No description available.', 
		@category_name=N'Database Maintenance', 
		@owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Database Engine Log Recycle', 
		@step_id=1, 
		@cmdexec_success_code=0, 
		@on_success_action=3, 
		@on_success_step_id=0, 
		@on_fail_action=2, 
		@on_fail_step_id=0, 
		@retry_attempts=0, 
		@retry_interval=0, 
		@os_run_priority=0, @subsystem=N'TSQL', 
		@command=N'EXEC master.sys.sp_cycle_errorlog;', 
		@database_name=N'master', 
		@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'SQL Server Agent Log Recycle', 
		@step_id=2, 
		@cmdexec_success_code=0, 
		@on_success_action=1, 
		@on_success_step_id=0, 
		@on_fail_action=2, 
		@on_fail_step_id=0, 
		@retry_attempts=0, 
		@retry_interval=0, 
		@os_run_priority=0, @subsystem=N'TSQL', 
		@command=N'EXEC msdb.dbo.sp_cycle_agent_errorlog;', 
		@database_name=N'msdb', 
		@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Every Month', 
		@enabled=1, 
		@freq_type=16, 
		@freq_interval=1, 
		@freq_subday_type=1, 
		@freq_subday_interval=0, 
		@freq_relative_interval=0, 
		@freq_recurrence_factor=1, 
		@active_start_date=20110419, 
		@active_end_date=99991231, 
		@active_start_time=0, 
		@active_end_time=235959, 
		@schedule_uid=N'f631ead7-612f-4536-bd65-15aa1f75179a'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

GO

 

SQL Server’da sistemin nasıl çalıştığını kontrol etmek için Error Log’ların analizi oldukça fazla kullanılan yöntemlerden biridir. Bu yüzden best practice’lere göre ayarlanmış SQL Server ve Agent Error Log kullanımı ileride oluşabilecek sıkıntıların önüne geçmek için çok önemlidir.

 

İyi Çalışmalar

Turgay Sahtiyan

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


30 Mart 2011 tarihinde bloğumda da yayınladığım SQL Server’da Index Kavramı başlıklı makalem Microsoft Türkiye Technet bülteninin mart sayısında yayınlandı.

image

Url : http://www.microsoft.com/turkiye/technet/ebulten.mspx

Doküman Url : www.microsoft.com.tr/sqlserver/SQLServerdaIndexKavrami.docx

 

Benim için güzel bir haber olan bu durumu sizinle de paylaşmak istedim.

 

İyi çalışmalar

Turgay Sahtiyan

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 veya SP kurulumu esnasında gerçekleştirilen System Check esnasında eğer server restart pending statusunde ise bu check işlemi “Restart Computer” adımından geçemeyecek ve kuruluma devem etmemizi engelleyecektir.

[more]

Böyle bir durumda tabiki önerilen yöntem server’ı restart etmektir.

Ama server’ı restart etmeden bu mesajdan nasıl kurtulurum diye öğrenmek istiyorsanız yapmanız gereken işlem çok basit.

Register HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\ folder’ında bulunan PendingFileRenameOperations key’ini sildiğinizde bu mesajdan kurtulabilirsiniz.

 

İyi Çalışmalar

Turgay Sahtiyan

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


12 Nisan Salı günü yapmış olduğum webcast’te kullandığım powerpoint dosyasını ve scriptleri sizinle paylaşmak istiyorum.

İlerleyen günlerde webcast’i video formatında da paylaşıyor olacağım.

[more]

PowerPoint Dosyası

http://www.turgaysahtiyan.com/file.axd?file=2011%2f01%2fSQLServerdaIndexKavrami.pptx

Sunumda Kullanılan Scriptler

--table scan-index kullanımı arasındaki farkın 
--diskten yapılan okuma açısından değerlendirilmesi
drop table tblIndexDeneme1
GO
create table tblIndexDeneme1 (ID int, Ad varchar(20), SoyAd varchar(20), Telefon varchar(10))
GO
declare @i int=1
while @i<100000
begin
  insert tblIndexDeneme1
    select @i,'Turgay'+cast(@i as varchar(10)),'Sahtiyan' + cast(@i as varchar(10)),'555 55 55'
  set @i=@i+1
end
GO

--Table scan yaparak kayıt sorgulama-Query Plan
select * from tblIndexDeneme1 where ID=55000
--Table scan yaparak kayıt sorgulama-IO Consume
SET STATISTICS IO ON
SET STATISTICS TIME ON
GO
select * from tblIndexDeneme1 where ID=55000
--ID kolonu üzerine clustered index
create clustered index IX_1 on tblIndexDeneme1 ( ID )
GO
--clustered index kullanılarak kayıt sorgulama-IO Consume
SET STATISTICS IO ON
SET STATISTICS TIME ON
GO
select * from tblIndexDeneme1 where ID=55000
--230 kat daha az kayıt okundu.

SET STATISTICS IO OFF
SET STATISTICS TIME OFF

-----------------------------------------------------------------
------------- Index Page'leri Görüntüleme -----------------------
-----------------------------------------------------------------
--
select * from tblIndexDeneme1 where ID=55000

DBCC IND('AdventureWorks2008','tblIndexDeneme1',1)

DBCC TRACEON (3604);
DBCC PAGE('AdventureWorks2008',1,43218,3)


-----------------------------------------------------------------
-------------Index Page'lere ilk Bakış---------------------------
-----------------------------------------------------------------
--Clustered Index NonLeaf Level Page Örneği
DBCC IND('AdventureWorks2008','tblIndexDeneme1',1)

DBCC TRACEON (3604);
DBCC PAGE('AdventureWorks2008',1,24080,3)

--NonClustered Index NonLeaf Level Page Örneği
--İlk olarak Ad kolonu üzerinde bir NonClustered Index tanımlaması yapalım.
--Soyad kolonunuda included olarak belirleyelim.
create nonclustered index IX_2 on tblIndexDeneme1 ( Ad ) INCLUDE(Soyad)
GO

select * from sys.indexes where object_name(object_id)='tblIndexDeneme1'

DBCC IND('AdventureWorks2008','tblIndexDeneme1',3)

DBCC TRACEON (3604);
DBCC PAGE('AdventureWorks2008',1,3835,3)

--NonClustered Index Leaf Level Page Örneği
DBCC TRACEON (3604);
DBCC PAGE('AdventureWorks2008',1,40603,3)


select * from tblIndexDeneme1 where ID=35000
DBCC IND('AdventureWorks2008','tblIndexDeneme1',1)

DBCC PAGE('AdventureWorks2008',1,3488,3)


------------------------------------------------------
-------Örneklerle Index Page’lerin İncelenmesi--------
------------------------------------------------------

----------------------------------------
--Clustered Index’te Page’lerin Yapısı--
----------------------------------------

--Unique Clustered Index
drop table tblIndexDeneme2
GO
create table tblIndexDeneme2 (ID int, Ad varchar(20), SoyAd varchar(20), Telefon varchar(10))
GO
declare @i int=1
while @i<10000
begin
  insert tblIndexDeneme2
    select @i,'Turgay'+cast(@i as varchar(10)),'Sahtiyan' + cast(@i as varchar(10)),'555 55 55'
  set @i=@i+1
end
GO
create unique clustered index IX_1 on tblIndexDeneme2 ( ID )
GO

DBCC IND('AdventureWorks2008','tblIndexDeneme2',1)

DBCC TRACEON (3604);
DBCC PAGE('AdventureWorks2008',1,23297,3)

--Unique Olmayan Clustered Index
drop table tblIndexDeneme2
GO
create table tblIndexDeneme2 (ID int, Ad varchar(20), SoyAd varchar(20), Telefon varchar(10))
GO
declare @i int=1
while @i<10000
begin
  insert tblIndexDeneme2
    select cast(@i/10 as int),'Turgay'+cast(@i as varchar(10)),'Sahtiyan' + cast(@i as varchar(10)),'555 55 55'
  set @i=@i+1
end
GO
create clustered index IX_1 on tblIndexDeneme2 ( ID )
GO

DBCC IND('AdventureWorks2008','tblIndexDeneme2',1)

DBCC TRACEON (3604);
DBCC PAGE('AdventureWorks2008',1,23305,3)


-------------------------------------------
--NonClustered Index’te Page’lerin Yapısı--
-------------------------------------------

--Heap Tablo + Unique NonClustered Index
drop table tblIndexDeneme2
GO
create table tblIndexDeneme2 (ID int, Ad varchar(20), SoyAd varchar(20), Telefon varchar(10))
GO
declare @i int=1
while @i<10000
begin
  insert tblIndexDeneme2
    select cast(@i/10 as int),'Turgay'+cast(@i as varchar(10)),'Sahtiyan' + cast(@i as varchar(10)),'555 55 55'
  set @i=@i+1
end
GO
create unique nonclustered index IX_2 on tblIndexDeneme2 ( Ad )
GO

DBCC IND('AdventureWorks2008','tblIndexDeneme2',2)

DBCC TRACEON (3604);
DBCC PAGE('AdventureWorks2008',1,52896,3)

--Unique Clustered Index + Unique NonClustered Index
drop table tblIndexDeneme2
GO
create table tblIndexDeneme2 (ID int, Ad varchar(20), SoyAd varchar(20), Telefon varchar(10))
GO
declare @i int=1
while @i<10000
begin
  insert tblIndexDeneme2
    select @i,'Turgay'+cast(@i as varchar(10)),'Sahtiyan' + cast(@i as varchar(10)),'555 55 55'
  set @i=@i+1
end
GO
create unique clustered index IX_1 on tblIndexDeneme2 ( ID )
GO
create unique nonclustered index IX_2 on tblIndexDeneme2 ( Ad )
GO

DBCC IND('AdventureWorks2008','tblIndexDeneme2',2)

DBCC TRACEON (3604);
DBCC PAGE('AdventureWorks2008',1,23069,3)

--Unique Olmayan Clustered Index + Unique NonClustered Index
drop table tblIndexDeneme2
GO
create table tblIndexDeneme2 (ID int, Ad varchar(20), SoyAd varchar(20), Telefon varchar(10))
GO
declare @i int=1
while @i<10000
begin
  insert tblIndexDeneme2
    select cast(@i/10 as int),'Turgay'+cast(@i as varchar(10)),'Sahtiyan' + cast(@i as varchar(10)),'555 55 55'
  set @i=@i+1
end
GO
create clustered index IX_1 on tblIndexDeneme2 ( ID )
GO
create unique nonclustered index IX_2 on tblIndexDeneme2 ( Ad )
GO

DBCC IND('AdventureWorks2008','tblIndexDeneme2',2)

DBCC TRACEON (3604);
DBCC PAGE('AdventureWorks2008',1,23177,3)

--Unique Olmayan Clustered Index + Unique Olmayan NonClustered Index
drop table tblIndexDeneme2
GO
create table tblIndexDeneme2 (ID int, Ad varchar(20), SoyAd varchar(20), Telefon varchar(10))
GO
declare @i int=1
while @i<10000
begin
  insert tblIndexDeneme2
    select cast(@i/10 as int),'Turgay'+cast(@i as varchar(10)),'Sahtiyan' + cast(@i as varchar(10)),'555 55 55'
  set @i=@i+1
end
GO
create clustered index IX_1 on tblIndexDeneme2 ( ID )
GO
create nonclustered index IX_2 on tblIndexDeneme2 ( Ad )
GO

DBCC IND('AdventureWorks2008','tblIndexDeneme2',2)

DBCC TRACEON (3604);
DBCC PAGE('AdventureWorks2008',1,23537,3)


------------------------------------------------------
----NonClustered Index’te Included Kolon Kullanımı----
------------------------------------------------------

--AdventureWorks Person.Address tablosunun kayıt sayısını arttırmak.
declare @i int=1
while @i<5 begin
  insert Person.Address (AddressLine1, AddressLine2,City,StateProvinceID,PostalCode)
    select AddressLine1 + CHAR(@i), isnull(AddressLine2,'') + CHAR(@i)
		,City,StateProvinceID,PostalCode
    from Person.Address
  set @i=@i+1
end
create nonclustered index IX_City on Person.Address
	(City)

--Çekmek istediğimiz sorgu. Query Plan'a bakalım.
--City üzerinde NonClustered Index tanımlı
select AddressLine1, PostalCode
from Person.Address
where City='Bothell'

--Hızlandırmak için 1.seçenek 
--City, AddressLine1, PostalCode üzerine composite index tanımlamak
create nonclustered index IX_1 on Person.Address
	(City,AddressLine1,PostalCode) 

--Index tanımladıktan sonra Query Plan'a tekrar bakalım.
select AddressLine1, PostalCode
from Person.Address
where City='Bothell'

--Bu composite index'in boyutu
--25.210 MB
select b.name,b.index_id,SUM(a.reserved_page_count)*8/1024. as Size_MB
from sys.dm_db_partition_stats a inner join sys.indexes b
on a.object_id=b.object_id and a.index_id=b.index_id
where OBJECT_ID('Person.Address')=a.object_id
	and b.name = 'IX_1'
group by b.name,b.index_id	

--Şimdi composite index yerine included index oluşturalım.
drop index IX_1 on Person.Address
GO
create nonclustered index IX_1 on Person.Address
	(City) INCLUDE (AddressLine1,PostalCode)

--Query Plan
select AddressLine1, PostalCode
from Person.Address
where City='Bothell'

--Bu composite index'in boyutu
--25.02 MB
select b.name,b.index_id,SUM(a.reserved_page_count)*8/1024. as Size_MB
from sys.dm_db_partition_stats a inner join sys.indexes b
on a.object_id=b.object_id and a.index_id=b.index_id
where OBJECT_ID('Person.Address')=a.object_id
	and b.name = 'IX_1'
group by b.name,b.index_id	

--Aradaki boyut farkının sebebi included kolonların 
--non-leaf page'lerde bulunmamasıdır.


DBCC IND('AdventureWorks2008','person.address',7)

DBCC TRACEON (3604);
DBCC PAGE('AdventureWorks2008',1,44133,3)

 

İyi Çalışmalar

Turgay Sahtiyan

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