찾다
데이터 베이스MySQL 튜토리얼Sql Server 编译、重编译与执行计划重用原理(转)

当 Sql Server 收到任何一个指令,包括:查询、批处理、存储过程、触发器、预 编译 指令和动态SQL Server语句,要完成语法解析、语义分析,然后再进行" 编译 ",生成能够运行的" 执行 计划 "。在 编译 的过程中,SQL Server 会根据所涉及的对象的架构、统计

当 Sql Server 收到任何一个指令,包括:查询、批处理、存储过程、触发器、预编译指令和动态SQL Server语句,要完成语法解析、语义分析,然后再进行"编译",生成能够运行的"执行计划"。在编译的过程中,SQL Server 会根据所涉及的对象的架构、统计信息,以及指令的具体内容,估算可能的执行计划,以及它们的成本,最后选择一个SQL Server认为成本最低的语句。

 

执行计划生成之后,SQL Server 通常会把它们缓存到内存里,术语统称它们叫"Plan Cache"。以后同样的语句执行,SQL Server就可以使用同样的执行计划,而无须再做一次编译。这种行为,叫做“重用”。但是有时候,哪怕是一模一样的语句,SQL Server 下次执行还是要再做一次编译。这种行为叫“重编译”。执行计划编译和重编译都是要耗费资源的。

 

执行计划的好坏当然决定了语句的执行速度。对于同样一条语句,使用好的执行计划可能会比差的要快几百倍,甚至几千倍。所以从这一角度上来讲,没运行一条语句,都把它先编译一遍当然是最好的。它能够保证使用的执行计划是 SQL Server 能找到的最优的。但是 SQL Server 每秒钟可能会运行成百上千的指令。如果每个都编译一遍,是资源的严重浪费。所以 SQL Server 在这里也试图寻找一个平衡点,使用优先的 complie/recomplie,得到最好的整体性能。

 

查看 SQL Server 缓存的执行计划,可以运行下面这条语句:<font color="#0000ff"><b>select</b></font> <font color="#333399">*</font> <font color="#0000ff"><b>from</b></font> sys.syscacheobjects

 

对不同的指令调用方法, SQL Server 做执行计划缓存和重用机制也有所不同。下面介绍最常见的几种:

 

1. Adhoc 语句

一组包含 Select、Insert、Update、Delete 的批处理指令。对这样的指令,只有前后完全一直,包括字母的大小写、空格、回车换行都一致, SQL Server 才认为是两条一样的语句,才能够重用执行计划。所以这个要求还是挺高的。

 

2. 用 Exec() 的方式运行动态 SQL Server 语句

有些应用程序为了开发上的灵活程度,在程序运行过程中,动态地拼接成一个语句字符串,然后用 Exec() 的方式执行。这种调用方法被称为"dynamic SQL"。它的好处就是很灵活,可以根据客户的选择,动态生成指令,而不仅限于预定义的那几种。但是它的缺点也是太灵活了,客户发过来的语句每次都不一样,或者语句主体部分是一样的,但是参数不一样, SQL Server 都要做编译。这点和 adhoc 语句是一样的。

 

3. 自动参数化查询

对于一些比较简单的查询, SQL Server 2005 自己就可以做自动参数化,把语句里的参数用一个变量代替,但是这仅限于很简单的查询。

 

4. 用 sp_executesql 的方式调用的指令

查询自动参数化在很多种条件下是不支持的,而且它还是要为每句查询生成一个 adhoc 的执行计划。所以它并不是减少比哪一的最有手段。改用 sp_executesql 能够更有效地增加执行计划重用

 

5. 存储过程

对用户经常要调用的指令,把他们做成存储过程,既方便管理、规范脚本,又能够大大提高执行计划调用,是值得推荐的一种做法。从 SQL Server 的角度,最好绝大多数指令都能够以存储过程的方式调用,尽量少使用 Dynamic SQL 的方式。

 

但是有些时候, SQL Server 为了确保返回正确的值,或者有性能上的顾虑,有意不重用缓存在内存里的执行计划,而现场编译一份。这种行为,被成为重编译。下面是比较常见的会发生重编译的情形:

 

1. 当指令或批处理所涉及的任何一个对象(表格或者试图)发生了架构(schema)变化

例如,在表或者视图上添加或删除另一个字段、添加或删除了一个索引,在表上添加或者删除了一个约束条件等。定义发生了变化,原来的执行计划就不一定正确了,当然要重编译

 

2. 运行过 sp_recomplie 后

