SQL语句提高查询性能的关键

SQL性能优化:提高数据库查询效率的方法和技巧 在开发和维护数据库应用程序时,优化SQL查询的性能是至关重要的。本文将介绍一些提高SQL查询性能的方法和技巧,并提供相应的示例代码。在开发和维护数据库应用程序时,优化SQL查询的性能是至关重要的。综上所述,通过使用索引、编写高效的查询语句、避免全表扫描、优化数据库结构以及进行性能测试和监控,可以提高SQL查询的性能和效率。综上所述,通过使用索引、编写高效的查询语句、避免全表扫描、优化数据库结构以及进行性能测试和监控,可以提高SQL查询的性能和效率。 阅读详情

SQL结构化查询字符串的改写,是实现数据库查询性能提升的最现实、最有效的手段,有时甚至是唯一的手段,比如在不允许大幅度修改现有数据库结构的情况下。

通过优化SQL语句提高查询性能的关键是:

 根据实际需求情况,建立合适的索引;

 使用一切可能的方式去利用好索引,避免全表扫描;

 尽量减少内存及数据I/O方面的开销

一、 建立索引

(一)建立“适当”的索引,是快速查询的基础。

索引(index)是除表之外另一重要的、用户定义的存储在物理介质上的数据结构。当根据索引码的值搜索数据时,索引提供了对数据的快速访问。事实上,没有索引,数据库也能根据SELECT语句成功地检索到结果,但随着表变得越来越大,使用“适当”的索引的效果就越来越明显。注意,在这句话中,我们用了“适当”这个词,这是因为,如果使用索引时不认真考虑其实现过程,索引既可以提高也会破坏数据库的工作性能。

索引实际上是一种特殊的目录,SQL SERVER提供了两种索引:

 聚集索引(clustered index,也称聚类索引、簇集索引)

我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

例如:

汉语字典中按拼音查某一个字,就是使用“聚集索引”,实际上,你根本用不着查目录,直接在字典正文里找,就能很快找到需要的汉字(假设你知道发音)。

 非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)

我们把目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

例如:

汉语字典中按部首查某一个字,部首目录和正文一定要刻意的通过页码才能联系到一起,其顺序不是天然一致的。

聚集索引与非聚集索引的最大区别就在于:聚集索引是对原数据表进行排序,因此只要符合索引条件,就能够直接连续的读取数据记录,几乎可以达到对数据表的零扫描;而非聚集索引仅仅只是另外建了一张索引表,取数据的时候,从索引表取得结果后,还需要到指针所指的数据行读取相应数据,因此,在性能上,聚集索引会大大优于非聚集索引。

  但是在一张表中,聚集索引只允许一个,是比较宝贵的,因此要尽可能的用于那些使用频率最高的索引上。 另外,查询时必需要用到索引的起始列,否则索引无效。另外,起始列也必需是使用频繁的列,那样的索引性能才会达到最优化。

(二)表:何时应使用聚集索引或非聚集索引

动作描述 使用聚集索引 使用非聚集索引

列经常被分组排序 ○ ○

返回某范围内的数据 ○

一个或极少不同值

小数目的不同值 ○

大数目的不同值 ○

频繁更新的列 ○

外键列 ○ ○

主键列 ○ ○

频繁修改索引列 ○

(三)索引建立的一些注意项

1、不要把聚集索引浪费在主键上,除非你只按主键查询

虽然SQL SERVER默认是在主键上建立聚集索引的,但实际应用中,这样做比较浪费。通常,我们会在每个表中都建立一个ID列,以区分每条数据,并且这个ID列是自动增大的,步长一般为1。此时,如果我们将这个列设为主键,SQL SERVER会将此列默认为聚集索引。这样做有好处,就是可以让您的数据在数据库中按照ID进行物理排序,但这样做实用价值不大。

从我们前面谈到的聚集索引的定义我们可以看出,使用聚集索引的最大好处就是能够根据查询要求,迅速缩小查询范围,避免全表扫描。在实际应用中,因为ID号是自动生成的,我们并不知道每条记录的ID号,所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源浪费。聚集索引相对与非聚集索引的优势是很明显的,而每个表中只能有一个聚集索引的规则,这使得聚集索引变得更加宝贵,应该用在其他查询频率高的字段上。其次,让每个ID号都不同的字段作为聚集索引也不符合“大数目的不同值情况下不应建立聚合索引”规则;当然,这种情况只是针对用户经常修改记录内容,特别是索引项的时候会负作用,但对于查询速度并没有影响。

