SQL Server 2K:
Exec sp_serveroption 'Nipsan','Data Access','True'
Select * INTO #tmpWho
From OpenQuery(Nipsan,'Exec sp_who')
Select * From #tmpWho
Drop table #tmpWho
--Test OK. Nipsan 2002/06/29
在SQL Server所在的计算机上运行病毒扫描软件
问:如果我需要在运行有SQL Server的机器上运行病毒扫描软件,怎样做才不会影响性能?
答:该问题的答案取决于您希望运行的病毒扫描软件的类型。目前有三种类型的病毒扫描软件——主动病毒扫描、病毒清除及漏洞扫描。
主动病毒扫描软件
我们推荐将主动病毒扫描用于以下SQL Server使用场合:
运行在Internet上。
读取并执行来自其他服务器的文件。
运行HTTP服务器,如Microsoft Internet Information Services (IIS)或Apache。如果您使用XML for SQL Server (SQLXML)经由IIS上的HTTP访问SQL Server,则它适用于您的操作环境。
主机文件共享。
使用SQL Mail处理传入和传出的电子邮件。
主要的性能开销为打开和关闭文件。尽管主动病毒扫描可能会在重负荷机器上导致明显的性能损失,但出于安全性的考虑,它仍是推荐使用的病毒扫描软件。
病毒清除软件
如果病毒清除软件不得不扫描SQL Server数据库文件,SQL Server将因为I/O子系统大量的读操作而导致性能降低,尤其是在文件数量较多的服务器上。如果该软件打开某个文件进行扫描,而您同时打开了SQL Server,该软件将把数据库标记为“可疑”,从而使数据库服务中断。
值得注意的是,这一类型的软件在病毒已经侵入您的硬盘后才生效。因此,您所在的机构最好通过采用可靠的安全操作,防患于未然。
漏洞扫描软件
漏洞扫描软件主要面向HTTP服务器。这种类型的病毒扫描可以很好地清除潜在的漏洞。在使用漏洞扫描软件时,Microsoft没有注意到任何SQL Server性能损失。
XML文件导入SQL Server 2000
问:怎样才能将XML文件导入SQL Server 2000?
答:将XML文件导入SQL Server有若干种方法,这里提供其中的3种:
大容量装载COM接口。如果需要将文档的实体和属性析取到关系表中,最快的方法就是使用SQL Server 2000 Extensible Markup Language 3.0 Service Pack 1(SQLXML 3.0 SP1)提供的大容量装载COM接口。大容量状态COM接口包含在SQLXML 3.0 SP1的免费下载中。
textcopy.exe命令行实用工具。如果不希望将文档的实体和属性析取到关系表中,您可以使用textcopy.exe命令行实用工具。Textcopy.exe是将文本和image数据类型从单一服务器行或列移入或移出的优秀工具。
数据转换服务(DTS)。如果XML文档很简单,您可以使用DTS将信息逐行析取到表中。这一方法要求您将XML文件定义为输入数据源,将数据库表定义为输出数据源,并编写ActiveX脚本剖析"<"和">"方式的字符输入,以析取实体、属性及其值。
使用SQL Server导入和索引 Microsoft Word 文档
问:我需要将Microsoft Word文档导入至SQL Server并索引这些文档,以便在关系查询中使用这些文档。怎样导入和索引文档呢?
答:SQL Server允许您以多种方式导入Word文档。让我们看看几种最常用的方法。请注意,在将文档导入至SQL Server之前,您需要创建一个image数据类型列,用于存放数据。然后,您可以使用textcopy.exe命令行工具将image文件读入数据库,从而完成文档的导入操作。如果需要该工具的基本说明文档,请在命令提示状态下键入textcopy /?。将Word文档导入SQL Server的另一个方法是使用Microsoft ActiveX Directory Object(ADO)Stream接口编写导入代码。您可以在Microsoft产品支持服务(PSS)的通过使用ADO Stream对象访问和修改SQL Server BLOB数据一文中找到示例代码。
此外,您也可以将二进制数据移到SQL Server中。有关这一方法的详细说明,请参阅PSS的使用ADO检索和更新SQL Server文本域一文。移动二进制数据允许您将数据的一部分存放在数据库中,这在需要控制数据格式时尤其有用。例如,如果只需要数据中1,000到1,010之间的字节,导入二进制数据的速度远远高于使用ADO Stream接口的速度,这是由于SQL Server从磁盘上检索数据的量大为减少。人们通常使用这一技术来存储位掩码,用于表示应用程序的开或关标志位。
SQL Server 2000自带了说明了如何移动二进制数据的示例代码。如需查看该代码,只需在安装有SQL Server 2000光盘上代码示例的驱动器上选择 Program FilesMicrosoft SQL Server80ToolsDevToolsSamplesado路径。展开该可执行文件,在Visual Basic目录下查找Samples子目录。在Employee示例下,注意一下该代码是如何使用FillDataFields()函数的。
如需索引Word文档,SQL Server 7.0和SQL Server 2000都提供了全文搜索组件。该组件混合使用了多种技术,用以索引大型文本和image列。在执行全文搜索时,您需要指定image列所含的文件类型,以及从二进制数据中析取信息所需的筛选(filter)。有关使用全文索引的详细信息,请参阅SQL Server在线书籍中的相关主题,并阅读David Jones 2000年7月发表在SQL Server杂志网站上的名为构建更好的搜索引擎一文。请注意,索引Word文档并不会自动生成包含文档中关键字的一组关系表。但是,索引文件让您将这些Word文档包含在您的搜索中。以下是从数据中析取关键字的可行方式:
使用OLE自动处理从文档中读取用户定义的关键字。在装载该文档时将这些关键字保存在关系表中。
将Access数据转换为XML格式
问:我怎样才能将Microsoft Access数据表中的数据转换为XML格式?
答:以下应用程序可以帮助您将Access数据转换为XML格式:Access 2002、 ADO 2.5和SQLXML。您可以通过Access 2002(Microsoft Office XP的一部分)查询数据或者使用XML格式保存数据。您可能想自动完成这个转换过程。ADO 2.5及其后续版本使您可以将数据打开到一个记录集中,然后以XML格式持有记录集,如以下代码所示:
rs.Save "c:
s.xml", adPersistXML
您还可以使用链接服务器将Access 数据库添加到SQL Server 2000数据库,以便从SQL Server内部运行查询和检索数据。最后,您可以通过HTTP,使用SQLXML技术以XML格式抽取出所需的Access数据。
SQL Server中全角和半角字符的比较问题
/*--------------------------------------------------
/*作者:翁 彦
/*--------------------------------------------------
这是一个在我实际一个项目中遇到的问题。03BHL01001(上海)和03BHL01001(上海)比较的结果是一样的。导致引起的重复的主键问题。
03BHL01001(上海)和03BHL01001(上海)差别,就在于前者的括号是全角的括号字符,后者是半角的括号字符。全角的括号字符和半角的括号字符的ascii码显然是不一样的。全角的( ASCII码是0xA3A8 ,而半角的( 是0x28。那么为什么SQL Server会认为是一样的呢?
问题其实就出在数据库的排序规则上,让我们在仔细研读一下SQL Server的文档。SQL Server的排序规则由这样几部分组成,代码页、区分大小写、区分重音、区分宽度。最后一个在SQL Server的联机帮助中没有进一步提及,其实本篇遇到的问题就是由于这个原因造成的。区分宽度:指定 SQL Server 区分相同字符的单字节表示法(半角)和双字节表示法(全角)。如果没有选择,则 SQL Server 将认为相同字符的单字节表示法和双字节表示法等效。
缺省,安装SQL Server中文版的时候,SQL Server帮你选择的排序规则是Chinese_PRC_CI_AS(Chinese-PRC, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive),是中文,不区分大小写、区分重音、不区分假名、不区分宽度。因此,自然就认同03BHL01001(上海)=03BHL01001(上海)。
所以,正确的选择应该是,后缀为WS的中文排序规则。本例中我们应该选择Chinese_PRC_CI_AS_WS。
我们来看一下,指定排序规则是Chinese_PRC_CI_AS_WS后,怎么样了?
select 1 where '03BHL01001(上海)'='03BHL01001(上海)'
collate Chinese_PRC_CI_AS_WS
(所影响的行数为 0 行)
看来这个问题解决了。
重要提示:
如何察看使用那个排序规则呢?可以使用下面的SQL语句。
SELECT *
FROM ::fn_helpcollations()
可以查询所有排序规则的信息。
查出所有中文排序规则的信息
SELECT * FROM
(
SELECT *
FROM ::fn_helpcollations()) A
WHERE name like 'Chinese%'
Win9x平台上SQL Server 2000的性能和局限
很多企业还在各种场合下使用各种版本的Windows 9x,因此,要在这些环境下使用SQL Server 2000,我们必须首先了解Windows 9x的性能和局限。
客户端软件
SQL Server 2000客户端软件是企业版、标准版和专业版都附带的。你可以仅使用SQL Server 2000安装盘里的客户端工具将客户端软件安装到客户机,也可以使用联通性选项(包含在SQL Server客户端访问许可证中)。这个软件的作用是管理SQL Server并可以在SQL数据库中进行ad hoc查询。
这个软件有一些局限。Windows 98和 Windows 95并不提供浏览器支持,这意味着SQL Server对话框不能显示服务器的列表。因此,当你使用注册服务器,注册服务器向导以及查询分析器登陆的对话框的时候,你需要手工输入正确的服务器名。
同样地,企业管理器和服务器代理这样的SQL Server工具必须由用户设置检测服务状态间隔。
服务器端软件
所有的Win9x 操作系统均不能为强化的SQL Server 2000系统提供高效的环境,因为公司级别应用程序的特性在这里是不可用的。因此,你不能在Win9x 系统上使用企业版的SQL Server 2000,不过你仍然可以使用个人版或是桌面引擎版。
SQL Server 2000个人版和桌面引擎比较适合小规模的项目,这些项目需要单独安装作为安全保障(例如,没有足够资金,仅使用win98的研究机构)。
SQL Server 2000桌面引擎是可以重分发版本的关系型数据库引擎,它不需要额外的许可证。然而,桌面引擎还是有一些严重的局限,主要包括以下几点:
它不能自动启动
它没有事件日志
SQL Server性能监视器不可用
它并不包含任何的SQL Server命令,也没有图形用户界面
它不支持named pipes、Banyan VINES servers或是AppleTalk Net-Libraries
它不支持Windows NT集成身份认证
使用多协议加密的Win98客户端不能连接到SQL Server
它不支持异步I/O,因此它不能使用某些I/O优化
TOPN 子句与SET ROWCOUNTN 之对比
问:为了从查询中返回指定数量的行,使用 TOPN 子句比使用SET ROWCOUNTN 语句要快吗?
答:在正确进行了索引的情况下,TOP N 子句和SET ROWCOUNT N 语句是一样快的,但是如果数据未经过排序,TOP N 要快一些。在输入未排序的情况下,TOP N 操作时使用一个经过排序的小的中间临时表,而且操作时仅仅替换该表的最后一行。如果输入是近似排序的,TOP N 引擎必须删除或插入最后行,但只需几次操作即可。近似排序意味着您正在处理的堆集在初始构建时可进行有序的插入操作,并且不需要进行很多的更新、删除、向前移动指针等操作。
排序一个近似排序的堆集比排序一个巨大的表要更有效率。在一次测试中,使用TOP N 来对一个由无序插入操作构建的并且含有同样的行数的表进行排序,发现TOP N 的效率也不高。通常,在进行过索引和未进行过索引的情况下,I/O时间都是一样的;但是如果没有进行过索引,SQL Server 必须要进行一次全表扫描。处理器时间和实耗时间说明近似排序的堆集要更有效率一些。但I/O时间是相同的,因为不管怎样SQL Server都要读取所有的行。
如何识别真实和自动创建的索引?
问:我发现sysindexes索引表中的很多条目并不是我自己创建的。听说它们并不是真正的索引,而是SQL Server查询优化器自动创建的统计。怎样才能识别哪些是真正的索引,哪些是SQL Server自动创建的统计呢?
答:按照默认设置,如果表中的某列没有索引,则SQL Server会自动为该列创建统计。然后,查询优化器评估该列中数据分布范围的统计信息,以选择一个更为有效的查询处理方案。分辨自动创建的统计很简单,在SQL Server 7.0和SQL Server 2000中,自动创建的统计的前缀为_WA_Sys。
您还可以使用INDEXPROPERTY()函数的IsAutoStatistics属性来区分一个索引是真正的还是自动创建的统计,让SQL Server优化器选择需要创建的统计。您还可以为您管理的数据库启用“自动创建统计表”选项。
很多人忽略了下面的明显的结论。自动创建统计的存在意味着某个真正的索引可能会从中受益。请考虑下列代码的输出:
USE tempdb
GO
IF OBJECTPROPERTY(OBJECT_ID('dbo.orders'), 'IsUserTable')=1
DROP TABLE dbo.orders
GO
SELECT * INTO tempdb..orders FROM northwind..orders
GO
SELECT * FROM tempdb..orders WHERE orderid = 10248
GO
SELECT * FROM tempdb..sysindexes WHERE id = object_id('orders')
AND name LIKE
'_wa_sys%'
GO
该代码在tempdb中复制Northwind Orders表,选择一行,然后检查SQL Server是否添加了一个统计。很显然,该表没有OrderId列的索引,所以SQL Server自动创建了名为_WA_Sys_OrderID_58D1301D 的统计。OrderId列统计表的存在表明Northwind Orders表将得益于附加的索引。
以下查询显示了为数据库中每个用户表自动创建的统计的数量,该数据库至少有一个自动创建的统计。
SELECT
object_name(id) TableName
,count(*) NumberOfAutoStats
FROM
sysindexes
WHERE
OBJECTPROPERTY(id, N'IsUserTable') = 1
AND INDEXPROPERTY ( id , name , 'IsAutoStatistics' ) = 1
GROUP BY
object_name(id)
ORDER BY
count(*) DESC
并不是所有的统计都可被真正的索引所替代。在某些情况下,SQL Server会为一个表自动创建超过50个统计。很明显,这些表的索引策略很差劲。对表及自动创建的与之相关联的统计的快速记数可以帮助您确定哪些表需要索引。
—Microsoft SQL Server开发团队
通过缓存数据库结果提高PHP性能(4)
构建客户端
现在,您已经针对 ORDERS 和 ORDER_ITEMS
通过缓存数据库结果提高PHP性能(2)
创建通知处理程序
现在,您可以创建一个通知处理程序,它将借助于上面介绍的 sendNotification
MySQL 卸载的问题
在安装 MySQL-client-4.1.16-1.glibc23.rpm 的时候
显示与 mysql-3.23.54a-11 冲突 可是我把那些冲突的文件名前面全部都加上#改名