SQl面试题

 

Insert Into 数据表名称(字段名称1,字段名称2,...) values(字段值1,字段值2,...)

insert into user(username,password,age) values('李老四','6666',45)

Update 数据表名称 Set 字段名称=字段值,字段名称=字段值,...[Where 条件]

Delete From 数据表

下列查询返回在LONDON(伦敦)或SEATTLE(西雅图)的所有雇员:

SELECT * FROM employees WHERE UPPER(city) IN ('LONDON''SEATTLE')

下面示例利用DATEDIFF函数,确定在 pubs 数据库中标题发布日期和当前日期间的天数。

SELECT DATEDIFF(day, OrderDate, getdate()) AS no_of_days FROM table1

返回字符串"wonderful" titles 表的 notes 列中开始的位置。

SELECT CHARINDEX('wonderful', notes)

以下是返回的结果:(第47个字符位置)

显示工作站的名称:select host_name() as [Client Computer Name]

下例是检索 titles 表中百分之五十的书。如果 titles 表中包含了 18 行,则将检索前 9 行。

SELECT TOP 50 PERCENT title FROM titles

字段名称 [Not] Between 起始值 and 终止值

列出BOOK表中3050元的书

select * from  book where price between 30 and 50

字段名称 [Not] In(列出值1,列出值2,...)

BOOK表中列出价格为30,40,50,60的所有书

select * from book where price in(30,40,50,60)

字段名称 [Not] Like "通配符"

列出BOOK表中出版社含电的所有记录

select * from book where publishing like '**'

列出BOOK表中出版社第一个字是电的所有记录

select * from book where publishing like '*'

---

select Sum/Count/Avg/Max/Min(字段名称) [As 新名称] From 数据表名称

sum求和:

求出总价格做为合计字段

select sum(price ) as 合计 from book

count统计数量:

统计BOOK表中有多少条记录做为数量字段

select count(id) as 数量 from book

AVG平均:

算出BOOK表中所有书的平均价格

select avg(price) as 平均价格 from book

MAX最大:

列出BOOK表中最贵的书

select max(price) as 最贵书 from book

MIN最小:

select min(price) as 最便宜书 from book

 

 

交叉联接: SELECT * FROM table1 CROSS JOIN table2

select x.[name], y.[name]  from  x left join  y on x.[refid] = y.id

select y.[name],  x.[name]  from  x right join  y on x.[refid] = y.id

联接查询

SELECT t1.ProductID, t2.VendorID, t2.Name

FROM table1 t1, table2 t2

WHERE t1.VendorID = t2.VendorID

    AND StandardPrice > $10

    AND Name LIKE 'F%'

 

SELECT ProductID, talbe2.VendorID, Name

FROM table1 JOIN table2

    ON (table1.VendorID = table2.VendorID)

WHERE StandardPrice > $10

  AND Name LIKE 'F%'

 

COMPUTE by 子句

可选 BY 关键字。它基于每一列计算指定的行聚合。

行聚合函数名称。包括 SUMAVGMINMAX COUNT

要对其执行行聚合函数的列。

SELECT RateId, ConnectionFee, Rate

FROM UTC_Rate

ORDER BY RateId

COMPUTE SUM(ConnectionFee), SUM(Rate) --Compute用法(总计)

SELECT RateId, ConnectionFee, Rate

FROM UTC_Rate

ORDER BY RateId

COMPUTE SUM(ConnectionFee), SUM(Rate) BY RateId --Compute by用法(小计)

DISTINCT

指定 AVG 只在每个值的唯一实例上执行,而不管该值出现了多少次。

SELECT AVG(DISTINCT Rate)—-计算不重复Rateavg

FROM UTC_Rate

SELECT distinct  Rate FROM UTC_Rate

表的复制Select into

SELECT * into newtable FROM oldtable

联合查询 UNION所有查询中的列数和列的顺序必须相同, 数据类型必须兼容

SELECT Country, FirstName, LastName FROM Employees

UNION SELECT Country, NULL, NULL FROM Regions;

子查询:

