优化SQL Server索引的小技巧

 更新时间:2016年11月25日 16:43  点击:1458
SQL Server中有几个可以让你检测、调整和优化SQL Server性能的工具。在本文中,我将说明如何用SQL Server的工具来优化数据库索引的使用,本文还涉及到有关索引的一般性知识。
关于索引的常识

影响到数据库性能的最大因素就是索引。由于该问题的复杂性,我只可能简单的谈谈这个问题,不过关于这方面的问题,目前有好几本不错的书籍可供你参阅。我在这里只讨论两种SQL Server索引,即clustered索引和nonclustered索引。当考察建立什么类型的索引时,你应当考虑数据类型和保存这些数据的column。同样,你也必须考虑数据库可能用到的查询类型以及使用的最为频繁的查询类型。
索引的类型
如果column保存了高度相关的数据,并且常常被顺序访问时,最好使用clustered索引,这是因为如果使用clustered索引,SQL Server会在物理上按升序(默认)或者降序重排数据列,这样就可以迅速的找到被查询的数据。同样,在搜寻控制在一定范围内的情况下,对这些column也最好使用clustered索引。这是因为由于物理上重排数据,每个表格上只有一个clustered索引。
与上面情况相反,如果columns包含的数据相关性较差,你可以使用nonculstered索引。你可以在一个表格中使用高达249个nonclustered索引——尽管我想象不出实际应用场合会用的上这么多索引。
当表格使用主关键字(primary keys),默认情况下SQL Server会自动对包含该关键字的column(s)建立一个独有的cluster索引。很显然,对这些column(s)建立独有索引意味着主关键字的唯一性。当建立外关键字(foreign key)关系时,如果你打算频繁使用它,那么在外关键字cloumn上建立nonclustered索引不失为一个好的方法。如果表格有clustered索引,那么它用一个链表来维护数据页之间的关系。相反,如果表格没有clustered索引,SQL Server将在一个堆栈中保存数据页。
数据页
当索引建立起来的时候,SQLServer就建立数据页(datapage),数据页是用以加速搜索的指针。当索引建立起来的时候,其对应的填充因子也即被设置。设置填充因子的目的是为了指示该索引中数据页的百分比。随着时间的推移,数据库的更新会消耗掉已有的空闲空间,这就会导致页被拆分。页拆分的后果是降低了索引的性能,因而使用该索引的查询会导致数据存储的支离破碎。当建立一个索引时,该索引的填充因子即被设置好了,因此填充因子不能动态维护。
为了更新数据页中的填充因子,我们可以停止旧有索引并重建索引,并重新设置填充因子(注意:这将影响到当前数据库的运行,在重要场合请谨慎使用)。DBCC INDEXDEFRAG和DBCC DBREINDEX是清除clustered和nonculstered索引碎片的两个命令。INDEXDEFRAG是一种在线操作(也就是说,它不会阻塞其它表格动作,如查询),而DBREINDEX则在物理上重建索引。在绝大多数情况下,重建索引可以更好的消除碎片,但是这个优点是以阻塞当前发生在该索引所在表格上其它动作为代价换取来得。当出现较大的碎片索引时,INDEXDEFRAG会花上一段比较长的时间,这是因为该命令的运行是基于小的交互块(transactional block)。
作者:王猛 (HeartIcy@163.com)
丢了密码是非常痛心的事情,尤其是root密码丢了:( 。自己装装
玩的丢了也就丢了,但是万一是生产服务器挂了麻烦可就大了!
现在假设是由于被入侵造成的root密码丢失。这里我谈一下我自己
对这样一个问题的看法。
首先遇到这种问题我们没有必要慌张,整个恢复过程也是很简单的。
1 下载MySQL源码分发包,不用区分操作系统,我们需要的东西是一
样的。
2 重命名自己的mysql的data目录下的mysql文件夹为oldmysql。
3 将源码包中data目录下的mysql目录复制到你的mysql的data目录
下。
4 重新启动mysql,现在mysql的授权关系同全新安装的一样,空密
码登陆,然后自行调整授权。
5 打开oldmysql这个库检查到底出现了什么问题。
6 如果有备份对系统中原有的数据库进行完整性检测,以免被人修
改。
通过上述6个步骤已经可以完全恢复你对mysql的控制,重点就是最
后两步检查对方对改了那些权限,以及数据的完整性检测。


MySQL是当前最流行的网络数据库,其中的原因包括:
运行速度快
免费
能运行在Linux及其他的一些平台
能与Apache(一种流行的网络服务器)完美结合
能与 PHP完美结合
MySQL具有一个ODBC接口。如果你操作的是网络服务器或MySQL服务器,并想把数据关联到桌面应用程序,采用ODBC接口是一个很好的方式。但如果你不是对服务器操作,访问MySQL的端口很有可能无效,此时只能寻求其他方法来操作你的数据。
存在的问题
所提及的问题都是针对客户机而言的。出于安全起见,客户机程序一般都通过一个主机选择网络代表,从而避免在网络上频繁地登录自己的系统。许多主机都能提供合适的条件和MySQL,可扩展的FrontPage,CGI及其他站点制作工具。它们也能满足硬件和软件的匹配问题。这一独特的主机甚至能提供各种工具帮助你增加或删除你的MySQL数据库,但是它只以基本的MySQL存放处格式进行,这就不能够直接地读入Access或其他的桌面程序。
客户机程序不想在自己单位上的服务机安装MySQL,可以通过我的程序来传递数据,只要在我的机器上运行MySQL。我可以人工地通过主机存放处获取数据。这一过程包括把数据加载到数据库,并通过ODBC传送到Access,然后向客户机发送数据库内容。我并不介意所完成的这些工作,但是我们应该简化一些不必要的工作而不要过多地依赖于人工操作。
让我再说明一下以上的过程。首先主机在网页上显示数据存放处,通过简单的代码和注册我获取了数据库的数据,注册之原因是出于安全考虑。现在,我采用微软的网页浏览器ActiveX控件直接操作Access数据库,这就允许用户很容易地通过注册过程,点击按钮即可获取MySQL数据,然后把数据传递到Access数据库的相应表中。只要数据是在Access数据库中,用户就可以用ODBC或他们惯用的方法把数据传递到ERP系统或其他专用系统。
Microsoft Access数据库
Access数据库相当简单,它是由一些数据表组成,数据表列举你要添加的数据。在这一节里,我采用的数据表名为Sales_Data,是由一个虚拟网站上的购车数据组成。同样,这一数据表应和主机上的MySQL数据表无论在名字,还是结构上都要完全一样。事实上,我们首先要在Access(图A)中生成一个数据表,然后通过ODBC把数据转移到当地服务器的MySQL上。
Figure A

Access应用程序打开的同时也打开了网页控制面板窗体。在我的例程中,程序在我的服务器上通过了PHP注册。
原作在SQL 2000中有一些问题。修正错误并在SQL 2000中运行通过。
/********************************************************
作者:(wleii165@yahoo.com)
版本:1.0
创建时间:20020227
修改时间:
功能:小写金额转换成大写
参数:n_LowerMoney 小写金额
v_TransType 种类 -- 1: directly translate, 0: read it in words
输出:大写金额
********************************************************/
CREATE PROCEDURE dbo.L2U
(
@n_LowerMoney numeric(15,2),
@v_TransType int,
@RET VARCHAR(200) output
)
AS

Declare @v_LowerStr VARCHAR(200) -- 小写金额
Declare @v_UpperPart VARCHAR(200)
Declare @v_UpperStr VARCHAR(200) -- 大写金额
Declare @i_I int
set nocount on
select @v_LowerStr = LTRIM(RTRIM(STR(@n_LowerMoney,20,2))) --四舍五入为指定的精度并删除数据左右空格
select @i_I = 1
select @v_UpperStr = ''
while ( @i_I <= len(@v_LowerStr))
begin
select @v_UpperPart = case substring(@v_LowerStr,len(@v_LowerStr) - @i_I 1,1)
WHEN '.' THEN '元'
WHEN '0' THEN '零'
WHEN '1' THEN '壹'
WHEN '2' THEN '贰'
WHEN '3' THEN '叁'
WHEN '4' THEN '肆'
WHEN '5' THEN '伍'
WHEN '6' THEN '陆'
WHEN '7' THEN '柒'
WHEN '8' THEN '捌'
WHEN '9' THEN '玖'
END

case @i_I
WHEN 1 THEN '分'
WHEN 2 THEN '角'
WHEN 3 THEN ''
WHEN 4 THEN ''
WHEN 5 THEN '拾'
要创建一个可以每个小时报告的查询,首先要创建一个表格。该表格一列记录日期,而没有时间信息;另一列记录钟点。下面的表格有一列记录了不同的处理类型。例如,我们可以按小时找出处理类型的总数。
CREATE TABLE test
(StartTime DATETIME NOT NULL
DEFAULT CURRENT_TIMESTAMP,
StartDate DATETIME NOT NULL
DEFAULT CONVERT(DATETIME, CONVERT(CHAR(10),CURRENT_TIMESTAMP, 110)),
StartHour INT NOT NULL
DEFAULT DATEPART(hh,CURRENT_TIMESTAMP),
TranType INT NOT NULL
CONSTRAINT ck_TranType CHECK ( TranType IN
(
1, -- insert
2, -- update
3, -- delete
)
DEFAULT 1
)
GO
接下来,插入test的数据来模拟一个可能的样本。
INSERT test (StartTime, TranType) VALUES (CURRENT_TIMESTAMP, 3)
INSERT test (StartTime, TranType) VALUES (CURRENT_TIMESTAMP, 2)
INSERT test (StartTime, TranType) VALUES (CURRENT_TIMESTAMP, 3)
GO
DECLARE @hr int
SET @hr = DATEPART(hh, DATEADD(hh,-1,CURRENT_TIMESTAMP) )
INSERT test (StartTime, TranType, StartHour) _
VALUES (DATEADD(hh,-1,CURRENT_TIMESTAMP), 3, @hr)
INSERT test (StartTime, TranType, StartHour) _
VALUES (DATEADD(hh,-1,CURRENT_TIMESTAMP), 1, @hr)
INSERT test (StartTime, TranType, StartHour) _
VALUES (DATEADD(hh,-1,CURRENT_TIMESTAMP), 2, @hr)
GO
然后用一个查询来找出按日和小时的处理总数。
SELECT StartDate tran_day,
StartHour tran_hour
, CASE trantype WHEN 1 THEN 'insert'
WHEN 2 THEN 'update'
WHEN 3 THEN 'delete'
ELSE 'unknown'
END trantype,
COUNT(*) tran_total
FROM
Test
GROUP BY
StartDate,
StartHour
,trantype
ORDER BY StartDate, StartHour
COMPUTE SUM(COUNT(*)) BY StartDate, StartHour
GO

去掉test可以清空test表格。
DROP TABLE test
GO

[!--infotagslink--]

相关文章

  • photoshop打开很慢怎么办 ps打开慢的设置技巧

    photoshop软件是一款专业的图像设计软件了,但对电脑的要求也是越高越好的,如果配置一般打开ps会比较慢了,那么photoshop打开很慢怎么办呢,下面来看问题解决办法。 1、...2016-09-14
  • Jquery Ajax Error 调试错误的技巧

    JQuery使我们在开发Ajax应用程序的时候提高了效率,减少了许多兼容性问题,我们在Ajax项目中,遇到ajax异步获取数据出错怎么办,我们可以通过捕捉error事件来获取出错的信息。在没给大家介绍正文之前先给分享Jquery中AJAX参...2015-11-24
  • 图解Sublime Text3使用技巧

    通过本篇文章给大家介绍Sublime Text3使用技巧的相关知识,对sublime text3技巧相关知识感兴趣的朋友一起学习吧...2015-12-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • 基于PHP给大家讲解防刷票的一些技巧

    刷票行为,一直以来都是个难题,无法从根本上防止。但是我们可以尽量减少刷票的伤害,比如:通过人为增加的逻辑限制。基于 PHP,下面介绍防刷票的一些技巧:1、使用CURL进行信息伪造$ch = curl_init(); curl_setopt($ch, CURLOP...2015-11-24
  • 分享12个非常实用的JavaScript小技巧

    这篇文章主要介绍了分享12个非常实用的JavaScript小技巧,这些小技巧可能在你的实际工作中或许能帮助你解决一些问题,需要的朋友可以参考下...2016-05-14
  • Python爬虫必备技巧详细总结

    本篇文章介绍了我在爬虫过程中总结的几个必备技巧,都是经过实验的,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下...2021-10-22
  • Illustrator像素级完美绘制经验技巧分享

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说像素级完美绘制的经验技巧,各位想知道具体信息的使用者们,那么下面就快来跟着小编一起看一看。 给...2016-09-14
  • 前端开发必知的15个jQuery小技巧

    本文主要介绍了前端开发必知的15个jQuery小技巧。具有很好的参考价值,下面跟着小编一起来看下吧...2017-01-26
  • 每日十条JavaScript经验技巧(二)

    本文是每日十条JavaScript经验技巧系列文章的第二篇,同样给大家汇总介绍10条个人在项目中的一些经验,分享给大家,希望大家能够喜欢...2016-06-24
  • MySQL中的binlog相关命令和恢复技巧

    操作命令:复制代码 代码如下:show binlog events in 'mysql-bin.000016' limit 10;reset master 删除所有的二进制日志flush logs 产生一个新的binlog日志文件show master logs; 或者 show binary logs; 查看二进制文...2014-05-31
  • MySQL编程中的6个实用技巧

    每一行命令都是用分号(;)作为结束对于MySQL,第一件你必须牢记的是它的每一行命令都是用分号(;)作为结束的,但当一行MySQL被插入在PHP代码中时,最好把后面的分号省略掉,例如: 复制代码 代码如下: mysql_query("INSERT INTO...2015-03-15
  • mysql中coalesce()的使用技巧小结

    在mysql中,其实有不少方法和函数是很有用的,这次介绍一个叫coalesce的,拼写十分麻烦,但其实作用是将返回传入的参数中第一个非null的值,下面这篇文章主要给大家介绍了在mysql中coalesce()使用技巧的相关资料,需要的朋友可以参考下。...2017-06-21
  • c# Linq常用的小技巧

    这篇文章主要介绍了c# Linq常用的小技巧,文中讲解非常详细,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-11-03
  • CSS不得不掌握的技巧【清除float浮动】

    本文我们来讲讲CSS必备掌握的重点:清除float浮动clear,掌握此内容,可以让你在css+div布局中,一些浮动问题得心应手。 一、浮动产生原因 一般浮动是什么情况呢?一般是...2016-09-14
  • 每日十条JavaScript经验技巧(一)

    本文是每日十条JavaScript经验技巧系列文章的第一篇,给大家汇总介绍一些在JavaScript使用过程中的注意事项,非常的简单,都是个人在平时项目中的一点小小的总结,希望对大家能够有所帮助...2016-06-24
  • 更高效的使用JQuery 这里总结了8个小技巧

    本文和其他的介绍JQuery的方法不同,本文侧重点是介绍一些JQuery的使用原则,以便让JQuery代码更高效的执行。 ...2016-04-16
  • 如何写软文?软文写法技巧

    我们很多人都感觉软文的力量强大,如春风化雨,润物细无声!等你发现这是一篇软文的时候,已经完了,因为你至少脑海中有这种印象了!对于软文来说,这是一种成功! 很多人写软...2016-10-10
  • PHP编程常用技巧四则

    PHP编程常用技巧四则:   1.配置PHP文件目录   作为服务器端解释执行的脚本语言,PHP程序放置在某个服务器可以访问的目录下,一般可以通过修改Apache的httpd.conj...2016-11-25
  • 分享经典的JavaScript开发技巧

    JavaScript开发经典技巧分享给大家:1、首次为变量赋值时务必使用var关键字变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量。 2、使用===取代====和!=操作符会在需要的情况下自动转换数...2015-11-24