数据库如何提高大数据量查询速度

2023-11-15

数据库如何提高大数据量查询速度  

 

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
5.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
6.下面的查询也将导致全表扫描:
select id from t where name like '%abc%'
若要提高效率,可以考虑全文检索。
7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为: 
select id from t where num=100*2
9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12.不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
create table #t(...)
13.很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。
17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
18.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
19.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
21.避免频繁创建和删除临时表,以减少系统表资源的消耗。
22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。
23.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。
27.与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。
28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
29.尽量避免大事务操作,提高系统并发能力。
30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

转载于:https://www.cnblogs.com/xumr/p/5502589.html

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

数据库如何提高大数据量查询速度 的相关文章

  • Vant--移动端组件库

    Vant 是一个轻量 可靠的移动端组件库 于 2017 年开源 目前 Vant 官方提供了 Vue 2 版本 Vue 3 版本和微信小程序版本 并由社区团队维护 React 版本和支付宝小程序版本 文章目录 目录 文章目录 前言 一 优势
  • 轻松玩转Windows系统自带远程桌面及如何处理“出现了内部错误““0x4““0x7“等错误提示

    现在网络上的第三方远程协助软件很多 包括向日葵 ToDesk等等 但是 如果你遇到只有内网的情况下 或者外网速很差很慢 比如学校 或者禁止连外网的单位等等 使用第三方远程协助就很卡 甚至成了摆设 这种情况下 我们就需要用到Windows系统
  • Vert.x Web模块(六)

    SockJS SockJS是一个客户端JavaScript库和协议 SockJS提供类似WebSocket的接口 此接口允许与SockJS服务器建立连接 而不论浏览器或者网络允许真实的WebSockets SockJS通过支持浏览器与服务间
  • MySQL的浮点型和定点型解析和案例演示

    小数型 1 概述 浮点型和定点型 1 浮点数类型包括单精度浮点数 float型 和双精度浮点数 double型 定点数类型就是decimal型 2 两者区别 1 浮点型 小数点移动 精度有限 而且会丢失精度 系统自动四舍五入 4个字节 最大
  • web项目怎么放到云服务器上,web项目怎么放到云服务器上

    web项目怎么放到云服务器上 内容精选 换一换 伸缩组是具有相同属性和应用场景的云服务器和伸缩策略的集合 是启停伸缩策略和进行伸缩活动的基本单位 您可以使用伸缩策略设定的条件自动增加 减少伸缩组中的实例数量 或维持伸缩组中固定的实例数量 创
  • 用MySQL语法建 一个学生表,包括学生姓名、性别、年龄、班级信息。

    1 创建表的SQL语句 create table student ID int primary key not null NAME varchar 50 sex int age int classNO in 转载于 https www cn
  • SqlServer Management Studio启用身份验证登录

    背景 一开始安装好SqlServer Management Studio时 默认只能用本地window身份验证登录 也就是除了SqlServer的电脑 别的都访问不了这个数据库 这是很不方便的 方案 1 打开SqlServer Manage
  • ubuntu安装无线网卡驱动

    摘要 在笔记本上安装ubuntu系统 安装好后是可以连接wifi的 而台式机安装ubuntu的话 特别是组装的台式机 是无法立即连wifi的 是需要安装无线网卡驱动的 如果你身边无法连网线 而又无法连接wifi 根本无法更新或者下载 所以
  • https证书申请 nginx ssl配置

    打算开发api要弄一个https的域名 于是我就搞了一个把过程记录下来 留给有用的人 分割线 我用的是阿里云的证书 现在有一个免费的不知道以后会不会一直有 就在阿里云服务里CA证书服务就可以找到 购买的时候选择自动生成证书 这样就不用自己制
  • ionic5/angular11通过修改ShadowRoot样式更改ionic UI组件原样式

    通过浏览器调试可以找到需要更改的UI组件样式 找到其CSS class类名后 通过CSS无法直接修改样式 需要使用shadowRoot appendChild 方法注入新的样式覆盖原来的样式达到修改原样式的目的 一 编写HTML
  • 农行网银登录无法显示该网页_Edge Dev新版发布:支持网页预加载以更快搜索和浏览...

    今天早些时候 微软宣布了 Edge Dev 通道的最新 85 0 531 1 版本 本次版本更新支持某些网页的预加载 可以更快地搜索和浏览 该版本中还包含了一些BUG修复和改进 下载地址 https www microsoftedgeins
  • C#DataTable转List互转

    using System using System Collections Generic using System Data using System Reflection namespace BT Preservation Models
  • 疫情期间沙雕文案

    1 希望如约而至的不至是春天 还有疫情过后平安的你 2 早知道半个月前是最后一次出门 就不应该喝一杯奶茶 3 刚刚有人约我出去过情人节 我果断拉黑删除了 非常时期骗我感情可以 但要我名不可以 4 烟花三月下扬州 愿我三月能下楼 5 疫情你走
  • postman进行post、get参数传递及中文乱码和各类型参数传递和json格式传参和日期型参数传递和响应数据传回

    postman是一种测试工具 用postman直接在其上输入参数名和参数值就行 不用区分post和get请求方法 当然java代码要改变一点 在响应注解的方法里面添加和postman中输入的参数名一样的形参 get请求 代码 注意在响应注解
  • Android 9 底部导航栏样式不正确

    1 项目预制了GMS后 底部导航栏只剩下一个返回键和唤醒Assistant的按钮 需要回到原来的导航栏来 修改方式屏蔽掉 config defaultAssistantAccessPackage 使用Android原始的config def
  • 原码、补码、反码的关系及应用场景

    是三种表示有符号整数的方法 它们之间存在一定的关系 概念 原码是最基本的表示方法 即将一个数的符号位和数值位分开表示 符号位用0表示正数 用1表示负数 例如 7的原码为00000111 7的原码为10000111 反码是在原码的基础上 将负
  • 局域网、城域网、广域网、国际互联网(internet)

    计算机网络按覆盖范围分类可分为局域网 城域网 广域网 一 局域网 1 地理分布范较小 一般为数百米至数公里 可覆盖一幢大楼 一所校园或一个企业 一个家庭 2 数据传输速率高 一般为100Mbps 目前已出现速率高达1000Mbps的局域网
  • vue3 element-plus el-form的二次封装

    form表单的二次封装 vue3 element plus el form的二次封装 属性说明 属性名 类型 默认值 说明 data Array 页面展示数据内容 onChange Function false 表单事件 bindProps
  • R语言的科学编程与仿真 chapter 4 答案

    chapter 4 Ex1 programe cha4 6 ex1 Ex1 https img blog csdn net 20151226125117523 12 25 15 author Sigua file path file age
  • java 加载oracle 驱动 19c_037、Java--JDBC技术

    1 JDBC 简介 JDBC Java DataBase Connectivity java 数据库连接 是 JavaEE 平台下的技术规范 定义了在 Java 语言中连接数据 执行 SQL 语句的标准 可以为多种关系数据库提供统一访问 数

