索引2

2023-10-26

索引和全文索引:(索引的目的是提高性能)
-----------------
    索引提供了一种基于一列或多列的值对表的数据行进行快速访问的方法。索引提供的是表为数据
    的逻辑顺序。规划合理的索引能够减少访问所需的时间,从而大大提高数据库的性能。
    
    ---------
    索引:索引为性能带来的好处却是有代价的。带索引的表在数据库中会占据更多的空间。另外,为了
          维护索引,对数据进行插入、更新、删除操作的命令所花费的时间会更长。在设计和创建索引
          时,应确保对性能的提高程序大于在存储空间和处理资源方面的代价。
    创建索引的原则: 
         * 该列频繁用于进行搜索
         × 该列用于对数据进行排序
         
         不要使用下面的列建立索引:
            * 列中仅包含几个不同的值
            × 表中仅包含几行。为小型表创建索引可能不太划算。
          
    创建索引:(只有表的所有者才能为表创建索引0)
        语法:
      create [unique] [clustered | nonclustered] index index_name
      on table_name (column_name[,column_name]....)
      [with
            [pad_index]   
            [[,]fillfactor=x]
            [[,]drop_existing]
      ]
      
      /*
         * unique 指定任意两行都不能具有相同的索引值。
         * [clustered][nonclustered] 是不同类型的索引。
         * pad_index指定索引的中间级中的各个页上的空白空间。pad_index选项仅在指定了fillfactor
           时才有用,这是因为pad_index需要使用fillfactor指定的百分比。
         * fillfactor指定一个0到100之间的值,该值指示索引页填满的空间所占的百分比。
         * drop_existing删除任何相同名称的现有索引。
            */
            
     -----------------------
     索引类型:
        聚集索引:聚集索引确定表中数据的物理顺序。一个表只能有一个聚集索引,但该索引可以包含
                  多个列。
                  
                  每一个表都应有一个聚集索引,以加快数据检索过程。创建聚集索引时应注意以下几点: 
                     × 选择唯一值比例高的列。一般应选择主键列。
                     × 先创建聚集索引,再创建非聚集索引。
                     × 在创建聚集索引时使用fillfactor选项,以确保在插入新行时有足够的可用空间
                     × 在经常被使用联接或group by 子句的查询访问的列上创建聚集索引,一般来说,
                       这些是外键列。对order by 或group by 子句中指定的列进行索引,可以使sql
                       不必对数据进行排序,因为这些行已经排序,这样可以提高查询性能。
                     × 聚集索引不适用于频繁更改的列,因为这将导致整行移动(因为sql server必须)
                       按物理顺序保留行中的数据值)。这一点要特别注意,因为在大数据量事务处理
                       系统中数据是容易丢失的。                        
                  ------------
                  创建聚集索引:
                     create clustered 
                     index clindx_titleid on roysched(title_id)
                     
                     
                  
        非聚集索引:(指定表的逻辑顺序)
             一个表可以有多个非聚集索引,数据存储在一个位置,索引存储在另一个位置,索引中包含
             指向数据存储位置的指针。
             
             索引中的项按照索引键值的顺序存储,但表中信息顺序保持不变。非聚集索引中索引的逻辑
             顺序与各行在磁盘上的存储顺序即物理顺序并不匹配。
             
             创建非聚集索引:
                create nonclustered index nclindx_ordnum on sales(ord_num)
                
             在创建非聚集索引之前,应先了解数据是如何被访问的,可考虑将非聚集索引用于:
                × 包含大量重复值的列,如只有0或1,则大多数查询将不使用索引,因为此时表扫描
                  通常更有效。
                × 不返回大型结果集的查询
                × 返回精确匹配的查询的搜索条件(where 子句)中经常使用的列。
                × 经常需要联接和分组的决策支持系统应用程序。应联接和分组操作中使用的列上创建多个
                  非聚集索引,在任何外键列上创建一个聚集索引。
                × 在特定的查询中覆盖一个表中的所有列,这将完全消除对表或聚集索引的访问。
                
        填充因子:
            页拆分会降低性能并使表中的数据存储产生碎片:向一个已满的索引页添加某个新行时,sql
            把大约一半的行移到新页中以便为新行腾出空间,这种重组称为页拆分。
            
            使用sp_configure系统存储过程指定的服务器范围的默认填充因子,在大多数情况下都是最佳
            选择。
            
            指定一个不同于默认设置的填充因子会降低数据库的读取性能,而降低量与填充因子设置值成
            反比。例如,当填充因子的值为50%时,数据库的读取性能会降低两倍。
            
            填充因子只在创建索引时执行;索引创建后,发表中进行数据的添加、删除或更新时,不会保持
            填充因子。如果试图在数据页上保持额外的空间,则将有背于使用填充因子的本意,因为随着
            数据的输入,sql server必须在每个页上进行页拆分,以保持填充因子指定的空闲空间百分比。
            因此,如果表中的数据进行了较大的变动,添加了新数据,可以填充数据页的空闲空间。这种
            情况下,可以重新创建索引,重新指定填充因子,以重新分布数据。
            
            
       ----------------
       索引特性:
            将索引创建为唯一索引或组合索引可以进一步增强聚集索引和非聚集索引的功能。唯一索引不
            允许索引列中存在重复的值,组合索引则允许在创建索引时使用两列或更多的列。
            
            唯一索引:唯一索引可以确保索引列不包含重复的值。
                
                唯一索引示例:
         set nocount on
         use pubs
         --如果该表存在则删除
         if exists(select * from information_schema.tables 
                   where table_name='emp_pay')
             drop table emp_pay
         
         go
         use pubs
         --如果该索引存在则删除
         if exists(select name from sysindexes where name='employeeId_ind')
            drop index emp_pay.employeeID_ind
         go 
         use pubs
         go 
         --创建表
         create table emp_pay
         (
              employeeID int not null,
              base_pay money not null,
              commission decimal(2,2) not null
         )
         --插入数据
         insert emp_pay values(1,500, .10)
         insert emp_pay values(2,1000, .05)
         insert emp_pay values(3,800, .07)
         insert emp_pay values(5,1500, .03)
         insert emp_pay values(9,750, .06)
         go 
         set nocount off
         --
         create unique clustered index employeeID_ind
         on emp_pay(employeeID)
         go
         select * from emp_pay
         go  --查看索引信息
                  execute sp_helpindex emp_pay
                     
                注意:创建primary key 或unique约束会在表中指定的列上自动创建唯一索引
                
        --------------------
         组合索引:组合索引包含两个或更多为创建索引而组合在一起的列,最多可以组合16列
                   示例:
                      create unique clustered index upkcl_sales
                        on sales(stor_id,ord_num,title_id)
                
                创建组合索引的原则:
                   × 当需要频繁地将两个或多个列作为一个整体进行搜索时,可以创建组合索引。
                   × 创建组合索引时,先列出唯一性最好的列。
                   × 组合索引中列的顺序和数量会影响查询的性能。
         ----------------------------
         查看索引信息:execute sp_helpindex emp_pay
         
         -------------------------------------------------------
         使用索引:
               示例:select * from sales(index=nclindx_ordnum)
                     where ord_num='P3087a'
               注意:这样做将覆盖sql server作出的内部索引选择,确保使用指定的索引。但是
                     请注意,在多数情况下,查询优化器都能选择最佳方法来处理查询。
                     
                     
         -------------------
         删除索引:
             示例:drop index table_name.index_name
                   drop index sales.nclindx_ordnum
             注意:drop index语句不适用于primary key 或unique约束创建的索引,drop index 
                  也不能用于删除系统表的索引。
         示例
         下例删除 authors 表内名为 au_id_ind 的索引。
         
         USE pubs
         IF EXISTS (SELECT name FROM sysindexes
                  WHERE name = 'au_id_ind')
            DROP INDEX authors.au_id_ind
         GO
         
      -----------------------------------
     全文搜索:全文索引必须在基表上定义,而不能在视图、系统表或临时表上定义。
            × 能唯一标识表中各行的列(主键或候选键),而且不允许null值。
            × 索引所覆盖的一个或多个字符串列。
            
            全文索引是用于执行两个transact-sql谓词的组件,以便根据全文检索条件对行进行
            测试;
               × contains
               * freetext
            transact-sql还包含两个返回符合全文条件的行集的函数:
               × containstable
               * freetexttable
           
     -------------------------
     使用全文索引:× contains 谓词 ,contains检索总是区分大小写。
             --简单的查询
             use northwind
             go
             select Description
             from categories
             where Description like '%bean curd%'
             go
             
             --或者,使用contains
             use northwind
             go 
             select Description
             from categories
             where contains(Description,'"bean curd"')   
                   
            × freetext谓词: 使用freetext搜索包含指定字符值的单词 
              --使用freetext搜索包含指定字符值的单词
              use Northwind 
              go 
              select CategoryName
              from Categories
              where freetext (Description,'sweetest candy bread and dry meat')
              go
              --在全文检索中使用变量
              use pubs
              go 
              declare @SearchWord varchar(30)
              set @SearchWord = 'Moon'
              select pr_info from pub_info 
              where freetext(pr_info,@SearchWord)
              
