我想应该是
if exists(select top 1 id from tablename1) ...
快吧。用if exists(select top 1 1 from tablename1) ...就可以。
if exists(select top 1 id from tablename1) ...
快吧。用if exists(select top 1 1 from tablename1) ...就可以。
解决方案 »
- 重装sql server 2005,安装过程中 提示:sql server服务无法启动有关详细信息请参阅sql server联机丛书中的主题如何查看sql server 2005安装日志文件和手动启动
- 求一个取ID的存储过程
- 得到非数字部分 比如 '3S' '4LL' 得到 'S' 'LL'
- 谁能解释下?为什么非聚集索引成为精确匹配查询的最佳方法???
- SQL2008 R2 电子邮件通知问题
- 列前缀 'deleted' 与查询中所用的表名或别名不匹配的问题?
- 急啊!网站连上不上数据库了。老显示这个
- 高手指教:
- 请问在VFP(或其它WINDOWS环境下的编程语言环境下)如何控制中断?
- 关于SQL Server和Oracle 在半连接方面的问题
- 请高手指点SQLSERVER的底层结构问题
- 请问如何将长文本插入到text表中?更新又是什么命令呢?
select count(*)
這是不爭的事實.因為exists 只要找到有符合條件的記錄, 就會停止查找,而count(*)速度則會與表記錄關系很大.
if exists(select 1 from tablename1) ...没必要什么top 几,也没必要选哪个字段。
快多了
两条语句的速度相差不大。但是当表中的记录有千万到亿,那么速度就exists快多了,基本上还是保持在0s。EXISTS:
DECLARE @StartDate datetime, @EndDate datetime
SET @StartDate = getdate()
IF EXISTS(select 1 from sysobjects a,sysobjects b,sysobjects c,sysobjects d,sysobjects e,sysobjects f)
PRINT 'end'SET @EndDate = getdate()SELECT datediff(ms,@StartDate, @EndDate) AS 'Milliseconds'/*
Milliseconds
------------
0
*/COUNT(*):
DECLARE @StartDate datetime, @EndDate datetime
SET @StartDate = getdate()if (select count(*) from sysobjects a,sysobjects b,sysobjects c,sysobjects d)>0
PRINT 'end'SET @EndDate = getdate()SELECT datediff(ms,@StartDate, @EndDate) AS 'Milliseconds'/*
Milliseconds
------------
420(所影响的行数为 1 行)
*/
DECLARE @StartDate datetime, @EndDate datetime
SET @StartDate = getdate()if (select sum(1) from sysobjects a,sysobjects b,sysobjects c,sysobjects d)>0
PRINT 'end'SET @EndDate = getdate()SELECT datediff(ms,@StartDate, @EndDate) AS 'Milliseconds'/*
Milliseconds
------------
910(所影响的行数为 1 行)
*//****count(1)****/
DECLARE @StartDate datetime, @EndDate datetime
SET @StartDate = getdate()if (select count(1) from sysobjects a,sysobjects b,sysobjects c,sysobjects d)>0
PRINT 'end'SET @EndDate = getdate()SELECT datediff(ms,@StartDate, @EndDate) AS 'Milliseconds'/*
Milliseconds
------------
390(所影响的行数为 1 行)
*//****count(*)****/DECLARE @StartDate datetime, @EndDate datetime
SET @StartDate = getdate()if (select count(*) from sysobjects a,sysobjects b,sysobjects c,sysobjects d)>0
PRINT 'end'SET @EndDate = getdate()SELECT datediff(ms,@StartDate, @EndDate) AS 'Milliseconds'/*
Milliseconds
------------
390(所影响的行数为 1 行)
*/经过表明 count(1)与count(*)的速度几乎是相等的,为了与其他数据库的写法兼容,还是用*的为好,但是都比sum(1)的速度要快。
推荐count(1)