sql server 表索引碎片处理
DBCC SHOWCONTIG (Transact-SQL)
更新日期: 2007 年 9 月 15 日
显示指定的表或视图的数据和索引的碎片信息。
![]() |
---|
后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。请改用 sys.dm_db_index_physical_stats。 |
Transact-SQL 语法约定
DBCC SHOWCONTIG [ ( { table_name | table_id | view_name | view_id } [ , index_name | index_id ] ) ] [ WITH { [ , [ ALL_INDEXES ] ] [ , [ TABLERESULTS ] ] [ , [ FAST ] ][ , [ ALL_LEVELS ] ] [ NO_INFOMSGS ]}]
- table_name | table_id | view_name | view_id
要检查碎片信息的表或视图。如果未指定,则检查当前数据库中的所有表和索引视图。若要获得表或视图 ID,请使用 OBJECT_ID 函数。
- index_name | index_id
要检查其碎片信息的索引。如果未指定,则该语句将处理指定表或视图的基本索引。若要获取索引 ID,请使用 sys.indexes 目录视图。
- WITH
指定有关 DBCC 语句返回的信息类型的选项。
- FAST
指定是否要对索引执行快速扫描和输出最少信息。快速扫描不读取索引的叶级或数据级页。
- ALL_INDEXES
显示指定表和视图的所有索引的结果,即使指定了特定索引也是如此。
- TABLERESULTS
将结果显示为含附加信息的行集。
- ALL_LEVELS
仅为保持向后兼容性而保留。即使指定了 ALL_LEVELS,也只对索引叶级或表数据级进行处理。
- NO_INFOMSGS
取消严重级别从 0 到 10 的所有信息性消息。
下表对结果集中的信息进行了说明。
统计信息 | 说明 | |
---|---|---|
扫描页数 | 表或索引中的页数。 | |
扫描区数 | 表或索引中的区数。 | |
区切换次数 | 遍历表或索引的页时,DBCC 语句从一个区移动到另一个区的次数。 | |
每个区的平均页数 | 页链中每个区的页数。 | |
扫描密度 [最佳计数:实际计数] | 百分比。这是“最佳计数”与“实际计数”的比率。如果所有内容都是连续的,则该值为 100;如果该值小于 100,则存在一些碎片。 “最佳计数”是指在一切都连续链接的情况下,区更改的理想数目。“实际计数”是指区更改的实际次数。 | |
逻辑扫描碎片 | 扫描索引的叶级页时返回的出错页的百分比。此数与堆无关。对于出错页,分配给索引的下一个物理页不是由当前叶级页中的“下一页”指针所指向的页。 | |
区扫描碎片 | 扫描索引的叶级页时出错区所占的百分比。此数与堆无关。对于出错区,包含当前索引页的区在物理上不是包含上一个索引页的区的下一个区。 如果索引跨越多个文件,则此数字无意义。
| |
每页的平均可用字节数 | 扫描的页上平均可用字节数。此数字越大,则页的填充程度越低。如果索引不会有很多随机插入,则数字越小越好。此数字还受行大小影响:行越大,此数字就越大。 | |
平均密度(全部) | 页的平均密度,以百分比表示。该值会考虑行大小。因此,该值可以更准确地指示页的填充程度。百分比越大越好。 |
如果指定了 table_id 和 FAST,则 DBCC SHOWCONTIG 将返回只包含以下列的结果集。
- 扫描页数
- 区切换次数
- 扫描密度 [最佳计数:实际计数]
- 区扫描碎片
- 逻辑扫描碎片
如果指定了 TABLERESULTS,则 DBCC SHOWCONTIG 将返回以下列以及上一个表中说明的九个列。
统计信息 | 说明 | |
---|---|---|
Object Name | 处理的表或视图的名称。 | |
ObjectId | 对象名的 ID。 | |
IndexName | 处理的索引的名称。堆的 IndexName 为 NULL。 | |
IndexId | 索引的 ID。堆的 IndexId 为 0。 | |
Level | 索引的级别。级别 0 是索引的叶(或数据)级。 堆的级别为 0。 | |
页 | 组成某个索引级别或整个堆的页数。 | |
Rows | 某个索引级别上的数据或索引记录数。对于堆,此值是整个堆中的数据记录数。 对于堆,此函数返回的记录数可能与对该堆运行 SELECT COUNT(*) 返回的行数不匹配。这是因为一行可以包含多条记录。例如,在某些更新的情况下,执行更新操作后单个堆行可能包含一条前推记录和一条被前推记录。另外,大多数大的 LOB 行在 LOB_DATA 存储区中都拆分为多条记录。 | |
MinimumRecordSize | 某个索引级别或整个堆中的最小记录大小。 | |
MaximumRecordSize | 某个索引级别或整个堆中的最大记录大小。 | |
AverageRecordSize | 某个索引级别或整个堆中的平均记录大小。 | |
ForwardedRecords | 该索引级别或整个堆中的被前推记录数。 | |
区 | 某个索引级别或整个堆中的区数。 | |
ExtentSwitches | 遍历表或索引的页时,DBCC 语句从一个区移动到另一个区的次数。 | |
AverageFreeBytes | 扫描的页上平均可用字节数。此数字越大,则页的填充程度越低。如果索引不会有很多随机插入,则数字越小越好。此数字还受行大小影响:行越大,此数字就越大。 | |
AveragePageDensity | 页的平均密度,以百分比表示。该值会考虑行大小。因此,该值可以更准确地指示页的填充程度。百分比越大越好。 | |
ScanDensity | 百分比。这是“最佳计数”与“实际计数”的比率。如果所有内容都是连续的,则该值为 100;如果该值小于 100,则存在一些碎片。 | |
BestCount | 所有内容连续链接时的区更改理想数量。 | |
ActualCount | 区更改实际数量。 | |
LogicalFragmentation | 扫描索引的叶级页时返回的出错页的百分比。此数与堆无关。出错页是指分配给索引的下一个物理页不是由当前叶级页中的“下一页”指针所指向的页。 | |
ExtentFragmentation | 扫描索引的叶级页时出错区所占的百分比。此数与堆无关。对于出错区,包含当前索引页的区在物理上不是包含上一个索引页的区的下一个区。 如果索引跨越多个文件,则此数字无意义。
|
如果指定了 WITH TABLERESULTS 和 FAST,则结果集将与指定 WITH TABLERESULTS 时一样,但以下列的值将为 null:
Rows | 区 |
MinimumRecordSize | AverageFreeBytes |
MaximumRecordSize | AveragePageDensity |
AverageRecordSize | ExtentFragmentation |
ForwardedRecords |
如果指定了 index_id,则 DBCC SHOWCONTIG 语句将遍历指定索引的叶级上的页链。如果只指定 table_id,或者 index_id 为 0,则将扫描指定表的数据页。该操作仅需要意向共享 (IS) 表锁。通过这种方式,除了需要排他 (X) 表锁的更新和插入以外,可执行所有更新和插入。这就可以根据返回的统计信息数量,实现执行速度与不减少并发之间进行权衡。但是,如果使用此命令只是为了测量碎片,则建议您使用 WITH FAST 选项以优化性能。快速扫描不读取索引的叶级或数据级页。WITH FAST 选项不适用于堆。
SQL Server 2005 中的更改
SQL Server 2005 中计算碎片的算法比 SQL Server 2000 中的算法更精确。因此,碎片值显得更高。例如,在 SQL Server 2000 中,如果一个表的第 11 页和第 13 页在同一区中,而第 12 页不在该区中,则不会将该表视为存在碎片。但是访问这些页需要两次物理 I/O 操作,因此,在 SQL Server 2005 中,将把这种情况算作碎片。
DBCC SHOWCONTIG 不显示数据类型为 ntext、text 和 image 的数据。这是因为 SQL Server 2005 中不再有存储文本和图像数据的文本索引(SQL Server 2000 中的索引 ID 为 255)。有关索引 ID 255 的详细信息,请参阅 sys.sysindexes (Transact-SQL)。
此外,DBCC SHOWCONTIG 也不支持 SQL Server 2005 中的某些新功能。例如:
- 如果指定的表或索引已分区,则 DBCC SHOWCONTIG 只显示指定表或索引的第一个分区。
- DBCC SHOWCONTIG 不显示行溢出存储信息和其他新的行外数据类型,如 nvarchar(max)、varchar(max)、varbinary(max) 和 xml。
SQL Server 2005 中的所有新功能完全由 sys.dm_db_index_physical_stats 动态管理视图支持。
表碎片
DBCC SHOWCONTIG 可确定表是否高度碎片化。在对表进行数据修改(INSERT、UPDATE 和 DELETE 语句)的过程中会出现表碎片现象。由于这些修改通常并不在表的行中平均分布,所以每页的填满状态会随时间而改变。对于扫描部分或全部表的查询,这样的表碎片会导致读取额外的页。从而延缓了数据的并行扫描。
如果索引的碎片非常多,可选择以下方法来减少碎片:
- 删除然后重新创建聚集索引。
重新创建聚集索引将重新组织数据,从而使数据页填满。填充度可以使用 CREATE INDEX 中的 FILLFACTOR 选项进行配置。这种方法的缺点是索引在删除/重新创建周期内为脱机状态,并且该操作是一个整体,不可中断。如果中断索引创建,则不能重新创建索引。 - 对索引的叶级页按逻辑顺序重新排序。
使用 ALTER INDEX…REORGANIZE,对索引的页级页按逻辑顺序重新排序。由于此操作是联机操作,因此语句运行时索引可用。此外,中断该操作不会丢失已完成的工作。这种方法的缺点是在重新组织数据方面没有聚集索引的删除/重新创建操作有效。 - 重新生成索引。
使用 REBUILD 和 ALTER INDEX 重新生成索引。有关详细信息,请参阅 ALTER INDEX (Transact-SQL)。
结果集中的 Avg. Bytes free per page 和 Avg. Page density (full) 统计信息指示索引页的填充度。对于不应具有很多随机插入的索引,Avg. Bytes free per page 数应较低,Avg. Page density (full) 数应较高。使用指定的 FILLFACTOR 选项删除并重建索引可改善统计信息。另外,REORGANIZE 和 ALTER INDEX 可根据其 FILLFACTOR 选项压缩索引,从而改善统计信息。
![]() |
---|
如果索引有很多随机插入和很满的页,则其页拆分数将增加。这将导致更多的碎片。 |
索引的碎片级别可通过以下方式确定:
- 比较“区切换次数”和“扫描区数”的值。
“区切换次数”的值应尽可能接近于“扫描区数”的值。此比率将作为“扫描密度”值计算。此值应尽可能的大,可通过减少索引碎片得到改善。注意:
如果索引涉及多个文件,则此方法无效。 - 了解“逻辑扫描碎片”和“区扫描碎片”的值。
“逻辑扫描碎片”和“区扫描碎片”(对于较小的区)的值是表的碎片级别的最好指标。这两个值应尽可能接近零,但 0% 到 10% 的值都是可接受的。注意:
如果索引涉及多个文件,则“区扫描碎片”的值将较高。若要减小这些值,必须减少索引碎片。
用户必须是表所有者,或者是 sysadmin 固定服务器角色、db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员。
A. 显示表的碎片信息
以下示例将显示 Employee
表的碎片信息。
USE AdventureWorks; GO DBCC SHOWCONTIG ("HumanResources.Employee"); GO
B. 使用 OBJECT_ID 获得表 ID,使用 sys.indexes 获得索引 ID
以下示例使用 OBJECT
_ID
和 sys.indexes
目录视图,以获取 AdventureWorks
数据库中 Production.Product
表的 AK_Product_Name
索引的表 ID 和索引 ID。
USE AdventureWorks; GO DECLARE @id int, @indid int SET @id = OBJECT_ID('Production.Product') SELECT @indid = index_id FROM sys.indexes WHERE object_id = @id AND name = 'AK_Product_Name' DBCC SHOWCONTIG (@id, @indid); GO
C. 显示表的简略结果集
以下示例将返回 AdventureWorks
数据库中 Product
表的简略结果集。
USE AdventureWorks; GO DBCC SHOWCONTIG ("Production.Product", 1) WITH FAST; GO
D. 显示数据库中每个表的每个索引的完整结果集
以下示例将显示 AdventureWorks
数据库中每个表的每个索引的完整表结果集。
USE AdventureWorks; GO DBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXES; GO
E. 使用 DBCC SHOWCONTIG 和 DBCC INDEXDEFRAG 对数据库中的索引进行碎片整理
以下示例将展示一种简单的方法,对数据库中碎片数量在声明的阈值之上的所有索引进行碎片整理。
/*Perform a 'USE <database name>' to select the database in which to run the script.*/ -- Declare variables SET NOCOUNT ON; DECLARE @tablename varchar(255); DECLARE @execstr varchar(400); DECLARE @objectid int; DECLARE @indexid int; DECLARE @frag decimal; DECLARE @maxfrag decimal;-- Decide on the maximum fragmentation to allow for. SELECT @maxfrag = 30.0;-- Declare a cursor. DECLARE tables CURSOR FORSELECT TABLE_SCHEMA + '.' + TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE TABLE_TYPE = 'BASE TABLE';-- Create the table. CREATE TABLE #fraglist (ObjectName char(255),ObjectId int,IndexName char(255),IndexId int,Lvl int,CountPages int,CountRows int,MinRecSize int,MaxRecSize int,AvgRecSize int,ForRecCount int,Extents int,ExtentSwitches int,AvgFreeBytes int,AvgPageDensity int,ScanDensity decimal,BestCount int,ActualCount int,LogicalFrag decimal,ExtentFrag decimal);-- Open the cursor. OPEN tables;-- Loop through all the tables in the database. FETCH NEXTFROM tablesINTO @tablename;WHILE @@FETCH_STATUS = 0 BEGIN; -- Do the showcontig of all indexes of the tableINSERT INTO #fraglist EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''') WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS');FETCH NEXTFROM tablesINTO @tablename; END;-- Close and deallocate the cursor. CLOSE tables; DEALLOCATE tables;-- Declare the cursor for the list of indexes to be defragged. DECLARE indexes CURSOR FORSELECT ObjectName, ObjectId, IndexId, LogicalFragFROM #fraglistWHERE LogicalFrag >= @maxfragAND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0;-- Open the cursor. OPEN indexes;-- Loop through the indexes. FETCH NEXTFROM indexesINTO @tablename, @objectid, @indexid, @frag;WHILE @@FETCH_STATUS = 0 BEGIN;PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',' + RTRIM(@indexid) + ') - fragmentation currently '+ RTRIM(CONVERT(varchar(15),@frag)) + '%';SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',' + RTRIM(@indexid) + ')';EXEC (@execstr);FETCH NEXTFROM indexesINTO @tablename, @objectid, @indexid, @frag; END;-- Close and deallocate the cursor. CLOSE indexes; DEALLOCATE indexes;-- Delete the temporary table. DROP TABLE #fraglist; GO
相关文章:

