求高手解惑,语句性能比较
在做项目时,碰到一个句子,感觉有点意思,但具体性能比较,哪个好就不知道了,求高手解惑。贴码:
--用于生成示例数据,这里是100W条数据
if OBJECT_ID('Test') is not null drop table Test
create table Test(ID [bigint] identity primary key,
ColumnA char(1) NULL,
ColumnB char(1) NULL)
INSERT INTO dbo.Test SELECT case
when abs(checksum(newid()))%(3) = 0 then char(65+abs(checksum(newid()))%(26))
when abs(checksum(newid()))%(2) = 0 then char(97+abs(checksum(newid()))%(26)) end, case
when abs(checksum(newid()))%(3) = 0 then char(65+abs(checksum(newid()))%(26))
when abs(checksum(newid()))%(2) = 0 then char(97+abs(checksum(newid()))%(26)) end
DECLARE @i AS INT, @rc AS INT,@max int;
SET @rc = 1;
SET @max = 1000000;
set @i = ceiling(log10(@max)/LOG10(2))-1;
WHILE @rc <= @i
BEGIN
INSERT INTO dbo.Test SELECT case
when abs(checksum(newid()))%(3) = 0 then char(65+abs(checksum(newid()))%(26))
when abs(checksum(newid()))%(2) = 0 then char(97+abs(checksum(newid()))%(26)) end, case
when abs(checksum(newid()))%(3) = 0 then char(65+abs(checksum(newid()))%(26))
when abs(checksum(newid()))%(2) = 0 then char(97+abs(checksum(newid()))%(26)) end
FROM dbo.Test;
SET @rc = @rc +1 ;
END
select @max = @max - @@IDENTITY
INSERT INTO dbo.Test
SELECT top(@max) case
when abs(checksum(newid()))%(3) = 0 then char(65+abs(checksum(newid()))%(26))
when abs(checksum(newid()))%(2) = 0 then char(97+abs(checksum(newid()))%(26)) end, case
when abs(checksum(newid()))%(3) = 0 then char(65+abs(checksum(newid()))%(26))
when abs(checksum(newid()))%(2) = 0 then char(97+abs(checksum(newid()))%(26)) end FROM dbo.Test
--方案一
SELECT * FROM TEST
WHERE ID NOT IN
(
SELECT ID FROM TEST
WHERE ColumnA='A' AND ColumnB='B'
)
--直接执行会提示缺少索引
/*
USE [mydb]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Test] ([ColumnA],[ColumnB])
INCLUDE ([ID])
GO
*/
--得到计划1
--按提示创建该索引,再次执行
--方案二
SELECT * FROM TEST
WHERE ID NOT IN
(
SELECT ID FROM TEST
WHERE ColumnA='A' AND ColumnB='B'
)
--得到计划2
--方案三
SELECT * FROM TEST
WHERE NOT (ColumnA='A' AND ColumnB='B')
--得到计划3
--方案四
SELECT * FROM TEST
WHERE ((ColumnA='A' AND ColumnB<>'B')
OR (ColumnA<>'A' AND ColumnB<>'B')
OR (ColumnA<>'A' AND ColumnB='B')
)
--得到计划4
--方案五
SELECT * FROM TEST a
WHERE NOT exists
(
SELECT ID FROM TEST b
WHERE ColumnA='A' AND ColumnB='B' and a.ID = b.id
)
--得到计划5
--方案六
select * from TEST
except
select * from TEST WHERE ColumnA='A' AND ColumnB='B'
--得到计划6