SQL数据库高手来~~悬赏

SQL数据库高手来~~悬赏,第1张

--1新建一个名为school的数据库。

create database school

go

use school

go

create table student--学生信息表(student)

(

stu_no varchar(50) primary key,

stu_name varchar(100) ,

stu_sex varchar(2),

stu_phone varchar(200),

stu_email varchar(500)

)

go

insert into student values('001','张三','男','111','111@qqcom')

insert into student values('002','李四','男','222','222@qqcom')

insert into student values('003','王五','女','333','333@qqcom')

insert into student values('004','赵六','女','444','444@qqcom')

insert into student values('005','钱七','男','555','555@qqcom')

go

create table teacher

(

tea_no varchar(50) primary key,

tea_name varchar(100),

tea_sex varchar(2),

tea_phone varchar(200),

tea_email varchar(500)

)

go

insert into teacher values('001','冯老师','女','123','123@qqcom')

insert into teacher values('002','刘老师','男','321','321@qqcom')

go

create table course--课程表(course)

(

cor_id int primary key,

cor_name varchar(100),

tea_no varchar(50) foreign key references teacher(tea_no)

)

go

insert into course values(991,'数据库','001')

insert into course values(992,' *** 作系统','002')

go

create table choose--选课表(choose)

(

ch_id int identity primary key,

stu_no varchar(50) foreign key references student(stu_no),

cor_id int foreign key references course(cor_id)

)

go

insert into choose values('001',991)

insert into choose values('001',992)

insert into choose values('002',991)

insert into choose values('002',992)

insert into choose values('003',991)

insert into choose values('004',992)

go

--1选出教师信息表(teacher)所有数据。(10分)

select from teacher

--2选出前三条的学生信息数据。(10分)

select top 3 from student order by stu_no

--3选出张三同学选修的所有课程名称。(10分)

select cor_name as '张三同学选修的所有课程名称' from course where cor_id in (select cor_id from choose where stu_no=(select stu_no from student where stu_name = '张三'))

--4选出没有选课的学生。(10分)

select from student where stu_no not in(select stu_no from choose)

--5选出每个学生及他们选课的门数。(10分)

select studentstu_no,studentstu_name,studentstu_sex,studentstu_phone,studentstu_email,isnull(coun,0) from student left join (select stu_no,count()as coun from choose group by stu_no) as nes on studentstu_no = nesstu_no

select stu_no,count() from choose group by stu_no

--6选出冯老师所教的所有学生。(10分)

select from student where stu_no in(select stu_no from choose where cor_id in(select cor_id from course where tea_no=(select tea_no from teacher where tea_name = '冯老师')))

可以复制到数据库 运行