ASP.NET2.0 GridView小技巧汇粹
1)GridView绑定数据源控件,需要有编辑和删除选项按钮时,数据源控件必须提供SQL操作语句或存储过程调用,一般,我的推荐做法是,使用无意义的SQL语句或存储过程来使GridView的编辑和删除按钮可以生成,具体的编辑更新和删除操作在代码运行时而不是在控件设计时指定,虽然多写了一点代…
树莓派出微控制器了!Raspberry Pi Pico 只需 4 美元
整理 | 郑丽媛来源 | CSDN(ID:CSDNnews)昨天,树莓派搞了个大动作:推出了首款微控制器开发板 Raspberry Pi Pico!该开发板基于树莓派开发的全新芯片——RP2040,并且作为双核 Arm Cortex-M0 的它…

“chaos”的算法--之链表面试题
【 声明:版权所有,欢迎转载。 联系信箱:yiluohuanghungmail.com】前两天倩仔仔给我了一套试题让我看,整体来说感觉题都还算不错,从中随便找了两道。先看题吧!1、怎样判断一个单链表中是都存在环路ÿ…

ABP官方文档翻译 6.1.2 MVC视图
ASP.NET MVC 视图 介绍AbpWebViewPage基类介绍 ABP通过Abp.Web.Mvc nuget包集成到MVC视图。你可以如往常一样创建正常的MVC视图。 AbpWebViewPage基类 ABP提供了AbpWebViewPage,它定义了一些有用的属性和方法。如果你使用启动模板创建的工程,那么你所有的…

