/*================================================================================== Curso: SQL SERVER 2019 https://www.udemy.com/course/draft/3957796/?referralCode=FB10D369E786D9FE8A48 Instrutor: Sandro Servino https://www.linkedin.com/in/sandroservino/?originalSubdomain=pt https://filiado.wixsite.com/sandroservino PERFORMANCE: LIKE %DADO% E COLLATION Se o collation na base de dados estiver com latin1-??? (padrao do windows) ao inves de sql_latin1_??? as queries que usam like %dados% e o tipo de dado usado no filtro for char ou varchar ao inves de nchar ou nvarchar a querie rodara muito mais lento. Neste caso, no select troque o collation. ==================================================================================*/ -- VAMOS AO LAB CREATE DATABASE [supportdba] CONTAINMENT = NONE ON PRIMARY ( NAME = N'supportdba', FILENAME = N'd:\ARQ_DBA\supportdba.mdf' , SIZE = 2048000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 8000KB ) LOG ON ( NAME = N'supportdba_log', FILENAME = N'd:\ARQ_DBA\supportdba_log.ldf' , SIZE = 500736KB , MAXSIZE = 2048GB , FILEGROWTH = 8000KB ) GO use supportdba --DROP TABLE IF EXISTS dbo.Teste_Collation_SQL -- Cria e popula a tabela com varios registros create table dbo.Teste_Collation_SQL ( cod int identity(1,1) PRIMARY KEY, Dt_Log datetime, Descricao varchar(50) ) -- Popula a tabela (pode demorar alguns minutos) insert into dbo.Teste_Collation_SQL select getdate(), REPLICATE('A',50) go 10 insert into dbo.Teste_Collation_SQL(Dt_Log,Descricao ) SELECT Dt_Log,Descricao FROM Teste_Collation_SQL GO 20 insert into dbo.Teste_Collation_SQL select getdate(), 'sandro servino 1' insert into dbo.Teste_Collation_SQL select getdate(), '- sandro servino 2' CREATE NONCLUSTERED INDEX SK01_Teste_Collation_SQL ON Teste_Collation_SQL(Descricao) WITH(FILLFACTOR=95) sp_spaceused Teste_Collation_SQL SET STATISTICS IO ON SET STATISTICS TIME ON -- LIGAR OPCAO PARA VER O PLAN QUE SERA UTILIZADO -- CTRL+M -- Teste 1: usando a collation da minha coluna: Latin1_General_CI_AI SELECT COUNT(*) FROM Teste_Collation_SQL WHERE Descricao LIKE '%sandro%' OPTION (RECOMPILE) -- Teste 2: usando a collation da minha coluna: Latin1_General_CI_AI SELECT COUNT(*) FROM Teste_Collation_SQL WHERE Descricao COLLATE SQL_Latin1_General_CP1_CI_AI LIKE '%sandro%' OPTION (RECOMPILE) --Rodando o Teste 1 forcando a collation da coluna (que nao faz diferenca nenhuma) SELECT COUNT(*) FROM Teste_Collation_SQL WHERE Descricao COLLATE Latin1_General_CI_AI LIKE '%sandro%' OPTION (RECOMPILE) -- Curiosidade: A collation BIN é ainda mais rapido, contudo ela é case sensitive e acent sensitive... -- Se voce tivesse uma collation Latin1_General_CS_AS, voce poderia fazer o like com a Latin1_General_BIN2 SELECT COUNT(*) FROM Teste_Collation_SQL WHERE Descricao COLLATE Latin1_General_BIN2 LIKE '%sandro%' OPTION (RECOMPILE) -- link referencia com a explicacao -- https://support.microsoft.com/en-us/help/322112/comparing-sql-collations-to-windows-collations ---FIM LAB ----------------------------------------------------------------------------------------------------------------------------------------------------------------- -- OBS MYSQL -- FAÇA ESTE TESTE NO MYSQL POIS FOI RELATADO QUE TAMBEM FUNCIONOU: -- “WHERE tabela.campo LIKE ‘%dado%'” -- por -- “WHERE tabela.campo COLLATE utf8_general_ci LIKE ‘%dado%'” --------------------------