2、索引的建立要根据实际应用需求来进行

并非是在任何字段上简单地建立索引就能提高查询速度。聚集索引建立的规则大致是“既不能绝大多数都相同,又不能只有极少数相同”。举个例子,在公文表的收发日期字段上建立聚合索引是比较合适的。在政务系统中,我们每天都会收一些文件,这些文件的发文日期将会相同,在发文日期上建立聚合索引对性能的提升应该是相当大的。在群集索引下,数据物理上按顺序存于数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。

另一个相反的例子:比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就完全没必要建立索引。

3、在聚集索引中加入所有需要提高查询速度的字段,形成复合索引

根据一些实验的结果,我们可以得出一些可供参考的结论:

 仅用复合聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询,速度是几乎一样的,甚至比后者还要快(在查询结果集数目一样的情况下);

 仅用复合聚集索引的非起始列作为查询条件的话,

这个索引是不起任何作用的。

 复合聚集索引的所有列都用上,而且因为查询条件严格,查询结果少的话,会形成“索引覆盖”,性能可以达到最优。

 最重要的一点:无论是否经常使用复合聚合索引的其他列,其起始列一定要是使用最频繁的列。

4.根据实践得出的一些其他经验,特定情况下有效

 用聚合索引比用不是聚合索引的主键速度快;

 用聚合索引比用一般的主键作order by速度快,特别是在小数据量情况;

 使用聚合索引内的时间段,搜索时间会按数据占整个数据表的百分比成比例减少,而无论聚合索引使用了多少个;

 日期列不会因为有分秒的输入而减慢查询速度;

 由于改变一个表的内容,将会引起索引的变化。频繁的insert,update,delete语句将导致系统花费较大的代价进行索引更新,引起整体性能的下降。一般来讲,在对查询性能的要求高于对数据维护性能要求时,应该尽量使用索引,否则,就要慎重考虑一下付出的代价。在某些极端情况下,可先删除索引,再对数据库表更新大量数据,最后再重建索引,新建立的索引总是比较好用。

二、 编写优化的SQL语句,充分利用索引

下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。

SQL语句在提交给数据库进行操作前,都会经过查询分析阶段,SQLSERVER内置的查询优化器会分析查询条件的的每个部分,并判断这些条件是否符合扫描参数(SARG)的标准。只有当一个查询条件符合SARG的标准,才可以通过预先设置的索引,提升查询性能。

SARG的定义:用于限制搜索操作的一种规范,通常是指一个特定的匹配,一个确定范围内的匹配或者两个以上条件的AND连接。一般形式如下:

列名 操作符 <常数 或 变量>

或

<常数 或 变量> 操作符 列名

列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:

Name=’张三’

价格>5000

5000<价格

Name=’张三’ and 价格>5000

如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是说SQL SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件,既进行全表扫描。所以,一个索引对于不满足SARG形式的表达式来说是无用的, 如:当查询条件为“价格*2 >5000”时,就无法利用建立在价格字段上的索引 。

SQLSERVER内置了查询优化器,能将一些条件自动转换为符合SARG标准,如:将“价格*2 >5000” 转换为“价格 >2500/2 ”,以达到可以使用索引的目的,但这种转化不是100%可靠的,有时会有语义上的损失,有时转化不了。如果对“查询优化器”的工作原理不是特别了解,写出的SQL语句可能不会按照您的本意进行查询。所以不能完全依赖查询优化器的优化,建议大家还是利用自己的优化知识,尽可能显式的书写出符合SARG标准的SQL语句,自行确定查询条件的构建方式,这样一方面有利于查询分析器分析最佳索引匹配顺序,另一方面也有利于今后重读代码。

介绍完SARG后,我们再结合一些实际运用中的例子来做进一步的讲解:

1、 Like语句是否属于SARG取决于使用%通配符的样式

如:name like ‘张%’ ,这就属于SARG

而:name like ‘%张’ ,就不属于SARG

通配符%在字符串首字符的使用会导致索引无法使用,虽然实际应用中很难避免这样用,但还是应该对这种现象有所了解,至少知道此种用法性能是很低下的。

2、 “非”操作符不满足SARG形式,使得索引无法使用

不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等。