当用户在某个存储过程或者触发器上运行过 sp_recomplie 后,下一次运行它们就会发生一次重编译。如果用户在某个表或试图上运行了 sp_recomplie ,那么所有引用到这张表或视图的存储过程在下一次运行前,都要做重编译

 

3. 有些动作会清除内存里的所有执行计划,迫使大家都要做重编译

Detach 一个数据库

对数据库做了一个升级,在新的服务器上会发生执行计划清空

运行了 DBCC FreeProccache 语句

运行了 ReConfigure 语句

运行了 Alter DataBase ... Modify FileGroup 语句

用 Alter DataBase ... Collate 语句修改了某个数据库的字符集

下列动作会清除 SQL Server 服务器缓存的某个数据库的执行计划

DBCC FlushProcinDB 语句

Alter DataBase ... Modify Name 语句

Alter DataBase ... Set Online 语句

Alter DataBase ... Set Offline 语句

Alter DataBase ... Set EmerGency 语句

Drop DataBase 语句

当一个数据库自动关闭时

DBCC CheckDB 语句结束时

 

4. 当一些 Set 开关值变化后,先前的那些执行计划都不能重用

 

5. 当表格或试图上的统计信息发生变化后

当统计信息被手动更新后,或者 SQL Server 发现某个统计信息需要自动更新时, SQL Server 会对所涉及的语句都做重编译

 

须说明的是,在 Sql Server 里,执行计划重用并不一定是一件好事,而编译编译也不一定是一件坏事。在 Sql Server 里,能对计划重用编译/重编译产生影响的功能主要有:

 

1. 使用存储过程,或者 sp_executesql 的方式调用会被重复使用的语句,而不要直接用 ad-hoc 语句或者 dynamic SQL 。

 

2. 在语句里引用对象(表、视图、存储过程等),到带上它的 schema 名字,而不光是对象自己的名字。

 

3. 将 数据库IsParameterizationForced属性设置成TRUE

这个属性是开启数据库强制参数化。也就是说,对于在这个数据库下运行的大部分语句,SQL Server 都会先参数化,再运行。如果应用经常用 adhoc 的方式调用一样的语句,强制参数化可能会有所帮助

 

4. 统计信息更新

统计信息手工或者自动更新后,对和它有关的执行计划都不再能重用,而会产生重编译

 

5. Create Procedure ... with Recompile 选项 和 Exce ... with Recomplie 选项

在重建或者调用存储过程的时候使用 "with Recomplie",会强制 Sql Server 在调用这个存储过程的时候,永远都要先编译,再运行。

 

6. 用户使用了 sp_recomplie

 

7. 用户在调用语句的时候,使用了 "Keep Plan" 或者 "KeepFixed Plan" 这样的查询提示

 

转载地址:http://blog.csdn.net/babauyang/article/details/7714211



来自为知笔记(Wiz)



성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
MySQL에서 데이터베이스 업그레이드를 어떻게 처리합니까?MySQL에서 데이터베이스 업그레이드를 어떻게 처리합니까?Apr 30, 2025 am 12:28 AM

MySQL 데이터베이스를 업그레이드하는 단계에는 다음이 포함됩니다. 1. 데이터베이스 백업, 2. 현재 MySQL 서비스 중지, 3. 새 버전의 MySQL 설치, 4. 새 버전의 MySQL 서비스 시작, 5. 데이터베이스 복구. 업그레이드 프로세스 중에 호환성 문제가 필요하며 Perconatoolkit과 같은 고급 도구를 테스트 및 최적화에 사용할 수 있습니다.

MySQL에 사용할 수있는 다른 백업 전략은 무엇입니까?MySQL에 사용할 수있는 다른 백업 전략은 무엇입니까?Apr 30, 2025 am 12:28 AM

MySQL 백업 정책에는 논리 백업, 물리적 백업, 증분 백업, 복제 기반 백업 및 클라우드 백업이 포함됩니다. 1. 논리 백업은 MySQLDump를 사용하여 데이터베이스 구조 및 데이터를 내보내며 소규모 데이터베이스 및 버전 마이그레이션에 적합합니다. 2. 물리적 백업은 데이터 파일을 복사하여 빠르고 포괄적이지만 데이터베이스 일관성이 필요합니다. 3. 증분 백업은 이진 로깅을 사용하여 변경 사항을 기록합니다. 이는 큰 데이터베이스에 적합합니다. 4. 복제 기반 백업은 서버에서 백업하여 생산 시스템에 미치는 영향을 줄입니다. 5. AmazonRDS와 같은 클라우드 백업은 자동화 솔루션을 제공하지만 비용과 제어를 고려해야합니다. 정책을 선택할 때 데이터베이스 크기, 가동 중지 시간 허용 오차, 복구 시간 및 복구 지점 목표를 고려해야합니다.