------------------------
作业:1、在titles表的title_id用pub_id列上创建一个名为nclindx_titlepub的非聚集索引,请确保索引
         页留有20%的空白空间,并且删除具有相同名称的现有索引。
         
     
        
      2、titles表的notes 列上已启用了全文索引。找出其注释中含有"technology" 和“bestseller”best
         这两个词语的title.
      use pubs 
      if exists(select [name] from sysindexes where [name]='nclindx_titlepub')
         drop index titles.nclindx_titlepub
      go
      create nonclustered index nclindx_titlepub
      on titles(title_id,pub_id)
      with fillfactor = 80
      go
      ------------------使用全文索引
      use pubs
      go 
      select * from titles 
      where freetext(notes,'technology bestseller')     
     
--------------------------------------
索引与全文索引上机练习:
     create nonclustered index RegionID_index
     on Territories(RegionID)
     
     go 
     select * from Territories
     go 
     -----------------使用指定的索引进行查询
     select * from Territories(index = RegionID_index)    
     
    
  -----------------------------------
   创建全文索引:
       可以在无结构文本上建立全文索引,以便能够在文本中搜索特定的条目。可以使用企业管理器中
       的全文索引向导创建全文索引。创建后,就可以对创建了索引的表发出全文查询。
       use pubs 
       if exists(select [name] from sysindexes where [name]='nclindx_titlepub')
          drop index titles.nclindx_titlepub
       go
       create nonclustered index nclindx_titlepub
       on titles(title_id,pub_id)
       with fillfactor = 80
       go
       ------------------使用全文索引
       ------------------未建立全文索引
       use pubs
       go 
       select * from titles 
       where freetext(notes,'latest')
       where freetext(notes,'technology and bestseller')
       
       --另一种方式 ,如果是短语则用双引号括起来。
       use pubs
       go 
       select * from titles 
       where contains(notes,'"The latest"')
       -------------------------------------------------------
       create nonclustered index RegionID_index
       on Territories(RegionID)
       
       go 
       select * from Territories
       go 
       -----------------使用指定的索引进行查询
       select * from Territories(index = RegionID_index)
       
       -----------------使用全文索引注意不同的使用方式
       use Northwind
       go
       select ProductName,QuantityPerUnit 
       from Products
       where contains(QuantityPerUnit,'"bottles" or "jars"')
       -------此两种方式输出内容相同,只不过使用方法不同而已
       go
       select ProductName,QuantityPerUnit
       from Products
       where freetext(QuantityPerUnit,'bottles or jars')       
        -------------
        上机部分作业:
               一、 使用企业管理器创建全文索引并填充
               二、使用查询分析器创建聚集索引
           use pubs
           go
           if exists(select name from sysindexes where name='stor_id_ind')
              drop index discounts.stor_id_ind
           go
           create clustered index stor_id_ind 
           on discounts(stor_id)                 
           
          三、创建非聚集索引,并设置填充因子
           use pubs
           go
           if exists(select name from sysindexes where name='emp_id_nonind')
               drop index employee.emp_id_nonind
           go
           create nonclustered index emp_id_nonind
           on employee(emp_id,pub_id)
           with fillfactor=75
           
       四、查看sales表中的全部索引
           execute sp_helpindex employee
           
       五、使用全文索引
           use pubs
           go
           select * from titles 
           where contains(notes,'"recipes" or "electronic"')
           
           -----或者
           use pubs
           go
           select * from titles 
           where contains(notes,'recipes or electronic')
           
    作业:1、
             use Northwind
         go
         if exists(select name from sysindexes where name='County_nonindex')
             drop index Suppliers.County_nonindex
         go
         create nonclustered index County_nonidex
         on Suppliers(Country,city)
         with fillfactor = 50
     
          2、使用指定的索引进行查询
         select * from Suppliers(index = County_nonidex) 
         where Country= 'France' 

