C#笔试题面试题锦集(16)sql server 题目

这里是总目录: C#笔试题面试题锦集(全)

 

 

数据库开发技巧:

  内容:  

 

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

 

  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. 注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k) ,那么系统将会进行锁升级,页级锁会升级成表级锁。  

 

  b)索引的使用规范:

 

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

 

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

 

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

 

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

 

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

 

  c)tempdb的使用规范:

 

   i. 尽量避免使用distinct、order by、group by、having、join、cumpute,因为这些语句会加重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=SSPI;database=Pubs");

 

  SqlConnection conn

 

  = new SqlConnection("server=(local)\\NetSDK;database=pubs;Integrated Security=SSPI");

 

  SqlConnection conn = new SqlConnection(

 

  "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");

 

  SqlConnection conn = new SqlConnection(

 

  " data source=(local);initial catalog=xr;integrated security=SSPI;

 

  persist security info=False;workstation id=XURUI;packet size=4096; ");

 

  SqlConnection myConn = new

 

  System.Data.SqlClient.SqlConnection("Persist Security Info=False;Integrated

 

  Security=SSPI;database=northwind;server=mySQLServer");

 

  SqlConnection conn = new SqlConnection(

 

  " uid=sa;pwd=passwords;initial catalog=pubs;data source=127.0.0.1;Connect Timeout=900");

 

 

  System.Data.OleDb.OleDbConnection

 

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

 

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

 

  OleDbConnection conn = new OleDbConnection(

 

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

 

  User ID=Admin;Data Source=grocertogo.mdb;");

 

  OleDbConnection conn = new OleDbConnection(

 

  "Provider=MSDAORA; Data Source=ORACLE8i7;Persist Security Info=False;Integrated Security=yes");

 

  OleDbConnection conn = new OleDbConnection(

 

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

 

  OleDbConnection conn = new OleDbConnection(

 

  "Provider=SQLOLEDB;Data Source=MySQLServer;Integrated Security=SSPI");

 

  System.Data.OracleClient.OracleConnection

 

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

 

  OracleConnection myConn = new System.Data.OracleClient.OracleConnection(

 

  "Data Source=Oracle8i;Integrated Security=yes");

 

 

  System.Data.Odbc.OdbcConnection

 

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

 

  OdbcConnection conn = new OdbcConnection(

 

  "Driver={SQL Server};Server=MyServer;Trusted_Connection=yes;Database=Nort hwind;");

 

  OdbcConnection conn = new OdbcConnection(

 

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

 

  Persist Security Info=False;Trusted_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 = SAMPLE;UID=<username>; PWD=<password>;");

 

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

 

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

 

  and.Data.Mssql,Version=1.1.0.0,Culture=neutral,PublicKeyTo ken=91d62ebb5b0d1b1b;ve

 

  ndorclient=sqloledb.dll;osauthentication=False;database=&l t;database>;usernam

 

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

 

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

 

  and.Data.Db2,Version=1.1.0.0,Culture=neutral,PublicKeyToke n=91d62ebb5b0d1b1b;ve

 

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

 

  password=<password>;provider=DB2");

 

  Connection Pooling

 

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

 

  Provider=SQLOLEDB;OLE DB Services=-4;Data Source=localhost;Integrated Security=SSPI;

 

  在SQL Server.NET Data Provider中提供了以下参数设置控制连接池的行为:Connection Lifttime、Connection Reset、Enlist、Max Pool Size、Min Pool Size和Pooling.

 

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

 

 

摘要

 

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

 

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

 

 如何实现连接池

 

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

 

优点

 

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

 

缺点

 

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

 

技巧和提示

 

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

 

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

 

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

 

 

连接池FAQ

 

1. 何时创建连接池?

 

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

 

2. 何时关闭连接池?

 

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

 

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

 

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

 

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)。 但由于早期Sybase与OS集成度不高,因此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-D和TPC-C的世界记录。

  

Sybase ASE

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

  

DB2

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

  

客户端支持及应用模式

SQL Server

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

  

Oracle

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

  

Sybase ASE

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

  

DB2

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

  

操作简便

SQL Server

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

  

Oracle

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

  

Sybase ASE

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

  

DB2

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

  

 

使用风险

SQL server

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

  

Oracle

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

  

Sybase ASE

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

  

DB2

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

 

你可能感兴趣的:(SQL Server)