Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
1195
Assunto : SQL Server
Titulo: TextInRow pode ajudar na performance com campos Text

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



Os campos Text são armazenados em páginas separadas da tabela, enquanto que junto as linhas da tabela é inserido um ponteiro para tais páginas. Isso otimiza queries que não acessam o campo Text, mas exige um número maior de leituras para as queries que acessam.

A configuração TextInRow determina um limite de tamanho dentro do qual os campos text devem ser armazenados em linha, criando assim um balanceamento de performance entre as duas queries. Quando o conteúdo do campo for pequena, fica em linha, tornando a leitura mais rápida.

Porém existe uma característica a mais do TextInRow que poucos conhecem e que pode ajudar na otimização das leituras.

Vamos supor que você não quer que nada fique em linha. Ok! Poderia não usar o TextInRow. Porém, mesmo quando nada fica em linha, o TextInRow pode gerar uma otimização de leituras.

Por exemplo, digamos que você aplique o TextInRow com limite 1, ou seja, apenas conteúdos com 1 único caracter ficarão em linha. O resultado é que tudo ficará em páginas separadas da tabela. Um observador menos atento pode achar que isso é o mesmo que não aplicar o TextInRow mas ai que está o equivoco.

Os campos Text são armazenados em uma estrutura de árvore B. O ponteiro que encontra-se na linha aponta para a árvore, que aponta para o conteúdo. Então para cada registro lido, são necessárias duas leituras, a árvore e o conteúdo, para chegar ao resultado.

Porém, quando o TextInRow está ligado, ao invés de gravar um ponteiro para a árvore B o que é gravado é a própria árvore B apontando direto ao conteúdo. Com isso o acesso a informação de texto utiliza uma leitura a menos.

Podemos criar as seguintes tabelas para testar :

create table LOB1
(id int identity(1,1) not null primary key,
name varchar(50),
lfield text
)
go
exec sp_tableoption 'LOB1' , 'Text In Row','1'
go
insert into LOB1 values('John',replicate('x',900))
go 100
insert into LOB1 values('John',replicate('x',2000))
go 100
create table LOB1X
(id int identity(1,1) not null primary key,
name varchar(50),
lfield text
)
go
insert into LOB1X values('John',replicate('x',900))
go 100
insert into LOB1X values('John',replicate('x',2000))
go 100

LOB1 tem o textinrow ativado, mas nada gravado in row pois o limite é muito baixo. LOB1X não tem o textinrow ativado. Então compare as seguintes queries:

set statistics io on
select id,name,lfield from LOB1

select id,name,lfield from LOB1x

A query em LOB1X irá resultar em 666 LOB Logical reads (200 registros x 3 páginas por registro + uns quebrados)

Já a query em LOB1 irá resultar em apenas 266 LOB logical reads (200 registros x 1 página por registro + uns quebrados)

A única diferença de armazenagem é o TextInRow estar habilitado, mas ele não fez com que os valores fossem gravados de forma diferente. Apenas ao invés de inserir um ponteiro na linha, inseriu a própria árvore na linha, agilizando a leitura.

Infelizmente os campos Text estão marcados como deprecated e os campos varchar(max) não possuem configuração para gravarem a árvore B na linha, os LOB Logical reads testados com varchar(max) serão um pouquinho maiores.


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
Nenhum comentário foi realizado ainda. Seja o primeiro !
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br