Sql Server

Preview:

Citation preview

Mejores PrácticasMejores Prácticasdede

SQL Server.SQL Server.

Gonzalo SayagoGonzalo Sayago

AgendaAgenda

Tipos de instrucciones.Tipos de instrucciones. Indices.Indices. Formalizando el Join.Formalizando el Join. Relaciones Muchos a Muchos.Relaciones Muchos a Muchos. Fechas.Fechas. Insert con indices.Insert con indices. Union.Union.

SQLSQL

DatosDatos

DML (Data Manipulation DML (Data Manipulation Language)Language)

SelectSelect InsertInsert UpdateUpdate Delete.Delete.

TCL (Transactional Control TCL (Transactional Control Language)Language)

Begin TransBegin Trans CommitCommit Rollback.Rollback.

AdministraciónAdministración

DDL (Data Definition Language)DDL (Data Definition Language) CreateCreate AlterAlter Drop.Drop.

DCL (Data Control Language)DCL (Data Control Language) GrantGrant Revoke.Revoke.

¿Qué es índice?¿Qué es índice?

Es una estructura de datos que mejora la Es una estructura de datos que mejora la velocidad de acceso a los registros de una velocidad de acceso a los registros de una tabla.tabla.

IndicesIndicesBranchBranch

IndiceIndice ConsultaConsulta

IdId Select Id, Name From BranchSelect Id, Name From Branch

Where Id = @IdWhere Id = @Id

NameName Select Id, Name From BranchSelect Id, Name From Branch

Where Name = @NameWhere Name = @Name

Id+NameId+Name Select Id, Name From BranchSelect Id, Name From Branch

Where Id = @Id and Name like @Name%Where Id = @Id and Name like @Name%

Name+IdName+Id Select Id, Name From BranchSelect Id, Name From Branch

Where Id = @Id and Name = @NameWhere Id = @Id and Name = @Name

+ Indices

Indice (Arbol B+)Indice (Arbol B+)

Seek >=2Seek >=2

http://www.seanster.com/BplusTree/BplusTree.html

Seek 6Seek 6

Clustered Index

Bookmark LookupBookmark Lookup

Select [Name] From [Area] Where [Id] = 3Select [Name] From [Area] Where [Id] = 3

Bookmark LookupBookmark Lookup

http://www.seanster.com/BplusTree/BplusTree.html

Area

Select [Name] From [Area] Where [Id] = 3Select [Name] From [Area] Where [Id] = 3

TIPTIPSelect Name From Branch Where (Id < 2) Or (Id > 2)Select Name From Branch Where (Id < 2) Or (Id > 2)

Select Name From Branch Where (Id <> 2)Select Name From Branch Where (Id <> 2)

Index Scan

Index Seek

Cluster y Non Cluster IndexCluster y Non Cluster Index Puede haber un solo índice Clustered por Puede haber un solo índice Clustered por

tabla.tabla. Los índices Clustered están asociados a Los índices Clustered están asociados a

la tabla.la tabla.

Los índices non clustered puede haber Los índices non clustered puede haber mas de uno por tabla.mas de uno por tabla.

¿Cuándo crear un índice?

IndicesIndicesSelect Name From Area

Where Campo1 = @Param1 And Campo2 = @Param2

Indice sobre Campo1

Indice sobre Campo2

Indice sobre Campo1 y Campo2

Indice compuesto sobre Campo1 y Campo2

SelectSelect

Campos de un SelectCampos de un SelectTabla.columnaTabla.columnaVista.columnaVista.columnaTable_Alias.columnaTable_Alias.columna

Tabla.columna as AliasTabla.columna as AliasVista.columna as AliasVista.columna as AliasTable_Alias.columna as AliasTable_Alias.columna as Alias

Tabla.columna AliasTabla.columna AliasVista.columna AliasVista.columna AliasTable_Alias.columna AliasTable_Alias.columna Alias

columnacolumna

Expresion as AliasExpresion as AliasExpresion AliasExpresion AliasAlias = ExpresionAlias = ExpresionExpresionExpresion

**

Tabla.*Tabla.*

Vista.*Vista.*

Alias.*Alias.*

Select [Id], [Name]Select [Id], [Name]

From [Branch]From [Branch]

Order By [Name]Order By [Name]

BranchBranch

SelectSelect

Resultado

Select [Hola] = [Id],Select [Hola] = [Id],

[Como estas?] = [Name][Como estas?] = [Name]

From [Branch]From [Branch]

