select count(1) from Table1 where [ID] = 1001 select count([ID]) from Table1 where [ID] = 1001 ---------------------------------------------------- 這2者不同,前者類似於count(*),後者會將null去掉. 至於count(1)和count(*),如果有索引,count(*)會優先用到,所以2者各有好處
select 1 where exists (select [ID] from Table1 where [ID]=1001) select [ID] from Table1 where [ID] = 1001 select top 1 [ID] from Table1 where [ID] = 1001 ----------------------------------- 這3句也是不一樣的. 所以,不怎麼好比啊
SQL隱藏的轉換,一般是低的往高的轉,比如smallint與int比,SQL就會先將smallint轉成int,再比.附online book上的類型等級 ------------------------------ sql_variant (最高) datetime smalldatetime float real decimal money smallmoney bigint int smallint tinyint bit ntext text image timestamp uniqueidentifier nvarchar nchar varchar char varbinary binary (最低)
select * from [Table1] where [ID] = 10 select * from [Table1] where [ID] = '10' ------------------ 這個當然上面的好了,下面的要轉換成int --------------------------------------- string sql = "select * from [Table1] where [ID] = 10"; 你是指不加引号,在数据库分析执行时可以直接认为是int,而加了引号会先转为字符串再格式化成int?如果有而外消耗,大概有多少?字符串到特定类型的格式化过程消耗? 相比 在程序中做反射得到有引号或无引号的字符串的消耗哪个会更大些?
select count([ID]) from Table1 where [ID] = 1001
----------------------------------------------------
這2者不同,前者類似於count(*),後者會將null去掉.
至於count(1)和count(*),如果有索引,count(*)會優先用到,所以2者各有好處
select [ID] from Table1 where [ID] = 1001
select top 1 [ID] from Table1 where [ID] = 1001
-----------------------------------
這3句也是不一樣的.
所以,不怎麼好比啊
------------------------------
sql_variant (最高)
datetime
smalldatetime
float
real
decimal
money
smallmoney
bigint
int
smallint
tinyint
bit
ntext
text
image
timestamp
uniqueidentifier
nvarchar
nchar
varchar
char
varbinary
binary (最低)
select * from [Table1] where [ID] = '10'
------------------
這個當然上面的好了,下面的要轉換成int
---------------------------------------
string sql = "select * from [Table1] where [ID] = 10";
你是指不加引号,在数据库分析执行时可以直接认为是int,而加了引号会先转为字符串再格式化成int?如果有而外消耗,大概有多少?字符串到特定类型的格式化过程消耗?
相比 在程序中做反射得到有引号或无引号的字符串的消耗哪个会更大些?
insert或update 时,加了引号后也按“Sql的隐藏转换”规则往上转换么?
按你说的:
我们传给数据库服务器的是一条字符串型的Sql命令,在服务器分析时 加了引号的值和没加引号的值 会存在如下转换过程:
无引号的值 ----> 转换成 变量类型
有引号的值 ----> 转换成 字符串 ----> 隐藏的转换 变量类型
是这样么?
select * from [Table1] where [ID] = 10
select * from [Table1] where [ID] = '10'
---------------------
一样,可以看执行计划
如果ID唯一,不要加top 1,top 1比较影响性能,有top就会做一次sort. 如果id是主键,即使有top 1 也没有关系。有count 肯定慢的,要先进行group by,如果ID重复记录非常多,感觉用exists 就应该会快点
select * from [Table1] where [ID] = 10
select * from [Table1] where [ID] = '10'
---------------------
一样,可以看执行计划
---------------------------------------
以前还真没注意在执行计划里能看到类型转换~测试了几种类型,暂时得出一个结论:
select 时:给值加上引号和不加基本一致,而给decimal类型的字段付值可以看出,应该是Sql查询分析器在分析之前先将值转换了一下,加了引号的decimal值,会把多余精度的小数位抛弃,而不加引号的则会直接放在等号后;
update 时:此时可以看出无论是否加了引号都是用Convert()函数格式化的~所以个人认为分析器将所有值都视为字符串统一转换,所以得出的结论是加不加引号都会被认为是字符串,然后用Convert()转换成字段类型;
------------------汗…… 从网上看到有人说加个 top 1 比较快~ 所以也就列出来了。。
在存储过程里判断一般都用exists,所以也想了一条用exists的~
而之前在往上看到的~平时接触到的基本都是select count(*)~
所以比较想知道这些语句之间的区别,在检索同样的索引列的情况下我想知道是select count比较快还是select [Index]比较快,还有就是select [Index]返回一行比较快还是exists比较快……