--使用聚合函数

SELECT title FROM titles

WHERE advance >

   (SELECT max(advance)

    FROM publishers INNER JOIN titles ON

      titles.pub_id = publishers.pub_id

    WHERE pub_name = 'New Moon Books')

--使用all

SELECT title FROM titles

WHERE advance >all

   (SELECT advance

    FROM publishers INNER JOIN titles ON

      titles.pub_id = publishers.pub_id

    WHERE pub_name = 'New Moon Books')

--嵌套

SELECT field

FROM table1

WHERE id IN

   (SELECT id

   FROM table2

   WHERE title_id IN

      (SELECT title_id

      FROM table3

      WHERE title_id like 'PC%'))

--EXISTS NOT EXISTS 查找交集与差集

SELECT DISTINCT field FROM table1

WHERE EXISTS

   (SELECT * FROM table2 WHERE table1.field = table2.field)

--等效

SELECT DISTINCT table1.field

FROM table1 INNER JOIN table2

ON table1.field = publishers.field

--差集

SELECT DISTINCT field

FROM table1

WHERE NOT EXISTS

   (SELECT * FROM table2 WHERE table1.field = table2.field)

--等效

SELECT DISTINCT field

FROM table1

WHERE field NOT IN

   (SELECT field

   FROM table2)

指定组或聚合的搜索条件。HAVING 只能与 SELECT 语句一起使用。HAVING 通常在 GROUP BY 子句中使用。如果不使用 GROUP BY 子句,则 HAVING 的行为与 WHERE 子句一样。

SELECT id, SUM(price)

FROM Sales

GROUP BY id

HAVING SUM(price) > 10.00--检索超过 $10.00 的每个 ID 的总计

ORDER BY id ;

更新表:

UPDATE titles

SET price = price * 2

WHERE pub_id IN

   (SELECT pub_id

   FROM publishers

   WHERE pub_name = 'New Moon Books')

1:找出那些工资高于他们所在部门的manager的工资的员工。

 

   select w.ename,w.sal,w.mgr,m.empno,m.ename,m.sal

 

   from emp w,emp m

 

   where w.mgr=m.empno and w.sal>m.sal

 

 

2:哪些人是领导?

 

   select distinct m.ename from emp w,emp m

 

   where w.mgr=m.empno

 

 

 select ename from emp where empno in(select mgr from emp)

 

 

  select ename from emp o  where exists (select 'a' from emp i where o.empno=i.mgr)

 

 

3:哪些人不是领导?

 

    select m.ename from emp m,emp w

    where m.empno=w.mgr(+)

 

    and w.mgr is null

 

 

  select ename from emp where empno not in (select mgr from emp where mgr is not null)

 

 

   select ename from emp o where not exists (select 'a' from emp i where o.empno=i.mgr)

  

    哪个部门没有员工?哪个学生没有选课?哪个部门没有smith这个人?

 

    select ename,emp.deptno,dept.deptno,dname from emp,dept

    where emp.deptno(+)=dept.deptno

    and ename(+)='SMITH'

    and ename is null

 

4:找出公司里收入最高的前三名员工:

 

SQL> select rownum, last_name, salary

 2  from (select last_name, salary

 3        from s_emp

 4        order by salary desc)

 5  where rownum<=3;

 

   ROWNUM LAST_NAME                     SALARY

---------- ------------------------- ----------

        1 Velasquez                            4750

        2 Ropeburn                             2945

        3 Nguyen                               2897.5

不用max找出工资最高的人?

 

5: 找出表中的某一行或某几行的数据:

SQL> l

 1  select last_name, salary

 2  from (select rownum a, b.*

 3        from s_emp b)

 4* where a=3

SQL> /

 

LAST_NAME                     SALARY

------------------------- ----------

Nagayama                        2660

 

6:找出第三行到第五行之间的数据:

SQL> l

 1  select last_name, salary

 2  from (select rownum a, b.*

 3        from s_emp b where rownum<=5)

 4* where a between 3 and 5

SQL> /

 