几个简单的步骤大幅提高Oracle性能 我优化数据库的三板斧数据库优化的讨论可以说是一个永恒的主题 资深的Oracle优化人员通常会要求提出性能问题的人对数据库做一个statspack 贴出数据库配置等等 还有的人认为要抓出执行最慢的语句来进行优化 但实际情况是 提出疑问的人很可能根本不懂执行计划 更不要说statspack了 而我认为 数据库优化 应该首先从大的方面考虑 网络 服务器硬件配置 *** 作系统配置 Oracle服务器配置 数据结构组织 然后才是具体的调整 实际上网络 硬件等往往无法决定更换 应用程序一般也无法修改 因此应该着重从数据库配置 数据结构上来下手 首先让数据库有一个良好的配置 然后再考虑具体优化某些过慢的语句 我在给我的用户系统进行优化的过程中 总结了一些基本的 简单易行的办法来优化数据库 算是我的三板斧 呵呵 不过请注意 这些不一定普遍使用 甚至有的会有副作用 但是对OLTP系统 基于成本的数据库往往行之有效 不妨试试 (注 附件是Burleson写的用来报告数据库性能等信息的脚本 本文用到) 一.设置合适的SGA 常常有人抱怨服务器硬件很好 但是Oracle就是很慢 很可能是内存分配不合理造成的 ( )假设内存有 M 这通常是小型应用 建议Oracle的SGA大约 M 其中 共享池(SHARED_POOL_SIZE)可以设置 M到 M 根据实际的用户数 查询等来定 数据块缓冲区可以大致分配 M M i下需要设置DB_BLOCK_BUFFERS DB_BLOCK_BUFFERDB_BLOCK_SIZE等于数据块缓冲区大小 i 下的数据缓冲区可以用db_cache_size来直接分配 ( )假设内存有 G Oracle 的SGA可以考虑分配 M 共享池分配 M到 M 数据缓冲区分配 M到 M ( )内存 G SGA可以考虑分配 G 共享池 M到 M 剩下的给数据块缓冲区 ( )内存 G以上 共享池 M到 M就足够啦 再多也没有太大帮助 (Biti_rainy有专述)数据缓冲区是尽可能的大 但是一定要注意两个问题 一是要给 *** 作系统和其他应用留够内存 二是对于 位的 *** 作系统 Oracle的SGA有 G的限制 有的 位 *** 作系统上可以突破这个限制 方法还请看Biti的大作吧 二.分析表和索引 更改优化模式 Oracle默认优化模式是CHOOSE 在这种情况下 如果表没有经过分析 经常导致查询使用全表扫描 而不使用索引 这通常导致磁盘I/O太多 而导致查询很慢 如果没有使用执行计划稳定性 则应该把表和索引都分析一下 这样可能直接会使查询速度大幅提升 分析表命令可以用ANALYZE TABLE 分析索引可以用ANALYZE INDEX命令 对于少于 万的表 可以考虑分析整个表 对于很大的表 可以按百分比来分析 但是百分比不能过低 否则生成的统计信息可能不准确 可以通过DBA_TABLES的LAST_ANALYZED列来查看表是否经过分析或分析时间 索引可以通过DBA_INDEXES的LAST_ANALYZED列 下面通过例子来说明分析前后的速度对比 (表CASE_GA_AJZLZ大约有 万数据 有主键)首先在SQLPLUS中打开自动查询执行计划功能 (第一次要执行\RDBMS\ADMIN\utlxplan sql来创建PLAN_TABLE这个表)SQL> SET AUTOTRACE ONSQL>SET TIMING ON通过SET AUTOTRACE ON 来查看语句的执行计划 通过SET TIMING ON 来查看语句运行时间 SQL> select count() from CASE_GA_AJZLZ;COUNT() 已用时间: : : Execution Plan SELECT STATEMENT Optimizer=CHOOSE SORT (AGGREGATE) TABLE ACCESS (FULL) OF CASE_GA_AJZLZ ……………………请注意上面分析中的TABLE ACCESS(FULL) 这说明该语句执行了全表扫描 而且查询使用了 秒 这时表还没有经过分析 下面我们来对该表进行分析 SQL> yze table CASE_GA_AJZLZ pute statistics;表已分析 已用时间: : : 然后再来查询 SQL> select count() from CASE_GA_AJZLZ;COUNT() 已用时间: : : Execution Plan SELECT STATEMENT Optimizer=FIRST_ROWS (Cost= Card= ) SORT (AGGREGATE) INDEX (FAST FULL SCAN) OF PK_AJZLZ (UNIQUE) (Cost= Card= )…………………………请注意 这次时间仅仅用了 秒!这要归功于INDEX(FAST FULL SCAN) 通过分析表 查询使用了PK_AJZLZ索引 磁盘I/O大幅减少 速度也大幅提升!下面的实用语句可以用来生成分析某个用户的所有表和索引 假设用户是GAXZUSR SQL> set pagesize SQL> spool d:\ yze_tables sql;SQL> select yze table ||owner|| ||table_name|| pute statistics; from dba_tables where owner= GAXZUSR ;SQL> spool offSQL> spool spool d:\ yze_indexes sql;SQL> select yze index ||owner|| ||index_name|| pute statistics; from dba_indexes where owner= GAXZUSR ;SQL> spool offSQL> @d:\ yze_tables sqlSQL> @d:\ yze_indexes sql解释 上面的语句生成了两个sql文件 分别分析全部的GAXZUSR的表和索引 如果需要按照百分比来分析表 可以修改一下脚本 通过上面的步骤 我们就完成了对表和索引的分析 可以测试一下速度的改进啦 建议定期运行上面的语句 尤其是数据经过大量更新 当然 也可以通过dbms_stats来分析表和索引 更方便一些 但是我仍然习惯上面的方法 因为成功与否会直接提示出来 另外 我们可以将优化模式进行修改 optimizer_mode值可以是RULE CHOOSE FIRST_ROWS和ALL_ROWS 对于OLTP系统 可以改成FIRST_ROWS 来要求查询尽快返回结果 这样即使不用分析 在一般情况下也可以提高查询性能 但是表和索引经过分析后有助于找到最合适的执行计划 三.设置cursor_sharing=FORCE 或SIMILAR 这种方法是 i才开始有的 oracle 不支持 通过设置该参数 可以强制共享只有文字不同的语句解释计划 例如下面两条语句可以共享 SQL> SELECT FROM MYTABLE WHERE NAME= tom SQL> SELECT FROM MYTABLE WHERE NAME= turner 这个方法可以大幅降低缓冲区利用率低的问题 避免语句重新解释 通过这个功能 可以很大程度上解决硬解析带来的性能下降的问题 个人感觉可根据系统的实际情况 决定是否将该参数改成FORCE 该参数默认是exact 不过一定要注意 修改之前 必须先给ORACLE打补丁 否则改之后oracle会占用 %的CPU 无法使用 对于ORACLE i 可以设置成SIMILAR 这个设置综合了FORCE和EXACT的优点 不过请慎用这个功能 这个参数也可能带来很大的负面影响! 四.将常用的小表 索引钉在数据缓存KEEP池中 内存上数据读取速度远远比硬盘中读取要快 据称 内存中数据读的速度是硬盘的 倍!如果资源比较丰富 把常用的小的 而且经常进行全表扫描的表给钉内存中 当然是在好不过了 可以简单的通过ALTER TABLE tablename CACHE来实现 在ORACLE i之后可以使用ALTER TABLE table STORAGE(BUFFER_POOL KEEP) 一般来说 可以考虑把 数据块之内的表放在keep池中 当然要根据内存大小等因素来定 关于如何查出那些表或索引符合条件 可以使用本文提供的access sql和access_report sql 这两个脚本是著名的Oracle专家 Burleson写的 你也可以在读懂了情况下根据实际情况调整一下脚本 对于索引 可以通过ALTER INDEX indexname STORAGE(BUFFER_POOL KEEP)来钉在KEEP池中 将表定在KEEP池中需要做一些准备工作 对于ORACLE i 需要设置DB_KEEP_CACHE_SIZE 对于 i 需要设置buffer_pool_keep 在 i中 还要修改db_block_lru_latches 该参数默认是 无法使用buffer_pool_keep 该参数应该比 CPU数量少 但是要大于 才能设置DB_KEEP_CACHE_BUFFER buffer_pool_keep从db_block_buffers中分配 因此也要小于db_block_buffers 设置好这些参数后 就可以把常用对象永久钉在内存里 五.设置optimizer_max_permutations 对于多表连接查询 如果采用基于成本优化(CBO) ORACLE会计算出很多种运行方案 从中选择出最优方案 这个参数就是设置oracle究竟从多少种方案来选择最优 如果设置太大 那么计算最优方案过程也是时间比较长的 Oracle 和 i默认是 建议改成 对于 i 已经默认是 了 六.调整排序参数 ( ) SORT_AREA_SIZE:默认的用来排序的SORT_AREA_SIZE大小是 K 通常显得有点小 一般可以考虑设置成 M( ) 这个参数不能设置过大 因为每个连接都要分配同样的排序内存 ( ) SORT_MULTIBLOCK_READ_COUNT:增大这个参数可以提高临时表空间排序性能 该参数默认是 可以改成 来对比一下排序查询时间变化 注意 这个参数的最大值与平台有关系 七.调整其它几个关键的性能参数 很多人认为使用oracle数据库 系统的默认参数就是最好的 其实不是这样 lishixinzhi/Article/program/Oracle/201311/16704