下面是一个NOT子句的例子:

  ... where not (status ='valid')

  not运算符也隐式的包含在另外一些逻辑运算符中,比如<>运算符。见下例:

  ... where status <>'invalid';

  再看下面这个例子:

  select * from employee where salary<>3000;

  对这个查询,可以改写为不使用not:

  select * from employee where salary<3000 or salary>3000;

  虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许对salary列使用索引,而第一种查询则不能使用索引。

3、 函数运算不满足SARG形式,使得索引无法使用

例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:

select * from record where substring(card_no,1,4)=′5378′(13秒)

select * from record where amount/30< 1000(11秒)

select * from record where convert(char(10),date,112)=′19991201′(10秒)

分析:

where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行全表扫描,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:

select * from record where card_no like ′5378%′(< 1秒)

select * from record where amount < 1000*30(< 1秒)

select * from record where date= ′1999/12/01′ (< 1秒)

你会发现SQL明显快很多

4、 尽量不要对建立了索引的字段,作任何的直接处理

select * from employs where first_name + last_name ='beill cliton';

无法使用索引

改为:

select * from employee where

first_name = substr('beill cliton',1,instr('beill cliton',' ')-1)

and

last_name = substr('beill cliton',instr('beill cliton',' ')+1)

则可以使用索引

5、 不同类型的索引效能是不一样的,应尽可能先使用效能高的

比如:数字类型的索引查找效率高于字符串类型,定长字符串char,nchar的索引效率高于变长字符串varchar,nvarchar的索引。

应该将

where username='张三' and age>20

改进为

where age>20 and username='张三'

注意:

此处,SQL的查询分析优化功能可以做到自动重排条件顺序,但还是建议预先手工排列好。

6、 尽量不要使用 is null 与 is not null作为查询条件

  任何包含null值的列都将不会被包含在索引中,如果某列数据中存在空值,那么对该列建立索引的性能提升是值得怀疑的,尤其是将null作为查询条件的一部分时。建议一方面避免使用is null和is not null, 另一方面不要让数据库字段中存在null, 即使没有内容,也应利用缺省值,或者手动的填入一个值,如:’’ 空字符串。

7、 某些情况下IN 的作用与OR 相当 ,且都不能充分利用索引

例:表stuff有200000行,id_no上有非群集索引,请看下面这个SQL:

select count(*) from stuff where id_no in(′0′,′1′) (23秒)

where条件中的′in′在逻辑上相当于′or′,所以语法分析器会将in (′0′,′1′)转化为id_no =′0′ or id_no=′1′来执行。我们期望它会根据每个or子句分别查找,再将结果相加,这样可以利用id_no上的索引;但实际上,它却采用了"OR策略",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果。因此,实际过程没有利用id_no上索引,并且完成时间还要受tempdb数据库性能的影响。

实践证明,表的行数越多,工作表的性能就越差,当stuff有620000行时,执行时间会非常长!如果确定不同的条件不会产生大量重复值,还不如将or子句分开:

select count(*) from stuff where id_no=′0′

select count(*) from stuff where id_no=′1′

得到两个结果,再用union作一次加法合算。因为每句都使用了索引,执行时间会比较短,

select count(*) from stuff where id_no=′0′

union

select count(*) from stuff where id_no=′1′

从实践效果来看,使用union在通常情况下比用or的效率要高的多,而exist关键字和in关键字在用法上类似,性能上也类似,都会产生全表扫描,效率比较低下,根据未经验证的说法,exist可能比in要快些。

8、 使用变通的方法提高查询效率

  like关键字支持通配符匹配,但这种匹配特别耗时。例如:select * from customer where zipcode like “21_ _ _”,即使在zipcode字段上已建立了索引,在这种情况下也可能还是采用全表扫描方式。如果把语句改为:select * from customer where zipcode >“21000”,在执行查询时就会利用索引,大大提高速度。但这种变通是有限制的,不应引起业务意义上的损失,对于邮政编码而言,zipcode like “21_ _ _” 和 zipcode >“21000” 意义是完全一致的。

9、 组合索引的高效使用

假设已在date,place,amount三个字段上建立了组合索引

select count(*) from record

where date > ′19991201′ and date < ′19991214′ and amount > 2000

(< 1秒)

select date,sum(amount) from record group by date

(11秒)

select count(*) from record

where date > ′19990901′ and place in (′BJ′,′SH′)

(< 1秒)

这是一个设置较合理的组合索引。它将date作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优。如果索引不便于更改,修正SQL中的条件顺序以配合索引顺序也是可行的。

