27,580
社区成员
发帖
与我相关
我的任务
分享
select 1 from table where name=@name or mail=@mail
--创建表
CREATE TABLE tblUser(
UserID int NOT NULL PRIMARY KEY CLUSTERED,
UserName nvarchar(20) NOT NULL,
Birthday datetime NOT NULL)
--生成测试数据
INSERT INTO tblUser
SELECT UserID = 1000000 + n,
UserName = 'U' + CAST(1000000 + n AS varchar(10)),
Birthday = DATEADD(day,ABS(CHECKSUM(NEWID()))%18262,'19500101')
FROM dbo.Nums
WHERE n <= 100000
--创建非聚集索引
CREATE INDEX IX_tblUser_UserName ON tblUser(UserName)
CREATE INDEX IX_tblUser_Birthday ON tblUser(Birthday)
--查询测试
--(20264 行受影响)
--查询开销:22%
SELECT * FROM tblUser WHERE UserName LIKE 'U10001%' OR Birthday BETWEEN '19800101' AND '19900101'
--(20264 行受影响)
--查询开销:40%
SELECT * FROM tblUser WHERE UserName LIKE 'U10001%'
UNION
SELECT * FROM tblUser WHERE Birthday BETWEEN '19800101' AND '19900101'
--(20286 行受影响) 数据存在重复
--查询开销:38%
SELECT * FROM tblUser WHERE UserName LIKE 'U10001%'
UNION ALL
SELECT * FROM tblUser WHERE Birthday BETWEEN '19800101' AND '19900101'
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(COL1 INT,COL2 INT,COL3 INT)
INSERT INTO TB
SELECT
CHECKSUM(NEWID()),CHECKSUM(NEWID()),CHECKSUM(NEWID())
FROM master..spt_values T1
where type='P'
CREATE NONCLUSTERED INDEX INX_TB_COL1 ON TB(COL1)
CREATE NONCLUSTERED INDEX INX_TB_COL2 ON TB(COL2)
SET SHOWPLAN_TEXT ON
GO
SELECT * FROM TB WHERE COL1='1500690911' OR COL2='-1927829915'
/*
|--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1000]))
|--Stream Aggregate(GROUP BY:([Bmk1000]))
| |--Merge Join(Concatenation)
| |--Index Seek(OBJECT:([tempdb].[dbo].[TB].[INX_TB_COL1]), SEEK:([tempdb].[dbo].[TB].[COL1]=(1500690911)) ORDERED FORWARD)
| |--Index Seek(OBJECT:([tempdb].[dbo].[TB].[INX_TB_COL2]), SEEK:([tempdb].[dbo].[TB].[COL2]=(-1927829915)) ORDERED FORWARD)
|--RID Lookup(OBJECT:([tempdb].[dbo].[TB]), SEEK:([Bmk1000]=[Bmk1000]) LOOKUP ORDERED FORWARD)
*/
select 1 from table where [name]=@name
union all
select 1 from table where [mail]=@mail