LAST_NAME                     SALARY

------------------------- ----------

Nagayama                        2660

Quick-To-See                    2755

Ropeburn                        2945

 

7:找出那些工资高于他们所在部门的平均工资的员工。

 

1):第一种方法:

SQL> select last_name, dept_id, salary

 2  from s_emp a

 3  where salary>(select avg(salary)

 4                from s_emp

 5                where dept_id=a.dept_id);

 

LAST_NAME                    DEPT_ID     SALARY

------------------------- ---------- ----------

Velasquez                         50       4750

Urguhart                          41       2280

Menchu                            42       2375

Biri                              43       2090

Catchpole                         44       2470

Havel                             45     2483.3

Nguyen                            34     2897.5

Maduro                            41       2660

Nozaki                            42       2280

Schwartz                          45       2090

 

10 rows selected.

 

2):第二种方法:

SQL> l

 1  select a.last_name, a.salary, a.dept_id, b.avgsal

 2  from s_emp a, (select dept_id, avg(salary) avgsal

 3               from s_emp

 4               group by dept_id) b

 5  where a.dept_id=b.dept_id

 6* and a.salary>b.avgsal

SQL> /

 

LAST_NAME                     SALARY    DEPT_ID     AVGSAL

------------------------- ---------- ---------- ----------

Velasquez                       4750         50     3847.5

Urguhart                        2280         41     2181.5

Menchu                          2375         42 2055.16667

Biri                            2090         43       1710

Catchpole                       2470         44       1995

Havel                         2483.3         45     2069.1

Nguyen                        2897.5         34       2204

Maduro                          2660         41     2181.5

Nozaki                          2280         42 2055.16667

Schwartz                        2090         45     2069.1

 

10 rows selected.

 

8:找出重复数据:

SQL> l

 1  select rowid, e.* from a e

 2* where e.rowid>(select min(x.rowid) from a x where x.bm=e.bm and x.mc=e.mc);

ROWID              BM   MC

------------------ ---- --------------------

AAABdcAAGAAAAYyAAE 1111 1111

AAABdcAAGAAAAYyAAF 1112 1111

AAABdcAAGAAAAYyAAG 1113 1111

AAABdcAAGAAAAYyAAH 1114 1111

 

9: 删除重复数据:

SQL> l

 1  delete from a

 2  where rowid in (select rowid from a e

 3* where e.rowid>(select min(x.rowid) from a x where x.bm=e.bm and x.mc=e.mc))

SQL> /

 

10:行列转置

select sname,

max(decode(cname,'wuli',result,null)) wuli,

max(decode(cname,'shuxue',result,null)) shuxue

from stu,cou,rou

    where stu.sno=rou.sno

    and   cou.cno=rou.cno

group by sname

 

SNAME            WULI     SHUXUE

---------- ---------- ----------

lisi               89         88

zhangsan          99         98

 

 

 

 

 

 

 

 

 

 

 

请在SQL Server中设计表来保存一个树状结构的组织图(假定结构图中只有名称这一项内容需要保存),如果我想查询某一职位下的所有职位,用一个存储过程来实现,你有什么思路?

答: 三个字段Id(可以自增) , Name ParendId ,其中ParendId是父结点的ID

使用存储过程查询一个职位下的所有职位,存储过程需要一个输入参数,这个参数就是父结点的id,可以查询ParendId等于输入参赛id,查询所有这个职位下的职位的记录。

 

一个新闻系统,有两张表,news表,new_class,表结构如下:

表参加原始文档

其中2张表的newsID字段是关联的,请写出您写出classID101101的新闻标题的SQL语句:

答:select N.title from News N, News_class C  where N.NewsId=C.NewsId and C. NewsId=101101

 

 

写出一条Sql语句: 取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键,  注意:ID可能不是连续的。)

Select top 10 * from a where id not in (select top 30 id from a);go

 

 

SQLSERVER服务器中,给定表 table1 中有两个字段 IDLastUpdateDateID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号。

select top 1 id from table1 orderby lastupdate desc