转载于:https://www.cnblogs.com/yigerendehaibian/archive/2012/11/07/2759456.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

索引2 的相关文章

  • 十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集

    机器学习 数据挖掘 数据集划分 训练集 验证集 测试集 Q 如何将数据集划分为测试数据集和训练数据集 A three ways 1 像sklearn一样 提供一个将数据集切分成训练集和测试集的函数 默认是把数据集的75 作为训练集 把数据集
  • 书写我的人生回忆录-这应该是给父母最好的礼物

    作为一个业余的软件开发爱好者 我又捣鼓了一个有意思的小东西 使用完全免费哈 书写我的人生回忆录 是一款软件 其中包含70个问题 涵盖了父母的个人喜好 家庭 工作 人生经历和态度等方面 通过回答这些问题 您的父母将有机会反思他们的人生 并与您
  • Faster Rcnn 代码解读之 config.py

    from future import absolute import from future import division from future import print function import os import os pat
  • unordered_map详解

    p include stdafx h include p
  • spark基本知识点之内存管理

    原地址 点击打开链接 Spark Memory Management 25 Replies Starting Apache Spark version 1 6 0 memory management model has changed Th
  • GIS项目启动时手动添加依赖

    gis项目在idea下启动前需要手动安装的包 mvn install install file DgroupId org geotools jdbc DartifactId gt jdbc oracle Dversion 18 2 Dpac
  • centOs 6.5 ssh配置无密码登入

    1 安装ssh 若没安装的话 sudo apt get install ssh 2 配置为可以免密码登陆本机 2 1查看在master用户下是否存在 ssh文件夹 ssh前面有 的是隐藏文件夹 输入命令ls a home master 我的
  • omnifocus3透视 任务分类实例详解

    目录 1任务分类 2标签 任务细化的一种属性 3任务分类实例详解 4透视 上大学之前 好巧 今天9号 高考结束 我们每周的任务数量很明确 本学期几本书的学习 复习 但是步入社会之后 参与项目数量逐渐增加 需要沟通的人也越来越复杂 每日任务不
  • 认识 ESP-IDF-v4.3+工程结构(ESP32-C3应用调整示例)

    ESP32 C3 学习测试到今天 一直在使用 ESP IDF 的框架 但是还从来没有注意过工程结构 遇到复杂一点的项目 工程结构就显得太乱了 本文就来了解下 ESP IDF 工程结构 目录 前言 一 ESP IDF工程基本框架 1 1 工程
  • 数学是成就卓越开发人员的必备技能

    本文转载至 http blog jobbole com 444 编者按 原文作者Alan Skorkin是一名软件开发人员 他在博客中分享对软件开发相关的心得 其中有很多优秀的文章 本文就是其中一篇 作者认为 成为优秀的开发人员 可以没有数
  • javaEE企业级框架ssm知识点整合【思维导图】

    ssm Spring SpringMVC Mybatis 框架是轻量级javaEE应用开发最受欢迎的一种组合框架之一 使用这种框架的项目使JavaEE架构具有高度可维护性和可扩展性 同时极大地提高了项目的开发效率 降低了开发和维护的成本 而
  • webkit和webkit2的区别

    转自 http blog csdn net shunzi 1984 article details 6196483 原文地址 https trac webkit org wiki WebKit2 webkit2为了在API层支持多进程改变了
  • Linux “/“ 分区扩容

    前言 扩容是一项很简单的工作 但是有时候因为长时间没有操作过扩容 指令会比较生疏 因此写一篇扩容的文档 方便在再次失忆的情况下能快速回忆起操作流程 逻辑卷扩容的流程 创建PV gt 扩容VG gt 扩容LV 以下是扩容的详细流程 1 查看当
  • 人工智能梯度下降的优化器SGD、Momentum、AdaGrad、Adam的数学原理以及无框架实现

    系列文章目录 人工智能 梯度下降的原理和手写实现 文章目录 系列文章目录 前言 一 梯度下降优化器是什么 二 SGD优化方法 1 SGD是什么 2 SGD的数学原理 3 SGD的实现 4 SGD的缺陷 三 Momentum优化方法 1 Mo
  • 为什么公司规定所有接口都必须加上分布式锁,你知道吗?

    上一篇文章我们聊了聊Redisson这个开源框架对Redis分布式锁的实现原理 如果有不了解的兄弟可以看一下 都2022年了 出去面试连分布式锁的源码你都不会画 今天就给大家聊一个有意思的话题 每秒上千订单场景下 如何对分布式锁的并发能力进
  • 如何通过代码获取framedebugger里面的drawcall信息

    最近想做个性能工具 用来分析当前drawcall里面的具体调用 不知道unity有没有获取数据的具体接口 不过framedebugger里面的确有相关数据 这是方案一 另外一个方案是hook 理论上应该参考下renderdoc的实现应该就可
  • 使用scrapy爬取数据

    安装scrapy 使用清华镜像 打开PyCharm 安装scrapy框架 pip install i https pypi tuna tsinghua edu cn simple scrapy 新建一个名为python scrapy的项目
  • 深入浅出图解CNN-卷积神经网络

    首先 介绍一下卷积的来源 它经常用在信号处理中 用于计算信号的延迟累积 假设一个信号发生器每个时刻t产生一个信号xt 其信息的衰减率为wk 即在k 1个时间步长后 信息为原来的wk 倍 假设w1 1 w2 1 2 w3 1 4 时刻t收到的
  • linux查找目录下的所有文件中是否含有某个字符串

    Linux查找文件内容的常用命令方法 从文件内容查找匹配指定字符串的行 grep 被查找的字符串 文件名 例子 在当前目录里第一级文件夹中寻找包含指定字符串的 in文件 grep thermcontact in 从文件内容查找与正则表达式匹
  • [论文阅读]《Database Maanagement Systems》-第六章

    第六章 QUERY BY EXAMPLE QBE 查询示例 QBE P201 P216 Example is always more efficacious than precept 身教胜于言教 榜样总是比教训更有效 precept 规则