10、 order by按聚集索引列排序效率最高

排序是较耗时的操作,应尽量简化或避免对大型表进行排序,如缩小排序的列的范围,只在有索引的列上排序等等。

我们来看:(gid是主键,fariqi是聚合索引列)

select top 10000 gid,fariqi,reader,title from tgongwen

用时:196 毫秒。 扫描计数 1,逻辑读 289 次,物理读 1 次,预读 1527 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc

用时:4720毫秒。 扫描计数 1,逻辑读 41956 次,物理读 0 次,预读 1287 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

用时:4736毫秒。 扫描计数 1,逻辑读 55350 次,物理读 10 次,预读 775 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc

用时:173毫秒。 扫描计数 1,逻辑读 290 次,物理读 0 次,预读 0 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc

用时:156毫秒。 扫描计数 1,逻辑读 289 次,物理读 0 次,预读 0 次。

从以上我们可以看出,不排序的速度以及逻辑读次数都是和“order by 聚集索引列” 的速度是相当的,但这些都比“order by 非聚集索引列”的查询速度是快得多的。

同时,按照某个字段进行排序的时候,无论是正序还是倒序,速度是基本相当的。

三、 关于节省数据查询系统开销方面的措施

1、 使用TOP尽量减少取出的数据量

TOP是SQL SERVER中用来提取前几条或前某个百分比数据的关键词。

select top 20 gid,fariqi,reader,title from tgongwen order by gid desc

select top 60 percent gid,fariqi,reader,title from tgongwen order by gid desc

在实际的应用中,应该经常利用top 剔除掉不必要的数据,只保留必须的数据集合。这样不仅可以减少数据库逻辑读的次数,还能避免不必要的内存浪费,对系统性能的提升都是有好处的。

2、 字段提取要按照“需多少、提多少”的原则,避免“select *”

这个举个例子:

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

用时:4673毫秒

select top 10000 gid,fariqi,title from tgongwen order by gid desc

用时:1376毫秒

select top 10000 gid,fariqi from tgongwen order by gid desc

用时:80毫秒

由此看来,字段大小越大,数目越多,select所耗费的资源就越多,比如取int类型的字段就会比取char的快很多。我们每少提取一个字段,数据的提取速度就会有相应的提升。提升的幅度根据舍弃的字段的大小来判断。

3、 count(*) 与 count(字段) 方法比较

我们来看一些实验例子(gid为Tgongwen的主键):

select count(*) from Tgongwen

用时:1500毫秒

select count(gid) from Tgongwen

用时:1483毫秒

select count(fariqi) from Tgongwen

用时:3140毫秒

select count(title) from Tgongwen

用时:52050毫秒

从以上可以看出,用count(*)和用count(主键)的速度是相当的,而count(*)却比其他任何除主键以外的字段汇总速度要快,而且字段越长,汇总速度就越慢。如果用count(*), SQL SERVER会自动查找最小字段来汇总。当然,如果您直接写count(主键)将会来的更直接些。

4、 有嵌套查询时,尽可能在内层过滤掉数据

如果一个列同时在主查询和where子句中出现,很可能当主查询中的列值改变之后,子查询必须重新查询一次。而且查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

5、 多表关联查询时,需注意表顺序,并尽可能早的过滤掉数据

在使用Join进行多表关联查询时候,应该使用系统开销最小的方案。连接条件要充份考虑带有索引的表、行数多的表,并注意优化表顺序;说的简单一点,就是尽可能早的将之后要做关联的数据量降下来。

一般情况下,sqlserver 会对表的连接作出自动优化。例如:

select name,no from A

join B on A. id=B.id

join C on C.id=A.id

where name='wang'

尽管A表在From中先列出,然后才是B,最后才是C。但sql server可能会首先使用c表。它的选择原则是相对于该查询限制为单行或少数几行,就可以减少在其他表中查找的总数据量。绝大多数情况下,sql server 会作出最优的选择,但如果你发觉某个复杂的联结查询速度比预计的要慢,就可以使用SET FORCEPLAN语句强制sql server按照表出现顺序使用表。如上例加上:SET FORCEPLAN ON…….SET FORCEPLAN OFF 表的执行顺序将会按照你所写的顺序执行。在查询分析器中查看2种执行效率,从而选择表的连接顺序。SET FORCEPLAN的缺点是只能在存储过程中使用。

小结:

 聚集索引比较宝贵,应该用在查询频率最高的地方;

 在数据为“既不是绝大多数相同,也不是极少数相同”状态时,

