如果每秒对MSSQL进行20万次查询,会咋样?

如果每秒对MSSQL进行20万次查询,会咋样?,第1张

建议你用set statistics time on

set statistics io on

这两条语句先看一下你编写的sql的逻辑读之类的,优化一下sql语句,尽量把多次查询变成一个查询,比如通过update,insert。where,group by之类的语句

另外如果必须每秒20万次查询,且每次查询的逻辑读都在1000以上,物理读都大于2的话,基本上 *** 作不能成功的,只会影响前几条记录。不过数据库不会挂掉,也不会损坏数据结构

另外写程序不如用sql的作业,写存储过程的方式效率高

1. 保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分开的 *** 作尽量分开处理,提高每次的响应速度;、使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;在查询时,不要过多地使用通配符,而且要用到几列就选择几列,如:

SELECT C1,C2 FROM T1;

在可能的情况下尽量限制尽量结果集行数,如:

SELECT TOP 300 C1,C2FROM T1,因为某些情况下用户是不需要那么多的数据的, 避免用!=或<>ISNULL或IS NOT NULL、IN ,NOT IN等这样的 *** 作符,因为这会使系统无法使用索引,而只能直接搜索表中的数据。例如:

SELECT C1 FROM T1 WHERE C1 != 'B%'

2. 合理使用EXISTS,NOT EXISTS子句。如下所示:

1)SELECT SUM(T1.C1)FROM T1 WHERE((SELECTCOUNT(1)FROM T2 WHERE T2.C2=T1.C2)>0)

2)SELECT SUM(T1.C1) FROM T1 WHERE EXISTS( SELECT 1 FROM T2 WHERET2.C2=T1.C2)两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。如果你想校验表里是否存在某条纪录,不要用count(*)那样效率很低,而且浪费服务器资源。可以用EXISTS代替。如:

IF (SELECT COUNT(1) FROM table_name WHEREcolumn_name = 'xxx')>0

可以写成:

IF EXISTS (SELECT 1 FROM table_name WHEREcolumn_name = 'xxx')

3. 经常需要写一个T_SQL语句比较一个父结果集和子结果集,从而找到是否存在在父结果集中有而在子结果集中没有的记录,如:

1) SELECTa.C1 FROM T1 a

WHERE NOT EXISTS (SELECT 1 FROM T2 b WHERE a.C1= b.C1)

2) SELECT a.C1 FROM T1 a

LEFT JOIN T2 b ON a.C1 = b.C1 WHERE b.C1IS NULL

3) SELECT a.C1 FROM T1 a

WHERE a.C1 NOT IN (SELECT C1 FROM T2)

三种写法都可以得到同样正确的结果,但是效率依次降低。

4. 能够用BETWEEN的就不要用IN

SELECT * FROM T1 WHERE ID IN (10,11,12,13,14)

改成:

SELECT* FROM T1 WHERE ID BETWEEN 10 AND 14

因为IN会使系统无法使用索引,而只能直接搜索表中的数据。

1. SQL优化的原则是:将一次 *** 作需要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量。

调整不良SQL通常可以从以下几点切入:

? 检查不良的SQL,考虑其写法是否还有可优化内容

? 检查子查询 考虑SQL子查询是否可以用简单连接的方式进行重新书写

? 检查优化索引的使用

? 考虑数据库的优化器

2. 避免出现SELECT * FROM table 语句,要明确查出的字段。

3. 在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。

4. 查询时尽可能使用索引覆盖。即对SELECT的字段建立复合索引,这样查询时只进行索引扫描,不读取数据块。

5. 在判断有无符合条件的记录时建议不要用SELECT COUNT (*)和select top 1 语句。

6. 使用内层限定原则,在拼写SQL语句时,将查询条件分解、分类,并尽量在SQL语句的最里层进行限定,以减少数据的处理量。

7. 应绝对避免在order by子句中使用表达式。

8. 如果需要从关联表读数据,关联的表一般不要超过7个。

9. 小心使用 IN 和 OR,需要注意In集合中的数据量。建议集合中的数据不超过200个。

10. <>用 <、 >代替,>用>=代替,<用<=代替,这样可以有效的利用索引。

11. 在查询时尽量减少对多余数据的读取包括多余的列与多余的行。

12. 对于复合索引要注意,例如在建立复合索引时列的顺序是F1,F2,F3,则在where或order by子句中这些字段出现的顺序要与建立索引时的字段顺序一致,且必须包含第一列。只能是F1或F1,F2或F1,F2,F3。否则不会用到该索引。

13. 多表关联查询时,写法必须遵循以下原则,这样做有利于建立索引,提高查询效率。格式如下select sum(table1.je) from table1 table1, table2 table2, table3 table3 where (table1的等值条件(=)) and (table1的非等值条件) and (table2与table1的关联条件) and (table2的等值条件) and (table2的非等值条件) and (table3与table2的关联条件) and (table3的等值条件) and (table3的非等值条件)。

注:关于多表查询时from 后面表的出现顺序对效率的影响还有待研究。

14. 子查询问题。对于能用连接方式或者视图方式实现的功能,不要用子查询。例如:select name from customer where customer_id in ( select customer_id from order where money>1000)。应该用如下语句代替:select name from customer inner join order on customer.customer_id=order.customer_id where order.money>100。

15. 在WHERE 子句中,避免对列的四则运算,特别是where 条件的左边,严禁使用运算与函数对列进行处理。比如有些地方 substring 可以用like代替。

16. 如果在语句中有not in(in) *** 作,应考虑用not exists(exists)来重写,最好的办法是使用外连接实现。

17. 对一个业务过程的处理,应该使事物的开始与结束之间的时间间隔越短越好,原则上做到数据库的读 *** 作在前面完成,数据库写 *** 作在后面完成,避免交叉。

18. 请小心不要对过多的列使用列函数和order by,group by等,谨慎使用disti软件开发t。

19. 用union all 代替 union,数据库执行union *** 作,首先先分别执行union两端的查询,将其放在临时表中,然后在对其进行排序,过滤重复的记录。

当已知的业务逻辑决定query A和query B中不会有重复记录时,应该用union all代替union,以提高查询效率。

数据更新的效率

1. 在一个事物中,对同一个表的多个insert语句应该集中在一起执行。

2. 在一个业务过程中,尽量的使insert,update,delete语句在业务结束前执行,以减少死锁的可能性。

数据库物理规划的效率

为了避免I/O的冲突,我们在设计数据库物理规划时应该遵循几条基本的原则(以ORACLE举例):

?? table和index分离:table和index应该分别放在不同的tablespace中。

?? Rollback Segment的分离:Rollback Segment应该放在独立的Tablespace中。

?? System Tablespace的分离:System Tablespace中不允许放置任何用户的object。(mssql中primary filegroup中不允许放置任何用户的object)

?? Temp Tablesace的分离:建立单独的Temp Tablespace,并为每个user指定default Temp Tablespace

??避免碎片:但segment中出现大量的碎片时,会导致读数据时需要访问的block数量的增加。对经常发生DML *** 作的segemeng来说,碎片是不能完全避免的。所以,我们应该将经常做DML *** 作的表和很少发生变化的表分离在不同的Tablespace中。

当我们遵循了以上原则后,仍然发现有I/O冲突存在,我们可以用数据分离的方法来解决。

?? 连接Table的分离:在实际应用中经常做连接查询的Table,可以将其分离在不同的Taclespace中,以减少I/O冲突。

?? 使用分区:对数据量很大的Table和Index使用分区,放在不同的Tablespace中。

在实际的物理存储中,建议使用RAID。日志文件应放在单独的磁盘中。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10001759.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存