MySQL 클러스터링이란 무엇입니까?MySQL 클러스터링이란 무엇입니까?Apr 30, 2025 am 12:28 AM

mysqlclusteringenhancesdatabaserobustness andscalabilitydaturedingdataacrossmultiplenodes.itusesthendbenginefordatareplicationandfaulttolerance, highavailability를 보장합니다

MySQL의 성능을 위해 데이터베이스 스키마 설계를 어떻게 최적화합니까?MySQL의 성능을 위해 데이터베이스 스키마 설계를 어떻게 최적화합니까?Apr 30, 2025 am 12:27 AM

MySQL에서 데이터베이스 스키마 설계 최적화는 다음 단계를 통해 성능을 향상시킬 수 있습니다. 1. 인덱스 최적화 : 공통 쿼리 열에서 인덱스 생성, 쿼리의 오버 헤드 균형 및 업데이트 삽입. 2. 표 구조 최적화 : 정규화 또는 정상화를 통한 데이터 중복성을 줄이고 액세스 효율을 향상시킵니다. 3. 데이터 유형 선택 : 스토리지 공간을 줄이기 위해 Varchar 대신 Int와 같은 적절한 데이터 유형을 사용하십시오. 4. 분할 및 하위 테이블 : 대량 데이터 볼륨의 경우 파티션 및 하위 테이블을 사용하여 데이터를 분산시켜 쿼리 및 유지 보수 효율성을 향상시킵니다.

MySQL 성능을 어떻게 최적화 할 수 있습니까?MySQL 성능을 어떻게 최적화 할 수 있습니까?Apr 30, 2025 am 12:26 AM

tooptimizemysqlperformance, followthesesteps : 1) 구현 properIndexingToSpeedUpqueries, 2) useExplaintoAnalyzeanDoptimizeQueryPerformance, 3) AdvertServerConfigUrationSettingstingslikeInnodb_buffer_pool_sizeandmax_connections, 4) uspartOflEtOflEtOflestoI

데이터 처리 및 계산에 MySQL 기능을 사용하는 방법데이터 처리 및 계산에 MySQL 기능을 사용하는 방법Apr 29, 2025 pm 04:21 PM

MySQL 기능은 데이터 처리 및 계산에 사용될 수 있습니다. 1. 기본 사용에는 문자열 처리, 날짜 계산 및 수학 연산이 포함됩니다. 2. 고급 사용에는 복잡한 작업을 구현하기 위해 여러 기능을 결합하는 것이 포함됩니다. 3. 성능 최적화를 위해서는 WHERE 절에서 기능 사용 및 GroupBy 및 임시 테이블 사용을 피해야합니다.

MySQL에 데이터를 일괄 삽입하는 효율적인 방법MySQL에 데이터를 일괄 삽입하는 효율적인 방법Apr 29, 2025 pm 04:18 PM

MySQL에 데이터 삽입을위한 효율적인 방법은 다음과 같습니다. 1. InsertInto 사용 ... 값 구문 사용 ... 값 구문, 2. 트랜잭션 처리 사용, 3. 트랜잭션 처리 사용, 4. 배치 크기 조정, 5. 인덱스 비활성화, 6. Insertignore 또는 Insert ... ondupliceKeyUpdate를 사용하여 데이터베이스 작동 효율성을 크게 향상시킬 수 있습니다.

MySQL 테이블에 필드를 추가 및 삭제하는 단계MySQL 테이블에 필드를 추가 및 삭제하는 단계Apr 29, 2025 pm 04:15 PM

MySQL에서는 altertabletable_nameaddcolumnnew_columnvarchar (255) 이후에 필드를 추가하여 altertabletable_namedropcolumncolumn_to_drop을 사용하여 필드를 삭제합니다. 필드를 추가 할 때는 쿼리 성능 및 데이터 구조를 최적화하기위한 위치를 지정해야합니다. 필드를 삭제하기 전에 작업이 돌이킬 수 없는지 확인해야합니다. 온라인 DDL, 백업 데이터, 테스트 환경 및 저하 기간을 사용하여 테이블 구조 수정은 성능 최적화 및 모범 사례입니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

메모장++7.3.1

메모장++7.3.1

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

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는