最能发挥聚集索引的潜力;

 复合索引的设置和使用要注意保持顺序一致;

 条件子句的表达式最好符合SARG规范,是可利用索引的;

 任何对列的操作都导致全表扫描,如数据库函数、计算表达式等,

查询时应尽可能将操作移至等号的某一边;

 要注意含有null值时,是不能充分利用索引的;

 exist, in、or等子句常会使索引失效;

如果不产生大量重复值,可以考虑把子句拆开,再用union拼合;

 排序时应充分利用带索引的字段;

 尽可能早,快的过滤掉无用的数据,只将必须的数据带到后续的操作中去

从前面讲叙的内容可以看出,SQL语句优化的实质就是在结果正确的前提下,用分析优化器可以识别的SARG规范语句,充份利用索引,减少数据的I/O次数,尽量避免全表扫描的发生。

以上内容有些是指导性的理论原则,有些是实际摸索的经验,大家在使用时应灵活处理,根据实际情况,选择合适的方法。本文中列举的实验数据仅作比对用,不具备普遍意义。大家在实际项目中,应充分利用性能监测和分析工具(如SQLSERVER带的相关工具)来检验自己的优化效果。

此外,还有很重要的一点要提醒大家,同样复杂的数据操作,在SQLSERVER数据库级别完成的代价要远远小于在应用端用程序代码完成的代价,所以建议大家全面,深入的学习SQL语法中重要关键字的应用,如:Group By ,Having等,尽量把数据操作任务放在数据库系统中完成 。数据库应用系统的性能优化是一个复杂的过程,上述这些只是在SQL语句层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计等等,这些将在以后的文章中详细论述7!

今日指数项目之实时流数据采集【六】 实时数据采集代码 阅读详情

相关推荐

C++11并发与多线程笔记(2) 线程启动、结束,创建线程多法、join,detach

第二节 线程启动、结束,创建线程多法、join,detach 一、范例演示线程运行的开始 程序运行起来,生成一个进程,该进程所属的主线程开始自动运行;当主线程从main()函数返回,则整个进程执行完毕 主线程从main()开始执行,那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,线程也结束运行 整个进程是否执行完毕的标志是:主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了,此时如果其他子线程还没有执行完,也会被强行终止【此条有例外,以后会解释】 创建

qq_38231713的博客 1万+

Java Web实战篇-轻松提高千万级数据库查询效率

大家在刚开始搭建项目的时候可能考虑的不够全面,随着产品的推广 、业务场景的复杂和使用用户越来越多 数据会呈现快速增长。当数据达到千万级的时候 就会发现 查询速度越来越慢 用户体验也就越来越差,那怎样提升千万级数据查询效率呢?小萌简单整理了一下,希望对大家有所帮助!优化数据库设计: 数据字段类型使用varchar/nvarchar 替换 char/nchar,变长字段存储空间小,节省存储空间。在查询的

zhenghhgz的博客 5282

新卡尝鲜记:RTX 5070Ti适配PyTorch生态的实战避坑指南

本文分享了RTX 5070Ti适配PyTorch生态的实战经验。针对CUDA 12.8兼容性问题,详细介绍了安装PyTorch Nightly版本、手动编译xformers库以及寻找PyTorch3D第三方预编译包的完整流程与解决方案,帮助用户快速搭建可用的深度学习开发环境。

weixin_29094775的博客 287

12个调整SQL查询性能的方法

当企业和公司面临SQL Server的性能挑战时,他们的重点通常是应用性能调整工具和优化技术。这不仅有助于分析和使查询运行得更快,而且有助于消除性能问题,排除性能不佳的故障。 SQL查询优化基础知识 查询优化是在合理利用系统资源和性能指标的基础上,定义最有效、最优化的方式和技术,以提高查询性能的过程。查询调整的目的是找到一种方法来减少查询的响应时间,防止资源的过度消耗,并识别不良的查询性能。 在查询优化的背景下,查询处理通过分析查询的执行步骤、优化技术和其他关于查询的信息,确定如何更快地从SQL Se

daneas的专栏 911

软件各项会议评审意见模版