select id from table1 where lastupdate = (select max(lastipdate) from table1)

 

写出一条Sql语句: 取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键,  注意:ID可能不是连续的。)

Select top 10 * from a where id not in (select top 30 id from a);go

 

有一人事表,计算两个同时入职的员工的生日的差,用一句 SQL语句 将EGTB1中的结果变成EGTB2的结果?

Select deffdate(ss, '2005-03-20','2005-03-28') from table there c1.datetime = c2.datetime

 

SQL中游标的定义?

类似于指针,它用于指向的某一行即为选定或执行到的当前行

基本的步骤:声明游标、打开游标、提取数据、关闭游标。

 

如何在定义游标的时候使用动态sql语句?

declare @qa nvarchar(200)

declare @i int

declare @sql nvarchar(255)

set @i = 1

while @i <= 5

begin

  set @sql = 'declare cur cursor for

               select q' + convert(nvarchar(2), @i) + ' from ImportSurveyInfo'

   set @i = @i + 1

   exec(@sql)

 open cur

 fetch cur into @qa

 select @qa

 close cur

 deallocate cur

end

 

产品表                   销售计划表

ProductID 产品名 单价                      ProductID    客户名  订货数量  销售单价

   1       name1   110                          2           m          2          250

   2       name2   220                          1           n          3          110

   3       name3   330                          3           n          1          300

   4       name4   440                         4           m          2          400

 

a.是否能删除产品表中的name2?请说明理由与过程。

 

答案:不能,两表都用ProductId做字段,要删除name2也要删除销售计划表ProductId2的一行

………………………………………………………………………………………………

b.将销售计划表中m客户的产品名为name2的销售单价更换为产品表中相应的单价

 

update 销售计划表 set 销售单价 = select 单价 from 产品表 inner join 销售计划表

 on 产品表.ProductID=销售计划表.ProductID where 客户名=m

 

…………………………………………………………………………………

c.求销售计划表中各客户各自的销售总金额的sql语句

 

select total(销售单价*订货数量) as 销售总金额 from 销售计划表 group by 客户名

 

………………………………………………………………………………

d.求客户中销售总量最大的销售总金额的客户的sql语句

 

select max(销售单价*订货数量) as 销售总金额 from 销售计划表 group by 客户名

 

…………………………………………………………………………………

e.什么是事务(transaction?它有什么好处。

 

将更改数据库的操作作为一个单元来提交或取消.

 

原子性(全部执行),

一致性(所有的数据保持一致状态),

隔离性(由并发事物所做的修改必须与任何其他并发食务所做的修改隔离),

持久性(完成事务,对系统的影响是永久性的)

………………………………………………………………………………………

f.update table2...数据库为默认设置能不能开始事务?为什么

答案:

 

 

 

数据库开发技巧:

  内容:  

 

  1、开发人员如果用到其他库的TableView,务必在当前库中建立View来实现跨库操作,最好不要直接使用“dat abse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库tableview,不方便校验。  

 

  2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。  

 

  3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:   

 

  a)SQL的使用规范:

 

   i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。

 

   ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。

 

   iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。

 

   iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。

 

   v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

 

   vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)count(*)更 有效率。

 

   vii. 尽量使用“>=”,不要使用“>”。

 

   viii. 注意一些or子句和union子句之间的替换

 

   ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。

 

   x. 注意存储过程中参数和数据类型的关系。

 

   xi. 注意insertupdate操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k) ,那么系统将会进行锁升级,页级锁会升级成表级锁。  

 

  b)索引的使用规范:

 

   i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。

 

   ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引

 

   iii. 避免对大表查询时进行table scan,必要时考虑新建索引。

 

   iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使 用该索引,否则该索引将不会被使用。

 

   v. 要注意索引的维护,周期性重建索引,重新编译存储过程。  

 

  c)tempdb的使用规范:

 

   i. 尽量避免使用distinctorder bygroup byhavingjoincumpute,因为这些语句会加重tempdb的负担。

 

   ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。

 

   iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert

 

   iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才 能保证系统能够很好的使用到该临时表的索引。

 

    v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。

 

    vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表 。  

 

  d)合理的算法使用:   

 

