데이터 베이스 MySQL 튜토리얼 SQLServer 数据库开发顶级技巧

SQLServer 数据库开发顶级技巧

Jun 07, 2016 pm 05:58 PM
sqlserver 데이터베이스 개발

无论你的专业水平如何,从其他IT专家那里学习新的技巧与最佳实践常常都是有益的。本文包含了我遇到过的SQL Server开发的高级技巧。希望其中的一些技巧能够对您的数据库开发及管理工作有所帮助。

确保代码中的数据类型与数据库中的列类型保持一致
  确保您的应用程序各层数据类型保持一致是非常重要的。例如,如果一列的数据类型为NVARCHAR(50),那么,您应该在代码查询与存储过程中使用相同类型的局部变量。
  同样,数据层中的ADO.NET代码也应该指定相同的数据类型与长度。为什么这很重要呢?因为如果数据类型与查询匹配,SQL Server需要先进行数据类型的隐式转换,以使它们能够匹配。
  也有一些情况,即使为参照列设置了索引,SQL Server却不能使用此索引。因此,变量与列类型一致的情况下,您的查询可能会使用Index Scan而不是Index Seeking,这样需要执行的时间就更长了。
在中进行大规模更新
  开发人员有时需要对一张表中的一列或多列中的全部或大部分列进行数据修改。通常,对小表而言这并不是一个什么问题。
  然而,如果表很大的话,您的更新语句将锁定整张表,使它无法使用,甚至都不能读取。更有甚者,对一张频繁变化的表进行更新可能使整个应用程序或网站瘫痪。有时,在极端情况下,一个大的、单个事务将导致事务日志急剧增长,并最终耗尽数据库服务器磁盘空间。
  因此,好的策略是进行分批大规模更新,并结合频繁的事务日志备份。以我的经验看,最好一批10,000至50,000工作量。当您开始考虑应用批量处理时,确定阈值很困难,因为这取决于诸多因素比方说如何使I/O更快,如何使表高效利用等等。
  您可以考虑一个准则。在ADO.NET中,典型的命令超时时间是30秒左右。当开始更新时,其他进程一直处于等待状态直到更新结束。因此如果期望更新时间超过20-25秒,您最好进行一个更新。否则,将以应用程序超时而结束。
  下面这段简单的代码展示了如何更新表中的一列,应用的批量大小为10,000:
  WHILE ( 0 = 0 )
  BEGIN
  UPDATE TOP ( 10000 )
  Person
  SET Status = 2
  WHERE Status = 1
  IF @@ROWCOUNT = 0
  BREAK
  END
  应用FOR-EACH存储过程
  有些时候您可能需要对某一特定类型的所有对象执行相同的操作。例如,您可能需要对数据库中的所有表分配特定的权限。开发人员经常通过指针设置这样的任务,但是SQL Server中两个简单的存储过程可以更容易实现:sp_msForEachTable 与 sp_msForEachDB。
  每个存储过程作为一个参数执行命令。在命令中,您把表名或数据库名作为一个问号标志占位符嵌入到参数中。命令运行时,SQL Server把问号标志替换为表名或数据库名,并执行。
  例如,下面的代码在Server上除TempDB外,对每个数据库进行全备份:
  EXEC sp_msforeachdb 'IF ''?'' ''tempdb'' BACKUP DATABASE ?
  TO DISK=''c:\backups\?.bak'' WITH INIT'
  这是另外一个如何应用这些存储过程的例子。下面的代码在禁用外键后,删除数据库所有表中的数据。当然了,当使用这些代码时,您需要谨慎的练习。
  EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
  EXEC sp_MSForEachTable '
  IF OBJECTPROPERTY(object_id(''?''), ''TableHasForeignRef'') = 1
  DELETE FROM ?
  else
  TRUNCATE TABLE ?
  '
  EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
  建立数据库版本
  对开发人员而言,如同对您的应用程序版本化一样,对数据库执行数字版本化是一个很好的方法。
  执行版本化并不需要很大的工作量,您只需创建一个包含版本号列及时间戳列的版本表即可。当部署那些脚本时,您将更好的分配每个脚本集合的版本号,并对版本表进行更新,检查错误与数据库对比将变得更加容易。您甚至可以对脚本进行编号,这样一来如果数据库中建立的编号不比脚本中建立的编号高的话,脚本就不执行。样例数据库AdventureWorks中的AWBuildVersion就是一个很好的例子,可以看看。
  尽量减少网络会话
  这个技巧主要针对从数据库取数据的网络应用程序。缺乏经验的开发人员常常意识不到数据库调用是代价很高的操作。对于小应用程序而言,这不是什么大问题。但是,由于很多网站变得非常火爆导致数以千计的用户同时在线,那么您就有必要提前考虑它的可扩展性与网页加载时间的优化问题了。
  我曾经看到过的网页有多达15个数据库调用,而大多数正在执行的存储过程就是为了返回单独的一行或一个值。需要牢记的是在SQL Server中一个单独的存储过程能够返回多个结果集。在一个存储过程中,您可以使用ADO.NET中的DataSet对象以及把DataTable对象组成一个集合。
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

sqlserver 데이터베이스에 이름이 지정된 개체가 이미 존재하는 문제를 해결하는 방법 sqlserver 데이터베이스에 이름이 지정된 개체가 이미 존재하는 문제를 해결하는 방법 Apr 05, 2024 pm 09:42 PM

sqlserver 데이터베이스에 이름이 지정된 개체가 이미 존재하는 문제를 해결하는 방법

mdf 파일을 sqlserver로 가져오는 방법 mdf 파일을 sqlserver로 가져오는 방법 Apr 08, 2024 am 11:41 AM

mdf 파일을 sqlserver로 가져오는 방법

sqlserver 서비스를 시작할 수 없는 경우 수행할 작업 sqlserver 서비스를 시작할 수 없는 경우 수행할 작업 Apr 05, 2024 pm 10:00 PM

sqlserver 서비스를 시작할 수 없는 경우 수행할 작업

sqlserver 포트번호 확인하는 방법 sqlserver 포트번호 확인하는 방법 Apr 05, 2024 pm 09:57 PM

sqlserver 포트번호 확인하는 방법

sqlserver에서 실수로 삭제한 데이터베이스를 복구하는 방법 sqlserver에서 실수로 삭제한 데이터베이스를 복구하는 방법 Apr 05, 2024 pm 10:39 PM

sqlserver에서 실수로 삭제한 데이터베이스를 복구하는 방법

sqlserver 데이터베이스는 어디에 있나요? sqlserver 데이터베이스는 어디에 있나요? Apr 05, 2024 pm 08:21 PM

sqlserver 데이터베이스는 어디에 있나요?

Java 연결 SqlServer 오류를 해결하는 방법 Java 연결 SqlServer 오류를 해결하는 방법 May 01, 2023 am 09:22 AM

Java 연결 SqlServer 오류를 해결하는 방법

설치에 실패하면 sqlserver를 삭제하는 방법은 무엇입니까? 설치에 실패하면 sqlserver를 삭제하는 방법은 무엇입니까? Apr 05, 2024 pm 11:27 PM

설치에 실패하면 sqlserver를 삭제하는 방법은 무엇입니까?

See all articles