读梅老师主编的书,觉得评审意见模板很有参考价值和实用价值,帮梅老师安利一波,顺便记一下笔记。 《系统/子系统规格说明》评审意见模板 20XX年XX月XX日,XXX(主管机关)在XXX(会议地点)主持召开了“《XXX(产品名称)系统规格说明》评审会”。参加会议的有XXX机关,XXX院校,XXX研究所共XX名代表(名单见附件1),会议成立了评审组(名单见附件2),听取了XXX(单位)做的《XXXX报告》。经讨论质询,形成评审意见如下: 系统规格说明对系统的研制目标和范围、工作状态、运行方式以及所要满足的能力需

赵星汉同学的博客 1万+

万达电影 com.wandafilm.app headers check

万达电影 安卓逆向 抓包 逆向 check

weixin_43786514的博客 1438

常用SQL书写技巧

SQL结构化查询字符串的改写,是实现数据库查询性能提升的最现实、最有效的手段,有时甚至是唯一的手段,比如在不允许大幅度修改现有数据库结构的情况下。通过优化SQL语句提高查询性能的关键是:根据实际需求情况,建立合适的索引;使用一切可能的方式去利用好索引,避免全表扫描;尽量减少内存及数据I/O方面的开销一、建立索引(一)建立“适当”的索引,是快速查询的基础。索引(index)是除表之外另...

weixin_34195142的博客 132

动量因子在A股市场的有效性分析:量化实证研究

验证动量因子在A股市场的有效性及时间周期性分析不同时间窗口(短期/中期/长期)对动量效应的影响量化交易成本、市场流动性对动量策略收益的侵蚀程度比较A股与成熟市场(如美股)动量效应的差异特征理论框架:行为金融学解释动量效应的产生机制技术实现:Python全流程代码实现动量因子计算与回测实证分析:统计检验、风险收益指标、敏感性分析应用拓展:结合市场微观结构的策略优化方案动量因子(Momentum Factor)

2501_92132293的博客 2472

Java 面试题-1

1. OSI的7层从上到下 应用层 -表示层 -会话层 - 传输层 -网络层 - 数据链路层 - 物理层 2. 以下哪些不是 javaScript 的全局函数( C ) A. eval B. escape C. setTimeout D. parseFloat 3. rmdir和rm rmdir删除一个空文件夹 使用方式: rmdir [-p] dirNa...

liyifan687的博客 896

YOLOv11 改进 - C2PSA | C2PSA融合TSSA(Token Statistics Self-Attention)令牌统计自注意力,优化遮挡目标感知

本文介绍了Token Statistics Self-Attention(TSSA)机制,并将其集成到YOLOv11中。传统自注意力计算复杂度高,TSSA进行了范式转变,基于token统计特征实现高效注意力交互。它通过“算法展开”推导得出,以“最大编码率降低”为目标,实现特征学习。TSSA包含动态分组和低秩投影优化两步创新,具备线性复杂度。我们将TSSA代码集成到YOLOv11的C2PSA模块中。实验表明,改进后的YOLOv11在目标检测任务中表现良好,验证了TSSA机制的有效性。

魔改工程师的博客 668

基于深度学习的水质预测:多参数监测与预测

在本篇博客中,我们详细介绍了如何使用深度学习技术处理水质预测问题,包括数据集的准备与预处理、多层感知机模型的构建、模型的训练与评估以及模型优化策略。我们使用 Python 语言基于 TensorFlow 和 Keras 框架实现了模型,并给出了各种模型优化方法及对应代码。通过实践,我们可以发现深度学习技术在水质预测方面具有很好的应用潜力。在实际应用中,我们还可以根据具体问题和数据集进一步调整和优化模型,以获得更好的预测性能。

斌擎科技 1079

如何提升SQL语句的查询性能

在对数据库进行操作时,如果SQL语句书写不当,对程序的效率会造成很大影响。 提高SQL效率可以从一下几个方面入手: 1,数据库设计与规划 Primary Key字段的长度尽量小,能用small integer就不要用integer。例如对于员工数据表,如果能用员工编号做主键,就不要用身份证号码。 字符字段如果长度固定,就不要用varchar或nvarchar类型,而应该用char或nc...

weixin_30267691的博客 456

基于CNN-LSTM融合模型的环卫车动态称重算法研究:从频率感知到精准质量估计

摘要: 针对环卫车辆动态称重需求,本研究提出一种基于CNN-LSTM融合网络的频率分析方法。通过在实验室构建振动频率采集系统,获取不同载重下的结构响应数据,经MATLAB进行信号处理和特征提取后,建立频率-质量的非线性映射模型。实验表明,该算法在静态和模拟动态场景下平均绝对误差小于1.5%,显著优于传统方法,为环卫车智能化管理提供了高精度实时称重方案。 关键词: 动态称重;深度学习;频率分析;CNN-LSTM;MATLAB。

