sqlserver索引

SQL性能优化

我的梦境 提交于 2019-12-03 03:34:17
引言:      以前在面试的过程中,总有面试官问道:你做过sql性能优化吗?对此,我的答复是没有。一次没有不是自己的错误,两次也不是,但如果是多次呢?今天痛下决心,把有关sql性能优化的相关知识总结一下,以便在不久的将来,我的回答不是“没有”,总能多多少少说一些东西。算是长进吧。说到性能优化,本人感觉到有必要先了解sql语句的执行顺序,因为对优化或多或少的会有些帮助。 sql语句执行顺序:      sql语句和其他相关的编程语言最大不同的地方应该是执行顺序。对于大多数编程语言来说都是按照顺序进行执行,但对于sql语句,尽管select是最开始出现,但几乎总是最后一个执行,最开始执行的往往是from子句。每一步骤产生一个虚拟表,这些虚拟表对于调用者来说是不能用的,仅仅作用于下一步骤,而只有最后的查询结果表才能被调用者所使用。当有步骤没有出现时便跳过该执行步骤。下面上代码: (8)SELECT (9)DISTINCT (11)<Top Num> <select list> (1)FROM [left_table] (3)<join_type> JOIN <right_table> (2) ON <join_condition> (4)WHERE <where_condition> (5)GROUP BY <group_by_list> (6)WITH <CUBE | RollUP>

SQLServer索引

牧云@^-^@ 提交于 2019-12-01 11:41:40
一、重要内容汇总:   1.SQLServer索引有两种,聚集索引和非聚集索引;   2.聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。   3.聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。   4.创建索引语法:CREATE [UNIQUE][CLUSTERED | NONCLUSTERED] INDEX index_name ON {table_name | view_name} [WITH [index_property [,....n]]     事例:建为pawn_ddhxx 表建一个索引名为Clust_ddhxx_bh,索引列为bh的聚集索引,create Clustered index Clust_ddhxx_bh on pawn_ddhxx (bh)   5.删除索引语法:DROP INDEX table_name.index_name[,table_name.index_name]     事例:drop index pawn_fk_dwdjbdw.Clust_dw_bh 二、 内容 详述 1.1 什么是索引?   索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间。 下面举两个简单的例子:   图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如

SQLServer中重建聚集索引之后会影响到非聚集索引的索引碎片吗

大憨熊 提交于 2019-12-01 04:40:43
上午(20171011)看到qq群里发了一个云栖大会的链接,点进去看了一下sqlserver的专场,刚好是提问环节 有人问了一个问题,原话记不清楚了, 大概的意思(他自己认为)就是说:“SQLServer中重建聚集索引之后会影响非聚集索引的碎片情况,也要顺带重建非聚集索引” 我想大概是他自己认为“重建聚集索引之后会影响到非聚集索引的索引碎片” 提问者跟专家交流这个观点,一开始提问之后还撤了几句堆表RID,聚集表key值啥的。 专家一开始说这两者没有关系(重建聚集索引之后不会影响到非聚集索引的索引碎片),后面被提问之后可能是有点紧张,改口说没注意过这个问题。 首先抛出结论:对于聚集索引表,重建聚集索引之后不会影响到非聚集索引的索引碎片,重建聚集索引跟非聚集索引碎片之间的没有关系,完全不搭嘎的。 这些问题,其实尝试自己测试一下不就清楚了么? 聚集索引重建之后,对非聚集索引是否有影响 首先,暂且先不扯聚集表堆表啥的了,直接说聚集表, 非聚集索引在叶级直接存储的是聚集索引的key值,在重建聚集索引(或者重组)前后,非聚集索引存储的对应的key值是不变的 重建聚集索引之后,数据的屋里存储位置可能会发生变化,这是会影响到聚集索引的物理存储和碎片情况 但是对于非聚集索引来说,非聚集索引存储的对应的聚集索引的key值是不变的, 那非聚集索引的碎片跟聚集索引的重建与否有个毛的关系。

数据库索引、优化

对着背影说爱祢 提交于 2019-11-30 05:47:16
参考地址: 如何看MS SQLSERVER数据库的执行计划https://blog.csdn.net/luoyanqing119/article/details/17022649 SQLserver索引的原理和应用 https://www.cnblogs.com/knowledgesea/p/3672099.html 聚集索引和非聚集索引 https://www.cnblogs.com/aspnethot/articles/1504082.html 数据库SQL优化大总结之 百万级数据库优化方案 https://www.cnblogs.com/yunfeifei/p/3850440.html 数据库优化之程序操作优化 https://www.cnblogs.com/AK2012/archive/2012/12/28/2012-122803.html 上图中,数据库执行一个T-SQL发生的事,了解一下数据库的构成以及功能。 执行计划:   可以缓存,存储过程/参数化查询   select * from User where id=1   select * from User where id=2   select * from User where id=@id 数据是什么?   数据库就是把东西有序放好,还能随时找到的一个工具。应用程序,有序的数据管理,数据在硬盘上(持久化,唯一的

SQLSERVER SQL性能优化

一世执手 提交于 2019-11-28 06:32:30
1.选择最有效率的表名顺序(只在基于规则的优化器中有效)      SQLSERVER 的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表,当 SQLSERVER 处理多个表时,会运用排序及合并的方式连接它们,    首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;然后扫描第二个表(FROM子句中最后第二个表);最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并    例如: 表 TAB1 16,384 条记录表 TAB2 5 条记录,选择TAB2作为基础表 (最好的方法) select count(*) from tab1,tab2 执行时间0.96秒,选择TAB2作为基础表 (不佳的方法) select count(*) from tab2,tab1 执行时间26.09秒; 如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表      例如:    EMP表描述了LOCATION表和CATEGORY表的交集    SELECT *    FROM LOCATION L,    CATEGORY C,    EMP E  

SQL语句书写技巧

我与影子孤独终老i 提交于 2019-11-26 11:28:40
SQL结构化查询字符串的改写,是实现数据库查询性能提升的最现实.最有效的手段,有时甚至是唯一的手段, 比如在不允许大幅度修改现有数据库结构的情况下。 通过优化SQL语句提高查询性能的关键是: ? 根据实际需求情况,建立合适的索引; ? 使用一切可能的方式去利用好索引,避免全表扫描; ? 尽量减少内存及数据I/O方面的开销 一. 建立索引 (一)建立"适当"的索引,是快速查询的基础。 索引( index )是除表之外另一重要的.用户定义的存储在物理介质上的数据结构。当根据索引码的值搜索数据 时,索引提供了对数据的快速访问。事实上,没有索引,数据库也能根据SELECT语句成功地检索到结果,但随 着表变得越来越大,使用"适当"的索引的效果就越来越明显。注意,在这句话中,我们用了"适当"这个词, 这是因为,如果使用索引时不认真考虑其实现过程,索引既可以提高也会破坏数据库的工作性能。 索引实际上是一种特殊的目录,SQL SERVER提供了两种索引: ? 聚集索引( clustered index ,也称聚类索引.簇集索引) 我们把这种正文内容本身就是一种按照一定规则排列的目录称为"聚集索引"。 例如: 汉语字典中按拼音查某一个字,就是使用"聚集索引",实际上,你根本用不着查目录,直接在字典正文里找, 就能很快找到需要的汉字(假设你知道发音)。 ? 非聚集索引(non clustered