随机推荐

  • openGL之API学习(一七三)glsl如何设置版本version和兼容性

    version 120 version 120 core version 120 compatibility version 300 es GLSL ES 提供了一个 version 指令来指定着色器使用的GLSL ES的版本 如果不指定G
  • c++ 日志输出库 spdlog 简介

    spdlog是一个开源的 快速的 仅有头文件的C 11 日志库 它提供了向流 标准输出 文件 系统日志 调试器等目标输出日志的能力 它支持的平台包括Windows Linux Mac Android iOS 官方参考 https githu
  • 后缀自动机(SAM)——黑盒使用方案

    首先讲下后缀自动机吧 会写一下部分必要的原理 其他的原理不做解释 代码未讲解的部分希望能当做黑盒来使用 既不了解具体原理但知道其性质以及如何使用 我实在是佩服发明出AC自动机 回文自动机 后缀自动机这人 前置知识 AC自动机中的Fail树
  • 如何使用Chrome浏览器模拟弱网情况

    点击谷歌浏览器图标 打开浏览器后 按下F12键 弹出开发者工具窗口 刷新网页 页面的加载速度为597ms 在开发者工具中 点击Online 在弹出的菜单中点击Slow 3G 慢速3G网络 重新加载网站 发现页面的加载速度变慢了 变成6 5s
  • openssl engine在tls中的应用

    openssl engine的实现和原理在上一篇文章 https blog csdn net liu942947766 article details 128837041 spm 1001 2014 3001 5502 openssl en
  • MATLAB随机生成m个三维坐标点,且各个坐标点之间的距离不小于n

    randi函数 randi max m n 生成均匀分布的随机整数 max生成的随机整数最大值 生成m行n列的矩阵 编写函数sampling function x y z sampling lowx upx lowy upy lowz up
  • 第五篇:进阶篇 发动机的噪声特性

    本专栏分享传统NVH知识点 从声学理论 材料声学 汽车噪声振动分析 车辆及其零部件甚至原材料的声学测试方法等多维度介绍汽车NVH 一些专用术语同时给出了中英文对照 欢迎新人 同行 爱好者一起交流 由于内容写的较为仓促 有误的地方欢迎大家批评
  • JS优化方法(使用最新的js方法)

    1 带有多个条件的if语句 将多个值放在一个数组中 然后调用数组的includes方法 longhand 直接的 if x abc x def x ghi x jkl logic 逻辑 shorthand 速记 if abc def ghi
  • 【FFmpeg】 音视频解码详细流程

    目录 一 视频解码流程 二 FFMPEG解码流程 三 FFmpeg解码函数 四 FFmpeg解码的数据结构 五 FFmpeg数据结构简介 六 FFmpeg数据结构分析 七 像素数据转换 八 FFMPEG解码 九 FFMPEG解码 视频播放
  • Donation-树形dp-建图

    题目网址 链接 int head maxn int n m cnt tot ll a maxn b maxn c maxn id maxn int fa maxn int lson maxn rson maxn struct node in
  • 用单片机C语言精确延时(定时)的方法

    用单片机C语言精确延时 定时 的方法 作者 51hei 来源 原创 点击数 更新时间 2009年09月29日 字体 大 中 小 最近在忙着单片机的项目 偶尔停下来小结了一下最近的收获 还是有不少可贵的收益的 本人在闲暇的时候对单片机C语言下
  • 显示本地openssl支持的加密算法

    在命令行中输入命令 openssl list ciper algorithms 运行后即刻显示支持的加密算法 END
  • [2022CISCN]初赛 复现

    ez usb 刚开始直接提取usb键盘流量 发现导出有问题 键盘流量 搜索8个字节长度的数据包 这里也能发现版本有2 8 1和2 10 1两种 因此猜测需要分别导出 tshark r ez usb pcapng Y usb data len
  • 16. GD32F103C8T6入门教程-adc 使用教程2-dma+连续扫描方式采集数据

    adc 使用教程2 dma 连续扫描方式采集数据 adc 的扫描模式就是把配置了规则或注入通道按照配置的顺序采集一轮 adc 的连续转换模式就是把配置了规则或注入通道按照配置的顺序采集N轮 注意 dma使用时存在一个外设映射到一个dam外设
  • css动画改变高度有过渡效果,css3-形变、过渡、动画

    一 2D形变 平移 transform translate x y 相对当前位置 向左移动x像素 像下移动y像素 transform translateX num 相对当前位置 向左移动num像素 transform translateY
  • OpenGLES从2.0到3.0的变化

    1 在着色器文件中添加 version 300 es 表明使用3 0版本 如果不添加则使用默认2 0版本 注意使用opengles3 0的API的时候必须添加 version 300 es 2 GLES 3 0中将GLES 2 0的 att
  • 两个栈来实现一个队列的C++代码

    利用两个栈来实现一个队列 这个问题很常见 最关键的是要有好的思路 至于实现 那是很简单的事情了 在本文中 也想说说自己的思路 但是 我觉得用代码来表述思路更符合我的习惯 也是我的菜 所以 仅仅给出代码 如有需要 大家可以根据代码来理解思路
  • Oracle 11g R2静默安装

    2015年1月6日 测试安装Oracle 11g R2静默安装安装 环境是vmware平台虚拟机 做个记录 CentOS 6 5 x64安装Oracle 11g R2 一 下载地址 http www oracle com technetwo
  • Java实现将数字转换成中文大写

    程序功能 支持将仟亿数字转换成中文数字表示 如 110 12 转换成壹佰壹拾元壹角贰分 算法思路 将数字 分成整数部分和小数部分 小数部分四舍五入到两位 分别进行转换 然后将转换后的结果合并后 生成最终结果 转换过程关键怎么处理中间的零 以
  • 索引2

    索引和全文索引 索引的目的是提高性能 索引提供了一种基于一列或多列的值对表的数据行进行快速访问的方法 索引提供的是表为数据 的逻辑顺序 规划合理的索引能够减少访问所需的时间 从而大大提高数据库的性能 索引 索引为性能带来的好处却是有代价的