随机推荐

  • https认证过程(TLS认证过程)

    最近在准备春招 刚好看到https 网上搜了一圈没看到满意的 于是打算自己整理一下 以下内容来源于 计算机网络 第8版 谢希仁 加上了一些自己的拙见 目前的HTTPS是使用http tls的 所以直接了解tls的认证过程即可 曾经广泛使用的
  • SAP接口 财务凭证集成_差旅费报销

    OA系统调用此接口 传输差旅费报销流程的凭证信息到SAP 生成借款类型SAP凭证 调用标准的BABI方法实现 1 首先先介绍一下实现会计凭证生成的BAPI 参考链接 2 增强操作在另一篇文章 SAP接口 财务凭证集成 借款 在此不再赘述 3
  • 最近研究xcodebuild批量打包的一些心得

    转自Rainbird的个人博客 以前的时候只知道做安卓开发的兄弟挺辛苦的 不但开发的时候要适配一堆的机型 好不容易开发完了还要打一堆不同的包给不同的市场 没想到现在这些市场都开辟iOS市场 于是需要打一堆的包给不同的市场 面对暂时给的十二个
  • +-1 RMQ

    考虑分块 令 b log 2 n
  • [SQL系列] 从头开始学PostgreSQL 分库分表

    什么是分库分表 分库分表是一种数据库架构设计的方法 用于应对大规模数据的存储和查询 当单个数据库的存储容量或查询性能无法满足需求时 可以通过将数据分散存储在多个数据库服务器上 以提高系统的可扩展性和性能 分库分表通常包括两个步骤 分库和分表
  • 【模板】AC自动机(加强版)【AC自动机fail树上求最多出现次数】

    题目链接 P3796 给出N个模式串 然后我们用一个文本串去进行匹配 这样的做法 就是AC自动机了 于是乎 我们可以先将N个模式串丢进去 然后建立fail树 然后先对所有的节点求出最大串在文本串中出现的次数 然后利用dfs跑fail树的办法
  • 工业数据存储数据库选型比较

    我们讲工业互联网 工业大数据 首先需要把数据从工业现场采集上来 这是第一步也是基础 海量的数据从工业现场采集之后存在哪里呢 使用什么样的存储方式对后面的数据分析和计算有重要影响 这里对数据库方式的存储进行了一个选型比较 当前的数据库按类型分
  • 线性滤波和卷积的概念 ,线性和非线性对比理解

    一 线性滤波与卷积的基本概念 线性滤波可以说是图像处理最基本的方法 它可以允许我们对图像进行处理 产生很多不同的效果 做法很简单 首先 我们有一个二维的滤波器矩阵 有个高大上的名字叫卷积核 和一个要处理的二维图像 然后 对于图像的每一个像素
  • python多个%s的使用方法 %格式符 使用

    直接看代码理解 usr bin python coding utf 8 a wry b zjl c xxx print a s b s c s a b c 输出 a wry b zjl c xxx 参考 格式符 格式符为真实值预留位置 并控
  • lua 中table的字符串索引和变量索引

    a x y a x 10 print a x 输出10 print a x 输出nil print a y 输出10 a x表示以字符串 x 来索引table a x 以变量x的值来索引table
  • 利用ChatGPT如何进行批量长文本处理工具GPTBAT

    大家好 我是技术宅小伙 今天要跟大家分享一下我之前写的 GPT 长文本处理程序 当时我写完后就把它放到 Hog 上了 因为最开始是为了自己用 所以后来就忘掉了 最近有同学把它翻出来用 然后经常来问我 说不知道这个东西怎么用 其实在我看来这个
  • RTX3090 与pytorch对应版本的安装问题汇总

    一 Linux查看CUDA版本以及cudnn版本号 1 查看CUDA版本 方法1 查看文件 cat usr local cuda version txt 方法2 命令 nvcc version 2 查看cudnn版本 cat usr loc
  • django 转发_为什么django既是MVC也用了MTV 框架?

    概述 前面项目已经创建好 网站也有了 所以接下来要实现网站的具体功能 在 Django 人们把这具体的功能称为 应用 application 创建应用 作用 把相同的东西提取出来比如文章的标题内容等这些相同的字段设置我们可以将他提取出来 p
  • SQL统计次月复购率

    复购率 select zry 首次购买月份 zyhs 当月新增客户数 max case when fgy zry 1 then fgyhs else null end m1 max case when fgy zry 2 then fgyh
  • js生成四个随机字母

    function getRanNum var result for var i 0 i lt 4 i var ranNum Math ceil Math random 25 生成一个0到25的数字 大写字母 A 的ASCII是65 A Z的
  • chatgpt应用知识之如何提问

    与ChatGPT实现高质量会话的关键之一是输入高效的指令和提示 以引导ChatGPT生成准确 有用的回复 以下是一些可以提高与ChatGPT沟通技巧 明确的问题 提出明确 具体的问题可以帮助ChatGPT理解您的需求 并生成更准确的回复 避
  • MAC表、ARP表、IP路由表区别比较

    作用 生成方式 组成 存在设备 MAC表 数据链路层转发 交换机根据数据帧的目的MAC地址查看MAC表 根据表项由相应接口转发出去 根据数据帧的源MAC进行学习 数据帧从那个接口进来的 就把该接口以及该帧的源MAC学习记录下来 MAC地址
  • GYM 102059 G Fascination Street

    G Fascination Street 参考 给出一串n 2e5 个灯 每个灯点亮可以照到相邻三个位置 每个灯点亮都有不同的花费 现在可以交换k 9 次灯的位置 求把所有n个位置都照到的最小花费 交换的肯定是一个亮的灯和一个灭的灯 不然是
  • python使用selenium爬取js加密的网页

    python使用selenium爬取js加密的网页 我们经常使用Python从网站上爬取我们喜欢的图片 比如从煎蛋网爬取妹子图 现在虽然煎蛋网取消了 OOXX 栏目 但是至少把名字换成了随手拍 我今天想从该网站爬取妹子图 去发现没有办法 从
  • 数据库如何提高大数据量查询速度

    数据库如何提高大数据量查询速度 1 对查询进行优化 应尽量避免全表扫描 首先应考虑在 where 及 order by 涉及的列上建立索引 2 应尽量避免在 where 子句中对字段进行 null 值判断 否则将导致引擎放弃使用索引而进行全