Bom pessoal,
Vamos falar nesse artigo sobre como criar índice não clusterizado e aplicá-lo somente nas linhas onde o valor não for nulo.
Essa é uma questão cobrada no exame de certificação e é um ponto que não podemos perder.
O enunciado nos pede para criar um índice na coluna SalesOrderID, APENAS para os casos onde as linhas da coluna SpecialOfferID contenham valor. Segue…
You administer Microsoft SQL Server 2012 database.
You use an OrderDetail table that has the following definition:
You need to create a non-clustered index on the SalesOrderID column in the OrderDetail
table to include only rows that contain a value in the SpecialOfferID column.
Which four Transact-SQL statements should you use?
Use GuiaDBA; Go If Object_Id('OrderDatail')is not null Drop Table OrderDatail Go Create Table OrderDatail ( SalesOrderId int not null, SalesOrderDetailId int identity(1,1) not null, CarrierTrackingNumber nvarchar(25) null, OrderQty smallint not null, ProductId int not null, SpecialOfferId int null, UnitPrice money not null ); Go Select * From OrderDatail
Vou inserir meia duzia de registros somente para simulação do caso.
Insert into OrderDatail (SalesOrderId,CarrierTrackingNumber,OrderQty,ProductId,SpecialOfferId,UnitPrice) values(1,'001-22334-111',10,1,Null,1000); Insert into OrderDatail (SalesOrderId,CarrierTrackingNumber,OrderQty,ProductId,SpecialOfferId,UnitPrice) values(1,'111-54953-344',5,2,1,740); Insert into OrderDatail (SalesOrderId,CarrierTrackingNumber,OrderQty,ProductId,SpecialOfferId,UnitPrice) values(1,'001-59683-222',1,1,Null,800); Insert into OrderDatail (SalesOrderId,CarrierTrackingNumber,OrderQty,ProductId,SpecialOfferId,UnitPrice) values(1,'001-22340-321',4,3,1,1000); Insert into OrderDatail (SalesOrderId,CarrierTrackingNumber,OrderQty,ProductId,SpecialOfferId,UnitPrice) values(1,'001-00959-233',3,4,2,950); Insert into OrderDatail (SalesOrderId,CarrierTrackingNumber,OrderQty,ProductId,SpecialOfferId,UnitPrice) values(1,'001-05943-353',9,2,1,845); Select * From OrderDatail;
Agora vamos criar o índice. Por padrão as base de dados relacionais ignoram valores nulos. Sendo algo que não existe, não há motivo de ser considerado. Um índice não armazena valor nulo.
Se uma coluna aceita valores nulos, numa consulta campo nulo não tem por que ser ordenado. Então, o que interessa é o índice abranger as linhas com registros.
If Not exists(Select * From sys.indexes Where name ='idx_01' and object_id = object_id('OrderDatail')) Begin Create nonclustered index idx_01 On OrderDatail (SalesOrderID ) Where SpecialOfferId is not null; End; Go
O ideal é inserir uma massa de dados suficiente para que possamos ver o ganho na performance com a criação e a entrada do índice.
Isso veremos no meu próximo artigo. Até lá!