ASP.NET 打开新窗口几种方法
ASP.NET打开新窗口方法一:Response.Write("<script language/"javascript/">window.open(aaa.aspx,新窗口,/"toolbaryes,locationno,directoriesyes,statusyes,menubaryes,resizableyes,scrollbarsyes/");</script>");这种方式代码每…

Hibernate的使用梳理
Hibernate创建步骤 (五大核心接口:Configuration/SessionFactory/Session/Transaction/Query) 1.新建java工程,导入需要的jar包。 2.创建hibernate.cfg.xml配置文件和Test.java工具类。配置好相应的实体对象User.java User.hbm.x…
驭势科技引入国家队战略注资,完成超10亿元人民币融资
2021年1月25日,驭势科技(UISEE)宣布完成累计金额超10亿元人民币的新一轮融资,并获得国开制造业转型升级基金的战略注资。这是国开制造业转型升级基金在自动驾驶领域的首笔投资。2019年11月,国家制造业转型升级基金股份…

[Python爬虫] 之二十二:Selenium +phantomjs 利用 pyquery抓取界面网站数据
一、介绍 本例子用Selenium phantomjs爬取界面(https://a.jiemian.com/index.php?msearch&aindex&typenews&msg电视)的资讯信息,输入给定关键字抓取资讯信息。 给定关键字:数字;融合;电视 抓取…

android高级编程-android高级应用
android高级应用>>>第一阶段程序员基本素质养成程序员所需要具备的12条职业素质让学员初步了解和审视自己所应该具备的职业素质。并且我们会在授课中随时训练和贯彻这样的素质,最终把大家捏成专业的职业的程序员。迭发各个环节及工具初步介绍总概性的讲解一…

asp.net三种重定向方法的总结
(1)Server.Transfer方法: Server.Transfer("m2.aspx");//页面转向(服务器上执行). 服务器停止解析本页,保存此页转向前的数据后,再使页面转向到m2.aspx, 并将转向前数据加上m2.aspx页结果返回给浏览器. (2)Server.Execute方法: Server.Execute("m2.aspx"…
区区几行Python代码,一分钟搞定一天工作量
作者 | 陈熹、刘早起来源 | 早起Python大家好,我是早起。前几天有一个读者说最近要整理几千份文件,头都要整秃了,不知道能不能用Python解决,我们来看一下,你也可以思考一下。由于涉及文件私密所以具体内容已做脱敏处理…

bc计算命令的知识及企业计算案例
bc命令的用法:bc是unix下的计算器,它也可以用在命令行下面:例:给自变量i加1i2iecho $i1|bc -----效率低#因为bc支持科学计算,所以这种方法功能非常强大[rootXCN ~]# echo 11|bc 2 [rootXCN ~]# echo 1*1|bc 1 […

ExecutorService与Executors例子的简单剖析(转)
对于多线程有了一点了解之后,那么来看看java.lang.concurrent包下面的一些东西。在此之前,我们运行一个线程都是显式调用了 Thread的start()方法。我们用concurrent下面的类来实现一下线程的运行,而且这将成为以后常用的方法或者实现思路。 …

GridView隐藏列取值解决方案
【摘要】 在Asp.net 2.0中增加了一个新的数据绑定控件:GridView,其目的用来取代Asp.net1.x中的DataGrid控件,但有一点很不爽的是,如果把某列设置为visiblefalse,则不会进行数据绑定,也就是说无法直接从Grid…

百度飞桨成为北京市首个AI产业方向创新应用平台
1月20日,北京市经济和信息化局正式授予百度公司"北京市人工智能产业创新应用平台(百度飞桨)"。当前,北京市正在创建国家人工智能创新应用先导区,人工智能作为新科技革命和产业变革前沿领域,是北京…

FTP的20、21端口,工作模式
什么是FTP? FTP就是文件传输协议 File Transfer Protocol 的缩写. FTP端口号是多少? 21 FTP的端口号能改吗? 能 ftp的端口号20、21有何区别? 一个是数据端口,一个是控制端口,控制端口一般为21,而数据端口不一定是20,这和FTP的…

android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]
http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动&#…
物联网下的数据传输,Python 就能搞定!
作者 | 李秋键责编 | 夕颜出品 | AI科技大本营(ID:rgznai100)引言:近几年来,谈起发展最火热的几个关键词必然是人工智能、大数据以及物联网的万物互联、边缘计算等等了。而今天,我们就将利用Python实现物联网下的数据传…