Order By [Como estas?]Order By [Como estas?]

BranchBranch

SelectSelect

Resultado

Select [Branch].[Id],Select [Branch].[Id],[Branch].[Name], [Branch].[Name], [Area].[BranchId],[Area].[BranchId],[Area].[Id], [Area].[Id], [Area].[Name][Area].[Name]

From [Branch], [Area]From [Branch], [Area]

BranchBranch

Branch Area

Index Scan

Index Scan

Cuantos registros trae esta consulta?

Area

Los graficos son iguales

Producto CartesianoProducto Cartesiano

Dados los conjuntos A y B, se llama producto cartesiano Dados los conjuntos A y B, se llama producto cartesiano de A con B al conjunto AxB definido por:de A con B al conjunto AxB definido por:

AxB = {(x, y) / x Є A e y Є B}AxB = {(x, y) / x Є A e y Є B}

Es decir:Es decir:

BranchBranchA BAxBAxB

Select [Branch].[Id], [Branch].[Name], [Area].[BranchId], [Area].[Id], [Area].Select [Branch].[Id], [Branch].[Name], [Area].[BranchId], [Area].[Id], [Area].[Name] [Name] From [Branch], [Area]From [Branch], [Area]

Area

Select [Branch].[Id], [Branch].[Name], Select [Branch].[Id], [Branch].[Name], [Area].[Id], [Area].[Name], [Area].[Area].[Id], [Area].[Name], [Area].[BranchId][BranchId]

From [Branch], [Area]From [Branch], [Area]WhereWhere[Branch].[Id] = [Area].[BranchId][Branch].[Id] = [Area].[BranchId]

AreaBranchBranch

O mas conocido como:O mas conocido como:

Select [Branch].[Id], [Branch].[Name], [Area].[Id], [Area].[Name], [Area].[BranchId]Select [Branch].[Id], [Branch].[Name], [Area].[Id], [Area].[Name], [Area].[BranchId]

FromFrom [Branch] Inner Join [Area] On [Branch].[Id] = [Area].[BranchId][Branch] Inner Join [Area] On [Branch].[Id] = [Area].[BranchId]

Branch Area

Select [Branch].[Id], [Branch].[Name], Select [Branch].[Id], [Branch].[Name], [Area].[Id], [Area].[Name], [Area].[Area].[Id], [Area].[Name], [Area].[BranchId][BranchId]

From [Branch], [Area]From [Branch], [Area]WhereWhere[Branch].[Id] = [Area].[BranchId][Branch].[Id] = [Area].[BranchId]

AreaBranchBranch

Index Scan

Index Seek

Select [Branch].[Id], [Branch].[Name], [Area].[Id], [Area].[Name], [Area].[BranchId]Select [Branch].[Id], [Branch].[Name], [Area].[Id], [Area].[Name], [Area].[BranchId]

FromFrom [Branch][Branch]

Inner Join [Area] On [Branch].[Id] = [Area].[BranchId]Inner Join [Area] On [Branch].[Id] = [Area].[BranchId]

Los gráficos son diferentes.

Muchos a MuchosMuchos a Muchos

FacturaFactura ArtículoArtículo ArtículoFacturaArtículoFactura

Quiero obtener todos los datos de la Quiero obtener todos los datos de la factura 1 con todos los artículos.factura 1 con todos los artículos.

Muchos a MuchosMuchos a Muchos

Select F.*, A.* From Factura FSelect F.*, A.* From Factura F

Inner Join ArtículoFactura FA FA.FacturaId = F.IdInner Join ArtículoFactura FA FA.FacturaId = F.Id

Inner Join Artículo A on FA.ArticuloId = A.IdInner Join Artículo A on FA.ArticuloId = A.Id

Where F.Id = 1Where F.Id = 1

==

Select F.*, A.* From Factura FSelect F.*, A.* From Factura F

Inner Join ArtículoFactura FA FA.FacturaId = F.IdInner Join ArtículoFactura FA FA.FacturaId = F.Id

Inner Join Artículo A on FA.ArticuloId = A.IdInner Join Artículo A on FA.ArticuloId = A.Id

Where FA.FacturaId = 1Where FA.FacturaId = 1

Muchos a MuchosMuchos a Muchos

Select F.* From Factura FSelect F.* From Factura F

Left Join ArtículoFactura FA FA.FacturaId = F.IdLeft Join ArtículoFactura FA FA.FacturaId = F.Id

