Ich möchte eine Tabelle mit einer NOT NULL
Bool-Spalte erstellen .
Ich benutze TINYINT
mit CHECK
Zwang BETWEEN 0 and 1
. Die Einschränkung ist neu und daher vertrauenswürdig
Jetzt würde ich erwarten, dass SQL Optimizer jetzt weiß, dass diese Spalte nur 0 und 1 sein kann. Wenn ich also eine Abfrage schreibe, col >= 2
wird Constant Scan im tatsächlichen Ausführungsplan angezeigt (wie wenn ich nach NULL
oder suchen würdeSELECT TOP (0)
Dies ist jedoch nicht der Fall, sondern entscheidet sich für die Tabelle Scan. Muss ich auch einen Index für diese Spalte haben?
In meinem Test unten verwende ich TINYINT
mit CHECK
Einschränkung. Benutzerdefinierter Typ basierend auf TINYINT
gebundenem RULE
und gutem Alter BIT
.
GO
CREATE TYPE dbo.myBool
FROM [INT] NOT NULL
GO
CREATE RULE dbo.R_Bool AS @value BETWEEN 0 AND 1
go
EXEC sys.sp_bindrule @rulename = N'R_Bool'
, @objname = N'myBool'
GO
DROP TABLE IF EXISTS dbo.RuleTest
CREATE TABLE dbo.RuleTest
(
Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED
, oldSchoolBool TINYINT NOT NULL CHECK (oldSchoolBool BETWEEN 0 AND 1)
, customBool dbo.myBool NOT NULL
, myBit BIT NOT NULL
)
;WITH tally (n)
AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM (VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0)) AS a(n)
CROSS JOIN (VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0)) AS b(n)
CROSS JOIN (VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0)) AS c(n)
)
INSERT INTO dbo.RuleTest
(oldSchoolBool, customBool, myBit)
SELECT
ABS(CHECKSUM(NewId())) % 2
,ABS(CHECKSUM(NewId())) % 2
,ABS(CHECKSUM(NewId())) % 2
FROM tally t
SET STATISTICS IO ON;
SELECT * FROM dbo.RuleTest rt
WHERE rt.oldSchoolBool IS NULL
SELECT * FROM dbo.RuleTest rt
WHERE rt.oldSchoolBool >=2
go
SELECT * FROM dbo.RuleTest rt
WHERE rt.customBool >=2
go
SELECT * FROM dbo.RuleTest rt
WHERE rt.myBit >= 2
SET STATISTICS IO OFF;
Ich sehe einen konstanten Scan für die NULL-Prüfung und 3 Tabellenscans für den Rest.
WHERE myBit >= 2
Bedingungen haben , wenn Sie wissen, dass die Werte niemals größer als 1 sein können.