摘要: 不要认为只要有负向查询出现在查询条件WHERE子句中就一定认为索引就没有效用,在WHERE子句中使用非SARG并不一定导致全表扫描或是聚集索引扫描。SQL SERVER可以在某些非SARG状况中使用索引,以及查询中虽然包含了部分非SARG但仍可以对此查询中的SARG部分使用索引。 也不要认为在查询语句中的查询条件WHERE子句中使用SARG就一定会使用到相应的索引,而不会进行全表扫描或聚集索引扫描。SQL SERVER查询优化程序会根据SARG使用情况所获取的查询结果的记录数量是否过多,而决定是使用相应的索引,还是使用全表扫描或是聚集索引扫描。当然,无论情况如何,在进行性能调校时,最先也是最直接的改变就是把非SARG改成SARG。因为把非SARG改成SARG最坏的情况就是全表扫描或是聚集索引扫描,查询结果的记录数量比较少,会高效利用相应索引,快速查出结果。 阅读全文
posted @ 2013-01-26 20:34 DotNet菜园 阅读(2300) 评论(0) 推荐(2) 编辑
摘要: 除了不应该做字段数据的计算外,非SARG 语句的格式语句还包含在WHERE条件子句中,使用负向查询操作符。 如NOT 、!=、 、!、!、NOT EXISTS 、NOT IN及NOT LIKE 等,因为通过有顺序的索引结构,SQL SERVER 可以有效地利用二分法进行查找,快速找到相应的数据,但是如果查询条件是不要什么数据,其余的都要(就是负向查询), 则 无法利用索引进行二分查找,只能进行全表扫描或聚集索引扫描。 以下同样是负向操作健立的SARG 条件查询与非SARG 条件查询范例。从中可以看出两者的执行成本是不一样的,相差十倍左右,但是其数据查询的记录数量也不一样。个人理解查询优化程序是根据数据查询的记录数量,来决定使用哪种执行计划。 阅读全文
posted @ 2012-12-18 23:03 DotNet菜园 阅读(4354) 评论(1) 推荐(4) 编辑
摘要: 对于非SARG语句,SQL SERVER 必须评估每一笔记录以决定它是否符合WHERE子句的条件。所以索引对于采用非SARG条件的查询通常没什么用处。而通过非SARG语句通常包含以下操作: NOT、!=、、!、! 、NOT EXISTS 、NOT IN 和NOT LIKE 等,以及上述提及的“%IS%”,其中LIKE使用方法会造成全表扫描(TARLE SCAN)或是聚集扫描而降低性能. 阅读全文
posted @ 2012-11-08 22:00 DotNet菜园 阅读(3825) 评论(2) 推荐(5) 编辑
摘要: 在编写SQL语句的WHERE 子句时,你是否考虑过WHERE子句中的条件参数的编写格式要符合“ (查询参数:SARG )”规则,SQL SERVER的查询优化程序才能建立有效的利用索引的计划。 阅读全文
posted @ 2012-10-31 21:29 DotNet菜园 阅读(13533) 评论(3) 推荐(2) 编辑
摘要: 一般来说,建立索引要看数据使用的场景,换句话来说哪些访问数据的SQL语句是常用的,而这些语句是否因为缺少索引(也有可能是索引过多)变的效率低下。但绝不是所有的SQL语句都要建立索引,如果所有的SQL语句都建立索引,那么可能导致建立过多的索引。 阅读全文
posted @ 2012-09-20 21:35 DotNet菜园 阅读(8102) 评论(6) 推荐(8) 编辑
摘要: 索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以。但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好。索引建少了,用WHERE子句找数据效率低,不利于查找数据。索引建多了,不利于新增、修改和删除等操作,因为做这些操作时,SQL SERVER除了要更新数据表本身,还要连带地立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间。因此要建得恰到好处,这就需要经验了。 阅读全文
posted @ 2012-09-19 20:56 DotNet菜园 阅读(51068) 评论(10) 推荐(22) 编辑
摘要: 通过实例,来查看不同的索引结构,如聚集索引、非聚集索引、组合索引等来查看相同的SQL语句查询的不同性能。在建立覆盖查询时要尽量限制索引键值的大小,保持Row-to-key的大小比例差异越大越好。否则扫描覆盖索引与扫描数据表所花的I/O操作差不多,这样就失去了建立覆盖索引的意义。 阅读全文
posted @ 2012-09-05 21:17 DotNet菜园 阅读(4966) 评论(1) 推荐(4) 编辑
摘要: 覆盖索引又可以称为索引覆盖,是非聚集组合索引的一种形式,它包括在查询里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。 阅读全文
posted @ 2012-09-04 22:38 DotNet菜园 阅读(19474) 评论(11) 推荐(2) 编辑
摘要: 对于扫描部分或全部表的查询,这些表碎片会导致额外的页读取,这将防碍数据的并行扫描。 阅读全文
posted @ 2012-08-30 20:51 DotNet菜园 阅读(3966) 评论(6) 推荐(5) 编辑
摘要: SQL Server在堆表中查询数据时,是不知道到底有多少数据行符合你所指定的查找条件,它将根据指定的查询条件把数据表的全部数据都查找一遍。如果有可采用的索引,SQL Server只需要在索引层级查找每个索引分页的数据,再抓出所需要的少量数据分页即可。访问数据表内数以万计的数据分页与只访问少数索引的分页两者间的差异,让索引变成效能调校的最佳工具。 阅读全文
posted @ 2012-08-29 20:43 DotNet菜园 阅读(12477) 评论(10) 推荐(7) 编辑
摘要: 堆表的在执行Select语句时的默认排序问题——解决问题 1.已经有读者在"发现问题"的那篇文章中留言了最简单的解决问题的方式,就是给表中添加主键值。 2.在分页查询语句的内层语句中添加排序,指定排序字段。 阅读全文
posted @ 2012-06-06 22:07 DotNet菜园 阅读(829) 评论(0) 推荐(1) 编辑
摘要: 对于Sql Server 执行计划没有带索引的表,select返回记录的顺序和堆表扫描返回的顺序相同。通过扫描 IAM 页可以对堆集进行表扫描或串行读,以找到容纳这个堆集的页的扩展盘区。因为 IAM 按扩展盘区在数据文件内存在的顺序表示它们,意味着堆集中的行一般不按照插入的顺序返回。堆表(heap table)数据插入时时存储位置是随机的,主要是数据库内部块的空闲情况决定,获取数据是按照命中率计算,全表扫表时不见得先插入的数据先查到。 阅读全文
posted @ 2012-06-04 20:48 DotNet菜园 阅读(1424) 评论(0) 推荐(0) 编辑
摘要: 在数据库SQL 中,如果一张表既无主键又无索引,那么当执行Select语句查询时,默认的排序规则是如何的呢? 阅读全文
posted @ 2012-06-03 21:42 DotNet菜园 阅读(2324) 评论(4) 推荐(0) 编辑
摘要: ExtJs中使用中碰到的三个问题的解决方法 阅读全文
posted @ 2012-04-12 13:37 DotNet菜园 阅读(3807) 评论(0) 推荐(1) 编辑
摘要: 正则表达式与模版解析的性能比较 阅读全文
posted @ 2012-01-05 22:02 DotNet菜园 阅读(1393) 评论(0) 推荐(0) 编辑
摘要: 关于拼sql语句执行与直接执行存储过程的效率比较 阅读全文
posted @ 2012-01-05 21:57 DotNet菜园 阅读(8234) 评论(1) 推荐(1) 编辑
摘要: SQL语句练习实例之九 ——对字符串进行排序 阅读全文
posted @ 2011-11-22 23:24 DotNet菜园 阅读(3591) 评论(0) 推荐(0) 编辑
摘要: SQL语句练习实例之八——对于销售员提成收入的计算 阅读全文
posted @ 2011-11-09 23:48 DotNet菜园 阅读(1043) 评论(0) 推荐(0) 编辑
摘要: SQL语句练习实例之七——剔除不需要的记录行 阅读全文
posted @ 2011-10-19 23:25 DotNet菜园 阅读(782) 评论(1) 推荐(1) 编辑
摘要: SQL语句练习实例之六——人事系统中的缺勤(休假)统计 阅读全文
posted @ 2011-10-19 22:57 DotNet菜园 阅读(1332) 评论(1) 推荐(0) 编辑