根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用AS E调优命令:set statistics io on, set statistics time on , set showplan on 等。

 

 

微软提供了以下四种数据库连接方式:

 

  System.Data.OleDb.OleDbConnection

 

  System.Data.SqlClient.SqlConnection

 

  System.Data.Odbc.OdbcConnection

 

  System.Data.OracleClient.OracleConnection

 

  下面我们以范例的方式,来依次说明:

 

  System.Data.SqlClient.SqlConnection

 

  常用的一些连接字符串(C#代码):

 

  SqlConnection conn

 

  = new SqlConnection "Server=local);Integrated Security=SSPIdatabase=Pubs");

 

  SqlConnection conn

 

  = new SqlConnection"server=local//NetSDKdatabase=pubsIntegrated Security=SSPI");

 

  SqlConnection conn = new SqlConnection

 

  "Data Source=localhostIntegrated Security=SSPIInitial Catalog=Northwind");

 

  SqlConnection conn = new SqlConnection

 

  " data source=local);initial catalog=xrintegrated security=SSPI

 

  persist security info=Falseworkstation id=XURUIpacket size=4096 ");

 

  SqlConnection myConn  = new

 

  System.Data.SqlClient.SqlConnection"Persist Security Info=FalseIntegrated

 

  Security=SSPIdatabase=northwindserver=mySQLServer");

 

  SqlConnection conn = new SqlConnection

 

  " uid=sapwd=passwordsinitial catalog=pubsdata source=127.0.0.1Connect Timeout=900");

 

 

  System.Data.OleDb.OleDbConnection

 

  常用的一些连接字符串(C#代码):

 

  OleDbConnection conn = new OleDbConnection@"Provider=Microsoft.Jet.OLEDB.4.0Data Source=D/MyWeb/81/05/GrocerToGo.mdb");

 

  OleDbConnection conn = new OleDbConnection

 

  @"Provider=Microsoft.Jet.OLEDB.4.0Password=

 

  User ID=AdminData Source=grocertogo.mdb");

 

  OleDbConnection conn = new OleDbConnection

 

  "Provider=MSDAORA Data Source=ORACLE8i7Persist Security Info=FalseIntegrated Security=yes");

 

  OleDbConnection conn = new OleDbConnection

 

  "Provider=Microsoft.Jet.OLEDB.4.0 Data Source=c/bin/LocalAccess40.mdb");

 

  OleDbConnection conn = new OleDbConnection

 

  "Provider=SQLOLEDBData Source=MySQLServerIntegrated Security=SSPI");

 

  System.Data.OracleClient.OracleConnection

 

  常用的一些连接字符串(C#代码):

 

  OracleConnection myConn = new System.Data.OracleClient.OracleConnection

 

  "Data Source=Oracle8iIntegrated Security=yes");

 

 

  System.Data.Odbc.OdbcConnection

 

  常用的一些连接字符串(C#代码):

 

  OdbcConnection conn = new OdbcConnection

 

  "Driver={SQL Server}Server=MyServerTrusted_Connection=yesDatabase=Nort hwind");

 

  OdbcConnection conn = new OdbcConnection

 

  "Driver={Microsoft ODBC for Oracle}Server=ORACLE8i7

 

  Persist Security Info=FalseTrusted_Connection=yes");

 

  OdbcConnection conn = new OdbcConnection

 

  "Driver={Microsoft Access Driver *.mdb}DBQ=c/bin/nwind.mdb");

 

  OdbcConnection conn = new OdbcConnection

 

  "Driver={Microsoft Excel Driver *.xls}DBQ=c/bin/book1.xls");

 

  OdbcConnection conn = new OdbcConnection

 

  "Driver={Microsoft Text Driver *.txt *.csv}DBQ=c/bin");

 

  OdbcConnection conn = new OdbcConnection"DSN=dsnname");

 

  其他厂商提供的数据库连接:

 

  DB2Connection myConn = new IBM.Data.DB2.DB2Connection

 

  "DATABASE = SAMPLEUID=<username> PWD=<password>");

 

  DB2Connection myConn = new IBM.Data.DB2.DB2Connection"DATABASE = SAMPLE");

 

  BdpConnection myConn = new Borland.Data.Provider.BdpConnection"assembly=Borl

 

  and.Data.MssqlVersion=1.1.0.0Culture=neutralPublicKeyTo ken=91d62ebb5b0d1b1bve

 

  ndorclient=sqloledb.dllosauthentication=Falsedatabase=&l t;database>usernam

 

  e=<user>hostname=<host>password=<password >provider=MSSQL");

 

  BdpConnection myConn = new Borland.Data.Provider.BdpConnection"assembly=Borl

 

  and.Data.Db2Version=1.1.0.0Culture=neutralPublicKeyToke n=91d62ebb5b0d1b1bve

 

  ndorclient=db2cli.dlldatabase=<database>username=& lt;user>

 

  password=<password>provider=DB2");

 

  Connection Pooling

 

  在SQL ServerOLE DB和。NET框架结构中的Data Provider中,都提供了隐式的连接池连接支持。你可以在ConnectionString中指定不同的参数值控制连接池的 行为。比如下面的例子使OLE DB的连接池无效并自动地进行事务处理:

 

  Provider=SQLOLEDBOLE DB Services=-4Data Source=localhostIntegrated Security=SSPI

 

  在SQL Server.NET Data Provider中提供了以下参数设置控制连接池的行为:Connection LifttimeConnection ResetEnlistMax Pool SizeMin Pool SizePooling.

 

