sql语句根据特定条件改变排序及效率测试

两个解决方案:

SELECT * FROM T_Admin
ORDER BY CASE WHEN admin_name = 'loo' THEN 0 ELSE 1 END 

另外一种:

SELECT *, 0 AS tmp_o
FROM t_admin
WHERE admin_name = 'loo'
UNION
SELECT *, 1 AS tmp_o
FROM t_admin
WHERE admin_name <> 'loo'
ORDER BY tmp_o


现在来考虑一下两条语句的效率问题

建立表:

CREATE TABLE [TestTable] (
 [ID] [int] IDENTITY (1, 1) NOT NULL ,
 [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

 

插入数据:(2万条,用更多的数据测试会明显一些)
SET IDENTITY_INSERT TestTable ON

declare @i int
set @i=1
while @i<=20000
begin
    insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
    set @i=@i+1
end

SET IDENTITY_INSERT TestTable OFF

 

简单的测试一下

如果不用top,所有数据都select出来的话两个的成本大概都是在50%左右,case语句会更快那么一点。


而同时输出几万记录的情况确实是太少了,加上top 10 结果就差非常的多。

union语句只需要0.38% 而 case语句竟然要99.26%。

测试的结果是:
如果小量数据推荐使用case语句,毕竟写起来是方便多了。
如果你的数据在1万以上,最好还是用union语句。

你可能感兴趣的:(sql语句根据特定条件改变排序及效率测试)