在SQL Server中,我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild)的时间? 最后一次索引重组(INDEX REORGANIZE)的时间呢?  答案是我们无法准确的找到索引的创建时间.最后一次索引重组时间,最后一次索引重建的时间. 其实就目前SQL Server的各个版本而言,还没有一个系统表或DMV视图有保存索引创建的时间,索引重建的时间.索引重组的时间.但是有些方法可以间接得到最后一次索引重建的时间,但是这个值有时候往往不是准确的(有时候是准确的,有时候是不准…
SQL Server 2005 中的分区表和索引 SQL Server 2005          69(共 83)对本文的评价是有帮助 - 评价此主题   发布日期 : 3/24/2005 | 更新日期 : 3/24/2005 Kimberly L. Tripp SQLskills.com 的创始人 适用于: SQL Server 2005 摘要:SQL Server 2005 中基于表的分区功能为简化分区表的创建和维护过程提供了灵活性和更好的性能.追溯从逻辑分区表和手动分区表的功能到最新分区…
前言 索引是关系数据库中最重要的对象之中的一个,他能显著降低磁盘I/O及逻辑读取的消耗,并以此来提升 SELECT 语句的查找性能.但它是一把双刃剑.使用不当反而会影响性能:他须要额外的空间来存放这些索引信息.而且当数据更新时须要一些额外开销来保持索引的同步. 形象的来说索引就像字典里的文件夹,你要查找某一个字的时候能够依据它的比划/拼音先在文件夹中找到相应的页码范围,然后在该范围中找到这个字.假设没有这个文件夹(索引),你可能须要翻遍整本字典来找到要找的字. SQL Server 中的索引以…
作者 Jonathan Allen,译者 谢丽 SQL Server 2016的一项新特性是可以在“内存优化表(Memory Optimized Table)”上添加“列存储索引(Columnstore Index)”.要理解这是什么意思,我们应该首先解释术语列存储索引和内存优化表.列存储索引是一种按照列而不是行组织数据的索引.每个数据块只存储一个列的数据,最多包含100万行.因此,如果数据为5列1000万行,那么就需要存储在50个数据块中.当只查询部分列时,这种数据组织策略特别有效,因为数据库…
Columnstored index是SQL Server 2012后加入的重大特性,数据不再以heap或者B Tree的形式存储(row level)存储在每一个数据库文件的页里面,而是以列为单位存储.加上本身数据在存储到磁盘的时候是经过压缩算法压缩过后存储的,对于存储空间有很大的节省.各个特点非常适合数据库仓库型数据库,尤其是星状结构的设计(Dimension + Fact). 各个版本的特点和差异: SQL Server 2014 1)聚集列存储索引,可更新,但是不能再创建其他的索引 2)…
我们先在SQL Server数据库中,建立一张Students表: CREATE TABLE [dbo].[Students]( ,) NOT NULL, ) NULL, ) NULL, [Age] [int] NULL, ) NULL, CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = O…
SQL Server日常维护常用的一些脚本整理. 1.sql server开启clr权限: GO RECONFIGURE GO ALTER DATABASE HWMESTC SET TRUSTWORTHY ON ALTER AUTHORIZATION ON Database::HWMESTC TO sa; 2.查询数据库大小 Exec sp_spaceused . from dbo.sysfiles 3.数据库日志压缩 --选择需要使用的数据库 USE PIMS --将数据库模式设置为SIMPL…
概述 SQL Server 2014被号称是微软数据库的一个革命性版本,其性能的提升的幅度是有史以来之最. 可更新的列存储索引作为SQL Server 2014的一个关键功能之一,在提升数据库的查询性能方面贡献非常突出.据微软统计,在面向OLAP查询统计类系统中,相比其他SQL传统版本的数据库,报表查询的性能最大可提升上十倍. 下面我们从存储的角度来了解下SQL Server 2014的可更新列存储索引. 什么是列存储 微软为了提升SQL Server的查询性能,更好的支持大数据分析,早在SQL…
当我们进行SQL Server问题处理的时候,有时候会发现一个很有意思的现象:SQL Server完全忽略现有定义好的非聚集索引,直接使用表扫描来获取数据.我们来看看下面的表和索引定义: CREATE TABLE Customers ( CustomerID INT NOT NULL, CustomerName ) NOT NULL, CustomerAddress ) NOT NULL, Comments ) NOT NULL, Value INT NOT NULL ) GO CREATE U…
前言 上几篇文章我们介绍了如何查看查询计划.常用运算符的介绍.并行运算的方式,有兴趣的可以点击查看. 本篇将分析在SQL Server中,如何利用先有索引项进行查询性能优化,通过了解这些索引项的应用方式可以指导我们如何建立索引.调整我们的查询语句,达到性能优化的目的. 闲言少叙,进入本篇的正题. 技术准备 基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 简介 所谓的索引应用就是在我们日常写的T-SQL语句中,如何利用现有的索引项,再分析的话…
前言 上几篇文章我们介绍了如何查看查询计划.常用运算符的介绍.并行运算的方式,有兴趣的可以点击查看. 本篇将分析在SQL Server中,如何利用先有索引项进行查询性能优化,通过了解这些索引项的应用方式可以指导我们如何建立索引.调整我们的查询语句,达到性能优化的目的. 闲言少叙,进入本篇的正题. 技术准备 基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 简介 所谓的索引应用就是在我们日常写的T-SQL语句中,如何利用现有的索引项,再分析的话…
1.索引碎片的产生? 由于在表里大量的插入.修改.删除操作而使索引页分裂.如果索引有了高的碎片,有两种情况,一种情况是扫描索引需要花费很多的时间,另一种情况是在查询的时候索引根本不使用索引,都会导致性能降低. 2.碎片类型分为: 2.1 内部破碎 由于索引页里的数据插入或修改操作而发生,以数据作为稀疏矩阵的形式的分布而结束,这将导致数据页的增加,从而增加查询时间. 2.2外部破碎 由于索引/数据页的数据插入或修改而发生,以页码分离和在文件系统里不连贯的新的索引页的分配而结束,数据库服务器不能利用…
在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index Scan))呢?是否所有情况都是如此?又该如何优化呢? 下面我们通过一些简单的例子来分析理解这些现象.下面的实验环境为SQL SERVER 2008,如果在不同版本有所区别,欢迎指正.   堆表单索引 首先我们构建我们测试需要实验环境,具体情况如下所示: DROP TABLE TEST    CRE…
今天在读<Oracle高级SQL编程>这本书的时候,在关于Oracle的全局索引的章节里面有一段讲到如果对一张分区表创建一条唯一索引,而索引本身也是分区的,那就必须把分区列也加入到索引列表中去,当然不一定要再第一列.后来自己就去SQL Server上也试了一下.果真和Oracle一样的道理.再看到后面章节算是理解了.因为如果表被分区了,其实就是每个分区等于一个索引树了.这也就是为什么在SQL Server下这张sys.partitions系统视图中每个partition对应了一个hobt_id…
一. 外部碎片和内部碎片的概念 碎片的概念和检测,参考MSDN:https://msdn.microsoft.com/zh-cn/library/ms189858.aspx 二.对于碎片的解决办法 解决办法都是基于对索引的重建和整理,只是方式不同 1.删除索引并重建        这种方式并不好.在删除索引期间,索引不可用.会导致阻塞发生.而对于删除聚集索引,则会导致对应的非聚集索引重建两次(删除时重建,建立时再重建).虽然这种方法并不好,但是对于索引的整理最为有效     2.使用DROP_E…
在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index Scan))呢?是否所有情况都是如此?又该如何优化呢? 下面我们通过一些简单的例子来分析理解这些现象.下面的实验环境为SQL SERVER 2008,如果在不同版本有所区别,欢迎指正. 堆表单索引 首先我们构建我们测试需要实验环境,具体情况如下所示: DROP TABLE TEST )); CREA…
背景 在第一篇中我介绍了如何访问元数据,元数据为什么在数据库里面,以及如何使用元数据.介绍了如何查出各种数据库对象的在数据库里面的名字.第二篇,我选择了触发器的主题,因为它是一个能提供很好例子的数据库对象,并且在这个对象中能够提出问题和解决问题. 本篇我将会介绍元数据中的索引,不仅仅是因为它们本身很重要,更重要的是它们是很好的元数据类型,比如列或者分布统计,这些不是元数据中的对象. 索引对于任何关系数据库表都是必不可少的.然而,就像吐司上的黄油一样,过度使用它们可能会在数据库中产生问题.有时,可…
前言: 由于新型冠状病毒影响,博主(zhang502219048)在2020年1月份从广东广州工作地回到广东揭阳产业转移工业园磐东街道(镇里有阳美亚洲玉都.五金之乡,素以“金玉”闻名)老家后,还没过去广州现场复工,年后又延迟复工 + 居家办公,并且在老家对原来房子进行简单装修,1月份到3月份没时间去写下博文.今天就来对居家办公期间摸索到的一个数据库编程技巧进行整理并分享给大家. 问题场景: 在大批量删除数据库表部分数据.archive数据的时候,如果数据库表的非聚集索引比较多比较大,会严重影响删…
方法:1 sys.indexes index_id =0:堆 index_id =1:聚集索引 index_id =2.....:非聚集索引 ------------------------------------------------------------------------------------- 例子: create table Student(ID int not null,Name nvarchar(16),Major nvarchar(16));go create inde…
首先我们一下,在SQL Server 2014 Management Studio中,如何为一张表设置Non-Clustered index 具体可以参考  https://docs.microsoft.com/en-us/sql/relational-databases/indexes/create-unique-indexes 在SQL Server Management Studio中,点击表,右键选择"Design". 然后在菜单栏中选择"Table Designer…
对于有聚集索引的表,数据存储在聚集索引的叶子节点,而非聚集索引则存储 索引键值 和 聚集索引键值.对于非聚集索引,如果查找的字段没有包含在索引键值,则还要根据聚集索引键值来查找详细数据,此谓 Bookmark Lookup. 解决办法?可以用包含列.…
ADO.NET 在发送SQL语句到SQL Server数据库后,怎么知道真正INSERT,UPDATE,DELETE了多少行数据呢? 使用SQL Server内置的全局变量@@ROWCOUNT即可,@@ROWCOUNT可以返回在当前数据库连接(SqlConnection)中,执行的上一条SQL语句影响了多少行数据,使用示例如下所示: INSERT INTO [dbo].[Person]([PersonCode],[Name],[Age],[City]) VALUES (N,N'Beijing')…
WITH AS短语,也叫做子查询部分(subquery factoring),在SQL Server 2005中提供了一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性,同时,CTE要比表变量的效率高得多. 下面是CTE的语法: [ WITH <common_table_expression> [ ,n ] ] <common_table_expression>::= expression_name [ ( column_name [ ,n ] )…
insert into Tb_People(uname,era,amount) values( '兆周','老年','10000') select @@identity --当运行完插入语句后,执行select @@identity就可得到自动生成的id --如果是sql server 最好用select SCOPE_IDENTITY() as id --因为@@identity全局的 select SCOPE_IDENTITY() as id select IDENT_CURRENT ('Tb…
<single_partition_rebuild_index_option> ::= {     SORT_IN_TEMPDB = { ON | OFF }   | MAXDOP = max_degree_of_parallelism   | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE} }   | ONLINE = { ON [ ( <low_priority_lock_wait…
解决方案: sys.indexs; ---------------------------------------------------------------------------------------------------------------------------------- 前期准备: 建表. create table T(X int primary key,Y int);                  go 建索引                  create in…
--查询表或数据库中的所有外键 select A.name as 约束名, object_name(b.parent_object_id) as 外健表, c.name as 外键列, object_name(b.referenced_object_id) as 主健表, D.name as 主键列 from sys.foreign_keys A inner join sys.foreign_key_columns B on A.object_id=b.constraint_object_id…
WITH tmp AS ( SELECT indexname = a.name , tablename = c.name , indexcolumns = d.name , a.indid FROM sysindexes a JOIN sysindexkeys b ON a.id = b.id AND a.indid = b.indid JOIN sysobjects c ON b.id = c.id JOIN syscolumns d ON b.id = d.id AND b.colid =…
sqlserver索引的维护 1:查看索引碎片大于百分三十以上的索引 select object_id= object_id,indexid = index_id,partitionnum = partition_number,frag= avg_fragmentation_in_percent into #work_to_do from sys.dm_db_index_physical_stats(db_id(), null, null , null, 'LIMITED') --dm_ph_s…
查询当前正在执行的语句: SELECT der.[session_id],der.[blocking_session_id], sp.lastwaittype,sp.hostname,sp.program_name,sp.loginame, der.[start_time] AS '开始时间', der.[status] AS '状态', dest.[text] AS 'sql语句', DB_NAME(der.[database_id]) AS '数据库名', der.[wait_type] A…