ADO.NET连接池FAQ :::::.  

 

 

摘要

 

连接池允许应用程序从连接池中获得一个连接并使用这个连接,而不需要为每一个连接请求重新建立一个连接。一旦一个新的连接被创建 并且放置在连接池中,应用程序就可以重复使用这个连接而不必实施整个数据库连接创建过程。

 

当应用程序请求一个连接时,连接池为该应用程序分配一个连接而不是重新建立一个连接;当应用程序使用完连接后,该连接被归还给连 接池而不是直接释放。

 

 如何实现连接池

 

确保你每一次的连接使用相同的连接字符串(和连接池相同);只有连接字符串相同时连接池才会工作。如果连接字符串不相同,应用程 序就不会使用连接池而是创建一个新的连接。

 

优点

 

使用连接池的最主要的优点是性能。创建一个新的数据库连接所耗费的时间主要取决于网络的速度以及应用程序和数据库服务器的(网络 )距离,而且这个过程通常是一个很耗时的过程。而采用数据库连接池后,数据库连接请求可以直接通过连接池满足而不需要为该请求重新连接、认证到数据库服务器,这样就节省了时间。

 

缺点

 

数据库连接池中可能存在着多个没有被使用的连接一直连接着数据库(这意味着资源的浪费)。

 

技巧和提示

 

1. 当你需要数据库连接时才去创建连接池,而不是提前建立。一旦你使用完连接立即关闭它,不要等到垃圾收集器来处理它。

 

2. 在关闭数据库连接前确保关闭了所有用户定义的事务。

 

3. 不要关闭数据库中所有的连接,至少保证连接池中有一个连接可用。如果内存和其他资源是你必须首先考虑的问题,可以关闭所有的连接 ,然后在下一个请求到来时创建连接池。

 

 

连接池FAQ

 

1. 何时创建连接池?

 

当第一个连接请求到来时创建连接池;连接池的建立由数据库连接的连接字符创来决定。每一个连接池都与一个不同的连接字符串相关。 当一个新的连接请求到来时如果连接字符串和连接池使用的字符串相同,就从连接池取出一个连接;如果不相同,就新建一个连接池。

 

2. 何时关闭连接池?

 

当连接池中的所有连接都已经关闭时关闭连接池。

 

3. 当连接池中的连接都已经用完,而有新的连接请求到来时会发生什么?

 