AI的内部世界的博客 374

优化SQL查询:如何写出高性能SQL语句

优化SQL查询:如何写出高性能SQL语句 1、 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 “全表扫描”方式。 可见

学而不思 3036

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

sql with as 用法_Oracle sql 语句中with....as的用法

Oracle的SQL语句中,With查询语句不是以select开头,而是以with关键字开头。 with...as语句增加了SQL 的可读性,构造子查询,结构会更加清晰。可以“一次分析,多次使用”,可以提高性能,达到“少读”的目标。 具体使用with....as.....的SQL语句举例:with sql_conc_waits as (select sql_id, substr(sql_text...

weixin_39788960的博客 403

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ZT: 提高SQL性能的措施

提高SQL性能的措施! 最后出处:http://www.ourasp.net/ 作者:石骁騑 收录于:2001年12月19日 一、问题的提出在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方

foreveryday007's BLOG 1893

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

sql语句性能提高

//<![CDATA[Sys.WebForms.PageRequestManager._initialize(AjaxHolder$scriptmanager1, document.getElementById(Form1));Sys.WebForms.PageRequestManager.getInstance()._updateControls([tAjaxHolde

gaogao0603的专栏 770

SQL语句优化

1、统一SQL语句的写法对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。  select*from dual select*From dual   其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划。所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空格都不行! 2、使用“临时表”暂存中间结果 简化SQL语

变是永远不变的...... 933

【SQLServer】查询SQLServer执行过的SQL记录

直接贴代码: SELECT TOP 1000 --创建时间 QS.creation_time, --查询语句 SUBSTRING(ST.text,(QS.statement_start_offset/2)+1, ((CASE QS.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE QS.statement_end_offset END - QS.statement_start_offset)/2) + 1 ) AS state

学习笔记 9226

SQL优化实战提升数据库查询性能的五大关键技巧

但需注意,索引并非越多越好,过多的索引会增加写操作(INSERT、UPDATE、DELETE)的开销,因为每次数据变更都需要更新相关的索引结构。当相同的查询再次被执行时,数据库可以直接返回缓存的结果,避免了重复解析、优化和执行查询的开销,极大提升了响应速度。通过分析执行计划(如使用EXPLAIN命令),可以深入了解查询的实际执行过程,发现潜在的性能瓶颈,例如是否进行了全表扫描、是否使用了正确的索引、多表连接的顺序是否合理等。通过分区,查询可以只扫描相关的数据分区,而非整个表,从而大幅提升查询性能。

wsp525的博客 391

MySQL模糊查询,按关键词匹配度排序

以字符串‘t2’为关键字,message为查询字段,提取sql语句如下: select* ,case when message like '%t2%' then (length(message)-length('t2')) end as rn from total where message like '%t2%' order by rn; 这个语句的case when 完全可以去掉,修改

contentJava的博客 1万+

MYSQL | 提高SQL性能的技巧

写SQL是开发人员的经常要面对的,考虑SQL的性能是非常重要的。通过优化SQL可以减少资源的消耗,提高数据库服务器的利用率,节约硬件成本。

devops 6116

SQL语句的MINUS,INTERSECT和UNION ALL

 SQL语句中的三个关键字:MINUS(减去),INTERSECT(交集)和UNION ALL(并集); 关于集合的概念,中学都应该学过,就不多说了.这三个关键字主要是对数据库的查询结果进行操作,正如其中文含义一样:两个查询,MINUS是从第一个查询结果减去第二个查询结果,如果有相交部分就减去相交部分;否则和第一个查询结果没有区别. INTERSECT是两个查询结果的交集,UNION

中关村村长的专栏 2万+

关于sql语句,select查询时很快,加了top + 数字之后就会很慢

在这里用到的是sqlserver 2008 r2,做了一个查询,但是发现明明只有几十条数据,select + 列名 与  select  top 100 + 列名用时却相差很多。 sql语句: SELECT  parent.classCode parentClassCode, parent.className parentClassName, inf_product_class.clas

qq_16268679的博客 2226
上一篇: web性能测试分析-工具篇
下一篇: sql查询性能调试,用SET STATISTICS IO和SET STATISTICS TIME
beichen_
博客等级 码龄19年 17粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值