Where FA.Cantidad Is Null Or FA.Cantidad > 100Where FA.Cantidad Is Null Or FA.Cantidad > 100

==

Select F.* From Factura FSelect F.* From Factura F

Left Join ArtículoFactura FA FA.FacturaId = F.IdLeft Join ArtículoFactura FA FA.FacturaId = F.Id

Where FA.FacturaId Is Null Or FA.Cantidad > 100Where FA.FacturaId Is Null Or FA.Cantidad > 100

Constantes, Parametros y ValoresConstantes, Parametros y Valores

Constantes, Parametros y ValoresConstantes, Parametros y Valores

Create Procedure Ejemplo1Create Procedure Ejemplo1

@id Int@id Int

AsAs

Select Name From Area Where Id = @IdSelect Name From Area Where Id = @Id

Create Procedure Ejemplo2Create Procedure Ejemplo2

AsAs

Select Name From Area Where Expire > GetDate()Select Name From Area Where Expire > GetDate()

Date y TimeDate y Time

Tipo de dato Intervalo Precisión Tamaño

datetime Del 1 de enero de 1753hasta el 31 de diciembre de 9999

3,33Milisegundos

8 bytes

smalldatetime

Del 1 de enero de 1900hasta el 6 de junio de 2079

1 minuto 4 bytes

Funciones DateAdd y DateDiffFunciones DateAdd y DateDiff

Select Nombre From Promocion WhereVigenteDesde <= GetDate()

AndDateAdd(day,1,VigenteHasta)>=GetDate()

Select Nombre From Promocion WhereVigenteDesde <= GetDate()

AndVigenteHasta >= GetDate()-1

Funciones DateAdd y DateDiffFunciones DateAdd y DateDiff

Supongamos que las promociones duran 30 dias:

Select Nombre From Promocion WhereDateDiff(day, VigenteDesde, Getdate()) < 30

Select Nombre From Promocion WhereGetDate() - 30 < VigenteDesde

Date y TimeDate y TimeCreate Procedure Fechas

@date_from smalldatetime=null, @date_to smalldatetime=null

AsSelect Name From Area Where

(CreateDate > @date_from Or @date_from Is Null)And (CreateDate < @date_to Or @date_to Is Null)

Create Procedure Fechas@date_from smalldatetime=‘19000101’, @date_to smalldatetime=‘20790606’

AsSelect Name From Area Where

(CreateDate > @date_from)And (CreateDate < @date_to)

Date y TimeDate y TimeCreate Procedure Fechas

@date_from smalldatetime=null, @date_to smalldatetime=null

AsSelect Name From Area Where

(CreateDate > @date_from Or @date_from Is Null)And (CreateDate < @date_to Or @date_to Is Null)

Create Procedure Fechas@date_from smalldatetime=‘19000101’, @date_to smalldatetime=‘20790606’

AsSelect Name From Area Where

(CreateDate > @date_from)And (CreateDate < @date_to)

Date y TimeDate y TimeCreate Procedure Fechas

@date_from smalldatetime=null, @date_to smalldatetime=null

AsSelect Name From Area Where

(CreateDate > @date_from Or @date_from Is Null)And (CreateDate < @date_to Or @date_to Is Null)

Create Procedure Fechas@date_from smalldatetime=‘19000101’,@date_to smalldatetime=‘20790606’

AsSelect Name From Area Where

(CreateDate between @date_from and @date_to)

Insert Statement

Insert

Insert Into [Area] ([Name], [BranchId]) Values ('Plan', 1)

Union Statement

Union All

Union

La Union NO garantiza que los resultados estén

ordenados.

Para eso hay que usar un Order By.

Ultimo TIPUltimo TIPSelect Id, Name from AreaSelect Id, Name from Area

Where (Name = 'Default' and @Id Is Null) Or (Id = @Id)Where (Name = 'Default' and @Id Is Null) Or (Id = @Id)

==

Select Id, Name from Area Where (Name = 'Default' and @Id Is Null)Select Id, Name from Area Where (Name = 'Default' and @Id Is Null)Union AllUnion AllSelect Id, Name from Area Where (Id = @Id)Select Id, Name from Area Where (Id = @Id)

==

If @Id Is NullIf @Id Is NullSelect Id, Name from Area where Name = 'Default'Select Id, Name from Area where Name = 'Default'

ElseElseSelect Id, Name from Area where Id = @IdSelect Id, Name from Area where Id = @Id

PreguntasPreguntas

??

The EndThe End

Recommended