sql >> Database >  >> RDS >> Sqlserver

Schemabinding met berekende kolomfunctie

Het is onmogelijk om een ​​index toe te voegen aan een berekende kolom, tenzij deze deterministisch is.

"Deterministische functies retourneren altijd hetzelfde resultaat wanneer ze worden aangeroepen met een specifieke set invoerwaarden en gegeven dezelfde status van de database. Niet-deterministische functies kunnen verschillende resultaten retourneren elke keer dat ze worden aangeroepen met een specifieke set invoerwaarden zelfs als de database aangeeft waartoe ze toegang hebben, blijft hetzelfde."

Voorbeeld:

CREATE FUNCTION dbo.FuncA()
RETURNS [float]
WITH SCHEMABINDING    -- required option
BEGIN
  RETURN 1.0   -- DB engine parses body, and marks this func. as 'deterministic'
END
GO

CREATE TABLE TableA (
  K int primary key clustered,
  A AS dbo.FuncA() PERSISTED    -- must be persisted
)
GO

CREATE VIEW ViewA
WITH SCHEMABINDING    -- required option
AS
  SELECT K, A FROM dbo.TableA
GO

CREATE UNIQUE CLUSTERED INDEX IDX1 ON dbo.ViewA (K, A)
GO

U moet PERSISTED opgeven voor onnauwkeurige gegevenstypen zoals [real] en [float] , in andere gevallen kunt u vrijelijk een index maken op een weergave met berekende kolom ([decimaal] is OK).




  1. In clausule versus OR-clausule qua prestaties

  2. Best practice om een ​​jsonb null te identificeren in plpgsql

  3. hoe deel te nemen aan 2 tafels

  4. query mysql-database vanuit een klasse