ASP.NET 2.0中Page事件的执行顺序
Page 执行中将按照如下顺序激活事件:Page.PreInitPage.InitPage.InitComplitePage.PreLoadPage.LoadPage.LoadCompletePage.PreRenderPage.PreRenderComplete如果页面从令一个页面继承,如BasePage:System.Web.UI.Page,在BasePage中做了一些扩…

javascript函数嵌套时arguments的问题
疑问: var funtest function () {var fun function (val, val2) {alert(arguments.length); //此处答案? 有些人回答是2,但是正确是 0 };setTimeout(fun, 20);};funtest(); 转载于:https://www.cnblogs.com/huaan011/p/7073792.html

禁用页面缓存的几种方法(静态和动态)
1、在Asp页面首部<head>加入 Response.Buffer True Response.ExpiresAbsolute Now() - 1 Response.Expires 0 Response.CacheControl "no-cache" Response.AddHeader "Pragma", "No-Cache&…
程序员转型AI,成功几率有几分?
技术转型,这两年一直是程序员圈子里的热门话题。对于大部分基层程序员来说,基础岗位上薪资的涨幅很难跟上年龄的增长。而近些年,AI技术发展势头迅猛,优秀人才短缺,这种情况下,无疑是谁先转型,谁…

利用反射实现类的动态加载
为什么80%的码农都做不了架构师?>>> //首先定义一个接口来隔离类: public interface Operator { // public java.util.List act(java.util.List params);public java.util.List act(String content,String content2,java.util.List param…

spring+ (activeMQ) 实现queue与topic
2019独角兽企业重金招聘Python工程师标准>>> 2017-06-17 1、activeMQ下载与安装 前往Apache官网下载ActiveMQ,下载地址http://activemq.apache.org/download.html(此处我下载了apache-activemq-5.9.0 版本的tar包)解压:…

C#文本文件操作
如何向现有文件中添加文本using System;using System.IO;class Test {public static void Main() {// Create an instance of StreamWriter to write text to a file.// The using statement also closes the StreamWriter.using (StreamWriter sw new StreamWriter("Tes…
RISC-V 正在成为芯片世界中的 Linux
【编者按】芯片推动了人类社会数字化、信息化、智能化的发展。从某种程度上来说,芯片技术的发展也影响着行业未来的走向。你觉得未来的芯片世界将会如何?编译 | 虎说八道 责编 | 张文头图 | CSDN 下载自视觉中国出品 | CSDN(ID:C…

linux系统小记
1.当某分区空间剩余很大时,可用dd命令写入0,做成很大的文件后格式化,可当作分区使用(-o loop挂载)#dd if/dev/zero of/wq bs1M count512#mkfs -t ext3 /wq#mkswap /wq#swapon /wq#mount -o loop /wq /data#mou…

网络编程 -- RPC实现原理 -- RPC -- 迭代版本V3 -- 远程方法调用 整合 Spring
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V3——RPC -- 远程方法调用 及 null的传输 Spring 服务提供商: 1. 配置 rpc03_server.xml 注入 服务提供商 rpcServiceProvider并指定初始化方法 及 服务实例 IUserService 2. 读取 服务消费者 请求的 MethodStaics &…

Rootkit之SSDT hook(通过CR0)
SSDT即System Service Dispath Table,它是一个表,这个表中有内核调用的函数地址。KeServiceDescriptorTable:是由内核(Ntoskrnl.exe)导出的一个表,这个表是访问SSDT的关键,具体结构是typedef st…

禁止validateRequest的办法
A potentially dangerous Request.Form value was detected from the client (txtTest"<b>"). 由于在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值。立马报错。 解决方案一: 在.a…