- 浏览: 242617 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
wfzhanga:
不错, 存一下
DruidDataSource配置 -
peiyicong_:
...
☆误删除数据后快速恢复☆ -
peiyicong_:
...
spring ioc 解析 -
zhaozhihang:
代码,第十四行,有语法错误。
List,Set,Map用法以及区别 -
大头成为火影:
...
List,Set,Map用法以及区别
表设计和查询的一些参考
1.合理使用索引
索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:
●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。
●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。
● 使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而 使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量 数据后,删除并重建索引可以提高查询速度。
2.避免或简化排序
应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:
●索引中不包括一个或几个待排序的列;
●group by或order by子句中列的次序与索引的次序不一样;
●排序的列来自不同的表。
为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
3.消除对大型表行数据的顺序存取
在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层 的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓 名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。
还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
这样就能利用索引路径处理查询。
4.避免相关子查询
一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
5.避免困难的正规表达式
MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”
即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。
另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。
6.使用临时表加速查询
把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>“98000”
ORDER BY cust.name
如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name
INTO TEMP cust_with_balance
然后以下面的方式在临时表中查询:
SELECT * FROM cust_with_balance
WHERE postcode>“98000”
临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。
注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。
7.用排序来取代非顺序存取
非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。
有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。
--------------------------------
1。表里面存在多个类型的数据,是把表拆开,每个类型一张表,还是就放在一个表里,拆开以后可以分流数据量,但是会导致查询和统计的处理困难。
答:对于含有图象数据类型的表还是另设一张表专门用来存储图象比较好.
对于图象表:
a:用这张表可以专门用来存储图片.
b:如果把图象字段放在大表里,那么会给管理和编程带来很大的麻烦,如果图象被存储在大表中,一旦由于图象出现某些错误,那么将会影响整张数据表,那是很危险和很不明智的。
c:这样也方便以后对各个表的维护。(有的表只维护文本数据,有的表只维护图象数据)
2。数据库在维护这样大数据量的单表时需要注意什么?(暂时不考虑什么数据库)
答:利用磁盘的条带化,将你的整张大表放在多个 物理磁盘上,可以充分的利用计算机的并行操作来提高系统的性能.(利用RAID5可以实现,还有很好的容错功能).要创建好对于你的查寻有利的索引,对于 经常更新的表创建索引时要慎重考虑.太多的索引会影响数据库的更新性能.在创建索引时必须设置好填充因子,这样可以避免在对数据表更新时对表中数据页的拆 分,减少对系统资源的耗费.将你的数据库设置成自动创建统计信息和自动更新统计信息,让优化器有最新的统计可以利用来提高系统的查询性能.如果表太大要定 期的对表进行维护和检查(包括物理上和逻辑上的).及时做好对数据的备份.
3。如果要建一个表保存历史数据,那么历史数据表和当前的数据表应该怎么组织,才能最好的实现数据的一致和便于查询统计?(现在考虑只在这个单表里面保存大概两个月的数据)
现在只是初步有了这几个考虑,以前设计数据库的时候也没有考虑那么多,希望能够借鉴一下大家的经验!
答:保存历史数据的表结构最好和当前的表结构一致,才能最好的实现数据的一致和便于查询统计,对于历史记录可以设置成只读的,可以尽量多的创建对你的查询有意义的索引.
在你大批量的将数据从当前表导入到历史表中时,可以先将索引删除,完成导入以后再重建.在导入前可以将数据库的恢复模型改为大容量型的,可以提高系统的导入速度,不过他的安全性会降低.
如果你的内存足够大,那么可以将你的经常用于查询的热表锁定在高速缓存当中,这样可以避免IO操作,减小瓶颈.大大的提高系统的查询性能.
注意:对于where column='%条件%'这样的查询条件,优化器是利用不上索引的,对于这样的模糊查询最好应用全文索引.
1.合理使用索引
索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:
●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。
●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。
● 使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而 使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量 数据后,删除并重建索引可以提高查询速度。
2.避免或简化排序
应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:
●索引中不包括一个或几个待排序的列;
●group by或order by子句中列的次序与索引的次序不一样;
●排序的列来自不同的表。
为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
3.消除对大型表行数据的顺序存取
在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层 的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓 名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。
还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
这样就能利用索引路径处理查询。
4.避免相关子查询
一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
5.避免困难的正规表达式
MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”
即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。
另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。
6.使用临时表加速查询
把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>“98000”
ORDER BY cust.name
如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name
INTO TEMP cust_with_balance
然后以下面的方式在临时表中查询:
SELECT * FROM cust_with_balance
WHERE postcode>“98000”
临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。
注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。
7.用排序来取代非顺序存取
非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。
有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。
--------------------------------
1。表里面存在多个类型的数据,是把表拆开,每个类型一张表,还是就放在一个表里,拆开以后可以分流数据量,但是会导致查询和统计的处理困难。
答:对于含有图象数据类型的表还是另设一张表专门用来存储图象比较好.
对于图象表:
a:用这张表可以专门用来存储图片.
b:如果把图象字段放在大表里,那么会给管理和编程带来很大的麻烦,如果图象被存储在大表中,一旦由于图象出现某些错误,那么将会影响整张数据表,那是很危险和很不明智的。
c:这样也方便以后对各个表的维护。(有的表只维护文本数据,有的表只维护图象数据)
2。数据库在维护这样大数据量的单表时需要注意什么?(暂时不考虑什么数据库)
答:利用磁盘的条带化,将你的整张大表放在多个 物理磁盘上,可以充分的利用计算机的并行操作来提高系统的性能.(利用RAID5可以实现,还有很好的容错功能).要创建好对于你的查寻有利的索引,对于 经常更新的表创建索引时要慎重考虑.太多的索引会影响数据库的更新性能.在创建索引时必须设置好填充因子,这样可以避免在对数据表更新时对表中数据页的拆 分,减少对系统资源的耗费.将你的数据库设置成自动创建统计信息和自动更新统计信息,让优化器有最新的统计可以利用来提高系统的查询性能.如果表太大要定 期的对表进行维护和检查(包括物理上和逻辑上的).及时做好对数据的备份.
3。如果要建一个表保存历史数据,那么历史数据表和当前的数据表应该怎么组织,才能最好的实现数据的一致和便于查询统计?(现在考虑只在这个单表里面保存大概两个月的数据)
现在只是初步有了这几个考虑,以前设计数据库的时候也没有考虑那么多,希望能够借鉴一下大家的经验!
答:保存历史数据的表结构最好和当前的表结构一致,才能最好的实现数据的一致和便于查询统计,对于历史记录可以设置成只读的,可以尽量多的创建对你的查询有意义的索引.
在你大批量的将数据从当前表导入到历史表中时,可以先将索引删除,完成导入以后再重建.在导入前可以将数据库的恢复模型改为大容量型的,可以提高系统的导入速度,不过他的安全性会降低.
如果你的内存足够大,那么可以将你的经常用于查询的热表锁定在高速缓存当中,这样可以避免IO操作,减小瓶颈.大大的提高系统的查询性能.
注意:对于where column='%条件%'这样的查询条件,优化器是利用不上索引的,对于这样的模糊查询最好应用全文索引.
发表评论
-
oracel 10g数据库部分表的导入导出
2012-07-17 13:41 1767问题起因:在一次导回数据库的时候发现数据库过大,导回比较 ... -
mysql新建用户
2013-05-16 18:18 8951.1.新建用户。 2. 3.//登录M ... -
关于mysql的命令语句执行mysql的脚本文件
2012-07-06 14:29 1139要用source命令 mysql> source ... -
mysql 字符集修改
2012-07-06 14:29 929修改mysql的默认字符集是通过修改它的配置文件来实现的 ... -
☆误删除数据后快速恢复☆
2012-07-06 14:25 1158--可能很多人有误操 ... -
sql之left join、right join、inner join full join,union,union all的区别
2011-10-11 14:35 2128left join(左联接) 返回包 ... -
数据库三范式实例
2011-10-08 12:42 1611第一范式:消除组中的重复,也就是说列中是否存储了其他列中的信息 ... -
exp/imp数据库备份与恢复
2013-03-07 10:21 1110开始--》运行--》cmd --》右键 粘贴<br&g ... -
exp/imp数据库备份与恢复
2011-09-30 10:41 984开始--》运行--》cmd --》右键 粘贴 C:\Doc ... -
ORACLE系统表大全
2011-09-30 10:29 842数据字典dict总是属于Oracle用户sys的。 1、 ... -
oracle优先深度查询
2011-09-30 10:18 1243--查询3204菜单下面所有的子菜单以及子菜单下面包含的子 ... -
oracel常用导入导出方法
2011-09-30 10:18 1474下面介绍的是导入导出的实例。 数据导出: 1 将数据库T ... -
oracle数据类型
2011-09-30 10:16 978oracle教程:ORACLE中的各种数据类型详细的介绍 [ ... -
TNS-12518: TNS: 监听程序无法分发客户机连接
2011-09-29 16:04 2703TNS-12518: TNS: 监听程序无法分发客户机连接 ... -
oracle性能awr报告
2011-09-29 12:57 7974首先说一下什么是awr报 ... -
Sqlplus的使用
2011-09-29 12:55 1707转载自: http://blog.csd ... -
Oracle中expdp和impdp方法总结
2010-11-16 19:22 16741.expdp 导出数据库方法 ... -
ORA-01654: Unable to extend index %s.%s by %s in tablespace %s
2010-10-11 15:44 2409ORA-01654 ORACLE表空间满了的处理办法 ... -
ORA-12154: TNS: 无法解析指定的连接标识符
2010-10-11 15:39 3978问题======================== ...
相关推荐
SQL Server 数据自动生成SQL语句是一项实用的功能,它极大地简化了数据迁移或备份的过程。这个功能使得用户能够快速地根据数据库中的表结构和已有数据,生成相应的SQL插入语句,以便将这些数据移植到其他数据库系统...
标题“sqlserver数据统计一”指向的是一个关于SQL Server数据库管理系统中的数据统计主题。SQL Server是微软公司开发的关系型数据库系统,广泛应用于企业级数据存储和管理。在数据统计方面,它提供了强大的查询和...
本压缩包“用Excel操作SQLServer数据.zip”很显然是关于如何在Excel中连接并操作SQL Server数据库的教程或指南。以下将详细阐述这个主题中的关键知识点。 首先,要实现Excel与SQL Server之间的交互,你需要了解ODBC...
通常,当Excel中的数据量增大或需要更高级的数据管理、安全性以及多用户协作时,将数据迁移到SQL Server是明智的选择。此外,SQL Server还提供了复杂查询、事务处理、索引优化等功能,适合企业级的数据存储和处理。 ...
此外,如果数据量非常大,可能需要优化导入策略,如分批导入、并行处理等。 总结来说,"Excel导入SQLserver源码_excel2sql.zip"提供了将Excel数据批量导入到SQL Server的自动化解决方案,减少了手动操作的繁琐,...
这个压缩包"**C# SQL Server数据库操作DLL**"提供了一种便捷的方式,通过一个动态链接库(DLL)来处理这些操作,免去了手动编写大量基础数据库访问代码的麻烦。DLL(DBClass.dll)封装了对SQL Server数据库的基本...
1. **性能优化**:专门设计用于Excel导出的工具往往在处理大数据量时表现更好,能更快地完成导出任务。 2. **自动化**:这些工具可能支持批处理和定时任务,使定期导出变得自动化,减轻了手动操作的负担。 3. **定制...
在实际工作中,你需要确保数据安全,防止未授权访问,并优化查询性能,以应对大量并发查询和大数据量的挑战。 最后,实践是掌握技能的关键。不断地在学生成绩管理系统上练习这些操作,你将逐渐熟练掌握SQL Server ...
当我们需要将SQL Server中的数据导入到Excel时,可以编写C#程序来实现这一功能。下面,我们将深入探讨这个主题。 首先,要在C#中连接到SQL Server,我们需要使用ADO.NET库,它是.NET框架的一部分,提供了与数据库...
9.4.3 在客户端实现SQL Server数据导入与导出处理的一些说明 289 9.5 在数据库中存取文件 290 9.5.1 SQL Server中的文件存取方法 290 9.5.2 程序中的文件存取处理方法 292 第 10 章 作业 295 10.1 ...
本教程将详述如何将Excel数据导入到SQL Server数据库,以供Myeclipse等开发工具直接使用,这对于初学者来说是一个很好的实践案例。 首先,理解Excel的基本操作是必要的。Excel是一款功能强大的电子表格软件,广泛...
本主题将深入探讨如何使用Excel将数据导入到SQL Server 2000中,这是一个基础但至关重要的技能,对于那些处理大量数据并需要在不同系统间迁移的用户来说尤其有用。 首先,SQL Server 2000是一款由Microsoft开发的...
`生成表.sql`文件很可能是创建表格的SQL脚本,展示了如何定义列名、数据类型、约束条件等。 `lab833-0 设计-teachdb综合实验.sql`和`lab833-0 设计-teach.sql`可能涉及到数据库设计,包括表的设计、关系模型以及...
标题中的“使用NOPI导出数据到excel及excel导入数据到SQL Server文档和Demo”指出,这个资源包含了一个使用NOPI(可能是指NPOI,一个.NET平台下的开源库,用于处理Microsoft Office文件,包括Excel)进行数据操作的...
接下来,分析服务(Analysis Services, SSAS)是SQL Server 2005 BI的重要组成部分,它支持多维数据模型和在线分析处理(OLAP)。通过创建数据立方体,用户可以快速查询大量数据并进行复杂分析。同时,SSAS还支持...
在SQL Server中,实现分页查询是数据库应用中常见的需求,尤其在大数据量的展示时,分页可以提高用户体验并优化服务器性能。本教程将详细讲解如何在前端使用Java(假设Test.jsp为JSP页面)和后端使用SQL Server语句...
在SQL Server环境中,当需要将现有数据迁移到新的环境,或者在软件升级时确保数据一致性,这个工具就显得非常有用。通过它,用户可以快速、方便地生成特定表的INSERT语句脚本,这些脚本可以随后在目标数据库上执行,...
当我们需要处理大量结构化的Excel数据时,将这些数据导入到关系型数据库,如Sql Server中,可以提高数据处理效率和数据分析能力。本篇文章将详细介绍如何将Excel数据导入到Sql Server中,以及使用的关键技术。 首先...
- 对于大数据量的查询,可能需要进行索引优化,合理设计数据库表结构和查询语句,以提高查询速度。 10. **测试**: - 完成系统开发后,进行单元测试、集成测试和性能测试,确保系统的稳定性和正确性。 综上所述...