当连接池已经达到它的最大连接数目时,有新的连接请求到来时,新的连接请求将放置到连接队列中。当有连接释放给连接池时,连接池 将新释放的连接分配给在队列中排队的连接请求。你可以调用closedispose将连接归还给连接池。

 

4. 我应该如何允许连接池?

 

对于.NET应用程序而言,默认为允许连接池。(这意味着你可以不必为这件事情做任何的事情)当然,如果你可以在SQLConn ection对象的连接字符串中加进Pooling=true;确保你的应用程序允许连接池的使用。

 

5. 我应该如何禁止连接池?

 

ADO.NET默认为允许数据库连接池,如果你希望禁止连接池,可以使用如下的方式:

 

1) 使用SQLConnection对象时,往连接字符串加入如下内容:Pooling=False;

 

2) 使用OLEDBConnection对象时,往连接字符串加入如下内容:OLE DB Services=-4;

 

 四大数据库的比较

开放性:

SQL Server

  只能在windows上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据

 

Oracle

  能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。

  

Sybase ASE

  能在所有主流平台上运行(包括 windows)。 但由于早期SybaseOS集成度不高,因此VERSION 11.9.2以下版本需要较多OS DB级补丁。在多平台的混合环境中,会有一定问题。

  

DB2

  能在所有主流平台上运行(包括windows)。最适于海量数据。DB2在企业级的应用最为广泛,在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%

  

可伸缩性,并行性

SQL server

  并行实施和共存模型并不成熟。很难处理日益增多的用户数和数据卷。伸缩性有限。

  

Oracle

  并行服务器通过使一组结点共享同一簇中的工作来扩展windownt的能力,提供高可用性和高伸缩性的簇的解决方案。如果windowsNT不能满足需要,用户可以把数据库移到UNIX中。 Oracle的并行服务器对各种UNIX平台的集群机制都有着相当高的集成度。

  

Sybase ASE

  虽然有DB SWITCH来支持其并行服务器,但由于DB SWITCH在技术层面还未成熟,且只支

持版本12.5以上的ASE SERVER,因为DB SWITCH技术需要一台服务器充当SWITCH,从而在硬件

  

DB2

  具有很好的并行性。DB2把数据库管理扩充到了并行的、多节点的环境。数据库分区是数据库的一部分,包含自己的数据、索引、配置文件、和事务日志。数据库分区有时被称为节点

  

安全性

SQL server

  没有获得任何安全证书。

  

Oracle Server

  获得最高认证级别的ISO标准认证。

  

Sybase ASE

  获得最高认证级别的ISO标准认证。

  

DB2

  获得最高认证级别的ISO标准认证。

  

性能

SQL Server

  多用户时性能不佳

  

Oracle

  性能最高, 保持开放平台下的TPC-DTPC-C的世界记录。

  

Sybase ASE

  性能接近于 SQL Server。但在UNIX平台下的并发性要优与 SQL Server

  

DB2

  性能较高适用于数据仓库和在线事物处理。

  

客户端支持及应用模式

SQL Server

  C/S结构,只支持windows客户,可以用ADO,DAO,OLEDB,ODBC连接.

  

Oracle

  多层次网络计算,支持多种工业标准,可以用ODBCJDBCOCI等网络客户连接。

  

Sybase ASE

  C/S结构,可以用ODBCJconnectCt-library等网络客户连接。

  

DB2

  跨平台,多层结构,支持ODBC,JDBC等客户

  

操作简便

SQL Server

  操作简单,但只有图形界面。

  

Oracle

  较复杂,同时提供GUI和命令行,在windowsNTunix下操作相同

  

Sybase ASE

  较复杂,同时提供GUI和命令行。但GUI较差,常常无法及时状态,建议使用命令行。

  

DB2

  操作简单,同时提供GUI和命令行,在windowsNTunix下操作相同

  

 

使用风险

SQL server

  完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼

  

Oracle

  长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。

  

Sybase ASE

  向下兼容, 但是ct-library 程序不益移植。

  

DB2

  在巨型企业得到广泛的应用,向下兼容性好。风险小。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值