下面的介绍和参考资料希望能多少帮助你点

SQL SERVER 和ACCESS/excel的数据导入导出

常规的数据导入导出:

使用DTS向导迁移你的Access数据到SQL Server,你可以使用这些步骤:

1)在SQL SERVER企业管理器中的Tools(工具)菜单上,选择Data Transformation

2)Services(数据转换服务),然后选择 czdImport Data(导入数据)。

3)在Choose a Data Source(选择数据源)对话框中选择Microsoft Access as the Source,然后键入你的mdb数据库(mdb文件扩展名)的文件名或通过浏览寻找该文件。

4)在Choose a Destination(选择目标)对话框中,选择Microsoft OLE DB Prov ider for SQL Server,选择数据库服务器,然后单击必要的验证方式。

5)在Specify Table Copy(指定表格复制)或Query(查询)对话框中,单击Copy tables(复制表格)。

6)在Select Source Tables(选择源表格)对话框中,单击Select All(全部选定)。下一步,完成。

Transact-SQL语句进行导入导出:

1在SQL SERVER里查询access数据:

Select FROM OpenDataSource( ''MicrosoftJetOLEDB40'',''Data Source="c:DBmdb";User ID=Admin;Password='')表名

2将access导入SQL server

在SQL SERVER 里运行:

Select INTO newtable FROM OPENDATASOURCE (''MicrosoftJetOLEDB40'',''Data Source="c:DBmdb";User ID=Admin;Password='' )表名

3将SQL SERVER表里的数据插入到Access表中

在SQL SERVER 里运行:

insert into OpenDataSource( ''MicrosoftJetOLEDB40'',''Data Source=" c:DBmdb";User ID=Admin;Password='')表名 (列名1,列名2) select 列名1,列名2 from sql表

实例:

insert into OPENROWSET(''MicrosoftJetOLEDB40'',''C:dbmdb'';''admin'';'''', Test) select id,name from Test

Insert INTO OPENROWSET(''MicrosoftJetOLEDB40'', ''c:trademdb''; ''admin''; '''', 表名) Select FROM sqltablename

二、SQL SERVER 和Excel的数据导入导出

1、在SQL SERVER里查询Excel数据:

Select FROM OpenDataSource( ''MicrosoftJetOLEDB40'',''Data Source="c:book1xls";User ID=Admin;Password=;Extended properties=Excel 50'')[Sheet1$]

下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。

Select FROM OpenDataSource ( ''MicrosoftJetOLEDB40'',''Data Source="c:Financeaccountxls";User ID=Admin;Password=;Extended properties=Excel 50'')xactions

2、将Excel的数据导入SQL server :

Select into newtable FROM OpenDataSource( ''MicrosoftJetOLEDB40'',''Data Source="c:book1xls";User ID=Admin;Password=;Extended properties=Excel 50'')[Sheet1$]

实例:

Select into newtable FROM OpenDataSource( ''MicrosoftJetOLEDB40'',''Data Source="c:Financeaccountxls";User ID=Admin;Password=;Extended properties=Excel 50'')xactions

3、将SQL SERVER中查询到的数据导成一个Excel文件

T-SQL代码:

EXEC masterxp_cmdshell ''bcp 库名dbo表名out c:Tempxls -c -q -S"servername" -U"sa" -P""''

参数:S 是SQL服务器名;U是用户;P是密码

说明:还可以导出文本文件等多种格式

实例:EXEC masterxp_cmdshell ''bcp saletesttmpdboCusAccount out c:temp1xls -c -q -S"pmserver" -U"sa" -P"sa"''

EXEC masterxp_cmdshell ''bcp "Select au_fname, au_lname FROM pubsauthors orDER BY au_lname" queryout C: authorsxls -c -Sservername -Usa -Ppassword''

在VB6中应用ADO导出Excel文件代码:

Dim cn As New ADODBConnection

cnopen "Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;"

cnexecute "masterxp_cmdshell ''bcp "Select col1, col2 FROM 库名dbo表名" queryout E:DTxls -c -Sservername -Usa -Ppassword''"

4、在SQL SERVER里往Excel插入数据:

insert into OpenDataSource( ''MicrosoftJetOLEDB40'',''Data Source="c:Tempxls";User ID=Admin;Password=;Extended properties=Excel 50'')table1 (A1,A2,A3) values (1,2,3)

T-SQL代码:

Insert INTO

OPENDATASOURCE(''MicrosoftJETOLEDB40'',''Extended Properties=Excel 80;Data source=C:traininginventurxls'')[Filiale1$] (bestand, produkt) VALUES (20, ''Test'')

以上就是关于SQL数据库高手来~~悬赏全部的内容,包括:SQL数据库高手来~~悬赏、优化数据库的三板斧 大幅提高Oracle性能、C#的数据库 *** 作等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存