
4个回答
2013-01-13
展开全部
作为运行效率来说的话, 有2种情况。
第一种情况, 是返回了太多没有用处的列,导致网络传输的数据过多。
* 要返回所有的列的信息。
如果你表的列很多, 又存在很多 二进制的数据类型的话。
例如有某个 安保系统, 有个 进出门的日志表。 这个门需要 2个人, 各刷一次卡,才能进入。
这个表包含下面的列:
自增流水、门口代码、日期时间、第一次刷卡的卡片代码,第二次刷卡的卡片代码,第一次刷卡的照片,第二次刷卡的照片,......其他列
现在发现可能有安全问题, 说昨天有东西丢了。
那么首先就是先
SELECT
日期时间、门口代码,第一次刷卡的卡片代码,第二次刷卡的卡片代码
FROM
表
WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点
先看看都哪些人刷卡了, 然后再去有重点地去查看那些 可能有问题的 刷卡记录的 照片信息。
否则你直接
SELECT
*
FROM
表
WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点
一次就会有太多的数据, 从服务器 传递到你的客户端。 而这些数据, 又可能是你用不上的。
第二种情况, 是如果检索的列都包含在索引里面了, 那么查询效率要快很多。
还是上面那个例子。
假如存在有这样的索引 (门口代码, 日期时间)
SELECT
日期时间、门口代码
FROM
表
WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点
这个查询, 连表都不需要查询了, 直接查询完索引, 就能返回了。
在 SQL Server 中, 可以通过 Include 来包含一个额外的数据到索引上面。
例如:
CREATE NONCLUSTERED INDEX idx_TestDoc
ON 表 (门口代码, 日期时间)
Include(第一次刷卡的卡片代码,第二次刷卡的卡片代码) ;
上面的索引创建完毕的话
SELECT
日期时间、门口代码,第一次刷卡的卡片代码,第二次刷卡的卡片代码
FROM
表
WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点
也不需要访问表了, 直接查询索引, 就能返回了。
这个情况,用 select * 嘛, 是不行的。就要先去访问好索引, 然后通过索引里面的 信息, 去表里面定位到具体的行数据, 最后再检索出来。
第一种情况, 是返回了太多没有用处的列,导致网络传输的数据过多。
* 要返回所有的列的信息。
如果你表的列很多, 又存在很多 二进制的数据类型的话。
例如有某个 安保系统, 有个 进出门的日志表。 这个门需要 2个人, 各刷一次卡,才能进入。
这个表包含下面的列:
自增流水、门口代码、日期时间、第一次刷卡的卡片代码,第二次刷卡的卡片代码,第一次刷卡的照片,第二次刷卡的照片,......其他列
现在发现可能有安全问题, 说昨天有东西丢了。
那么首先就是先
SELECT
日期时间、门口代码,第一次刷卡的卡片代码,第二次刷卡的卡片代码
FROM
表
WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点
先看看都哪些人刷卡了, 然后再去有重点地去查看那些 可能有问题的 刷卡记录的 照片信息。
否则你直接
SELECT
*
FROM
表
WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点
一次就会有太多的数据, 从服务器 传递到你的客户端。 而这些数据, 又可能是你用不上的。
第二种情况, 是如果检索的列都包含在索引里面了, 那么查询效率要快很多。
还是上面那个例子。
假如存在有这样的索引 (门口代码, 日期时间)
SELECT
日期时间、门口代码
FROM
表
WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点
这个查询, 连表都不需要查询了, 直接查询完索引, 就能返回了。
在 SQL Server 中, 可以通过 Include 来包含一个额外的数据到索引上面。
例如:
CREATE NONCLUSTERED INDEX idx_TestDoc
ON 表 (门口代码, 日期时间)
Include(第一次刷卡的卡片代码,第二次刷卡的卡片代码) ;
上面的索引创建完毕的话
SELECT
日期时间、门口代码,第一次刷卡的卡片代码,第二次刷卡的卡片代码
FROM
表
WHERE
门口代码 = '那个丢东西房间的门'
AND 日期时间 > 昨天0点
也不需要访问表了, 直接查询索引, 就能返回了。
这个情况,用 select * 嘛, 是不行的。就要先去访问好索引, 然后通过索引里面的 信息, 去表里面定位到具体的行数据, 最后再检索出来。
展开全部
1楼说的太多了,但是不是重要的。
sql语句之所以不能使用*,是为了程序的扩展性,即向后兼容性,
在c#和众多web项目的开发中,如果sql语句写死了,如果将来你修改sql表结构,用* 查询,那么会发生什么情况,,,
可想而知,程序异常。而不使用*,那么不管你以后怎么修改表结构,都没问题。
sql语句之所以不能使用*,是为了程序的扩展性,即向后兼容性,
在c#和众多web项目的开发中,如果sql语句写死了,如果将来你修改sql表结构,用* 查询,那么会发生什么情况,,,
可想而知,程序异常。而不使用*,那么不管你以后怎么修改表结构,都没问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那你说说看。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询