Mostrando postagens com marcador 2000. Mostrar todas as postagens
Mostrando postagens com marcador 2000. Mostrar todas as postagens

quinta-feira, 4 de fevereiro de 2010

SELECT NOT EXISTS !

Olá pessoal,

talvez vocês já tenham visto isso em algumas SPs e Views em que aparece o recurso "coluna1 + coluna2 + coluna3 + ... + colunaN" selecionando-as como uma chave, combinando
com outra tabela e fazendo operações de conjuntos, por exemplo:


SELECT * FROM
#TESTE1 as A
WHERE
A.CAMPO1 + A.CAMPO2 -- <-- "chave" da tabela A
NOT IN
(SELECT B.CAMPO1 + B.CAMPO2 -- <-- "chave" da tabela B
FROM #TESTE2 as B)

Significa que quero todos os elementos da tabela A, com exceção dos que
são igual aos da tabela B ligados pela "chave" CAMPO1 + CAMPO2 iguais ou seja, é
equivalente à operação algebrica:
conjunto (A) - (B)

Esse artifício é comum e funciona, mas tem um problema sério de performance
pois o SQL terá que concatenar as colunas da primeira table, depois da segunda,
para só depois verificar se existe ou não. Quanto maiores forem as tabelas,
geometricos são os tempos de demora.

Bem, existe uma maneira melhor de fazer subtração de conjuntos no SQL onde
eu não preciso combinar as colunas para fazer um elemento que responda como
uma chave, veja os exemplos a seguir, execute-os em um banco e acompanhe os
resultados:

A vantagem é que o SQL encherga as colunas das duas tabelas e, com isso, pode fazer uma pesquisa muito mais rápida.

Exemplo mostrando a equivalencia


DROP TABLE #TESTE1
DROP TABLE #TESTE2


CREATE TABLE #TESTE1
(TIPO CHAR(10),ALIMENTO CHAR(10),VAL1 INT,VAL2 INT)


CREATE TABLE #TESTE2
(TIPO CHAR(10),ALIMENTO CHAR(10),VAL1 INT,VAL2 INT)


SET NOCOUNT ON

INSERT INTO #TESTE1 VALUES('FRUTA','BANANA',1,1)
INSERT INTO #TESTE1 VALUES('FRUTA','ABACAXI',1,1)
INSERT INTO #TESTE1 VALUES('LEGUME','FEIJÃO',1,1)
INSERT INTO #TESTE1 VALUES('LEGUME','AMENDOIM',1,1)

INSERT INTO #TESTE2 VALUES('FRUTA','CEREJA',1,1)
INSERT INTO #TESTE2 VALUES('FRUTA','ABACAXI',1,1)
INSERT INTO #TESTE2 VALUES('LEGUME','FEIJÃO',1,1)
INSERT INTO #TESTE2 VALUES('LEGUME','AMENDOIM',1,1)

/* aqui, selecionamos todos os alimentos de mesmo tipo
que tenham no primeiro, menos os que já existam no segundo.
isso da a idéia de incremento entre as tabelas A e B.
*/


SELECT * FROM #TESTE1
WHERE TIPO + ALIMENTO
NOT IN
(SELECT TIPO + ALIMENTO FROM #TESTE2)

/* o resultado é o mesmo, mas nesse exemplo o SQL vê as chaves
e com isso pode combinar de uma maneira mais inteligente para.
obter equivalencias entre as tabelas. O banco seleciona a coluna
com menos elementos e faz a combinação delas, em seguida, combina
os dados da segunda coluna (ou a coluna com mais elementos, consecutivamente)
assim, ele consegue uma busca muito mais rápida.
*/


SELECT * FROM #TESTE1 AS A
WHERE
NOT EXISTS
(SELECT TIPO,ALIMENTO
FROM #TESTE2 AS B
WHERE
A.TIPO = B.TIPO
AND A.ALIMENTO = B.ALIMENTO)

sábado, 14 de junho de 2008

Melhorando desempenho do Windows XP/2000 (usando o pendrive)

Lendo alguns artigos sobre os aperfeiçoamentos feitos no Windows Vista e fiquei curioso sobre o ReadyBoost.
Diz o anuncio da MS que essa tecnologia permite que o Windows, aumente a performance de carga e uso das aplicações. Fiquei me perguntando, como é que funciona?

A idéia baseia-se na arquitetura das memórias flash USB (os PenDrives). Diferentemente dos discos rígidos (os HDs), nas memórias flash o tempo para acessar qualquer lugar na memória é, praticamente, nulo.

Significa que um arquivo extremamente fragmentado no pendrive terá quase a mesma velocidade que o acesso de um arquivo gravado linearmente. Mas o que isso significa?

Vejamos uma situação prática. Você esta trabalhando num escritório de um cliente, desenvolvendo um sistema para ele, o computador disponível tem um processador relativamente bom de 1.8GHz (AMD), com 512MB de ram, 1 HD de 80GB e Windows XP. Porém depois de abrir o navegador (Firefox) para ver o resultado feito por uma interface de desenvolvimento - IDE - (NetBeans) que conecta em um banco de dados (Postgresql) que é alimentado por informações digitadas em uma plataforma de editoração de banco (OpenOffice). Pronto... seu computador ficou impraticavelmente lento e se reparar bem na luzinha do HD, estará piscando incansavelmente.

A luz pisca pois o SO (WinXP) esta usando a memória virtual, pois a real acabou, e significa que esta lendo e gravando movimentando-se para vários lugares aleatóriamente em um arquivo especial chamado c:\pagefile.sys . E se na tela eu mudo do navegador para a IDE o SO vai começar a descarregar dados do firefox no pagefile e ler, do mesmo arquivo, dados do NetBeans. além disso é possível que partes do programa tenham que ser relidos.

Como o pagefile e o IDE estão no mesmo disco, então espera-se carregar um e, depois, carrega-se o outro.

Agora faremos o seguinte, colocamos um pendrive de 8G, configuramos um arquivo de memória virtual nele e, por fim, fazemos todo o nosso trabalho. O que muda?

As diferenças são as seguintes:

- os dados em memória dos programas são lidos e gravados em várias partes da memória flash, que tem o acesso randomico mais rápido.
- enquanto isso é possível ler partes do programa do HD, que esta desfragmentado (espero!) e se foram peços grandes, terão o benefício da leitura sequencial de alta velocidade.

A velocidade de leitura e gravação randomica do USB + a velocidade de leitura e gravação sequencial do HD.Isso somado ao paralelismo do acesso simultâneo dos dois discos.

Sim há ganho de performance. O efeito prático mais visível é no momento da troca de tarefas, quando sem o pendrive o primeiro e o segundo programas ficam momentâneamente travados enquando o disco enlouquecedoramente pisca. Já com o pendrive, apenas a primeira tarefa fica ligeiramente enrroscada, já a segunda começa a ser desenhada e as luzes do pendrive e do HD piscam simultâneamente.

Para habilitar essa facilidade acesse as propriedades do computador, avançado, desempenho, configurações, opções de desempenho, avançado,memoria virtual, alterar; nas opções de unidade coloque o drive do pendrive e escolha um tamanho personalizado, inicial 1024 e final 1024 , em seguida basta clicar "definir" e dar os consecutivos "OK"s. Não é necessário reiniciar.



Esse percurso de configuração é parecido no Windows 2000 e no 2003.

E é claro, quanto mais memória ram você tiver ( maior ou igual que1G) menos precisará dessa técnica