摘要: 1. echo 1 > /proc/sys/net/ipv4/ip_forward 2. 在NAT服务器上添加以下规则: 在PREROUTING链中添加目的地址转换规则: iptables -t nat -I PREROUTING -i eth0 -p tcp --dpor 53 -j DNAT - 阅读全文
posted @ 2019-07-03 17:18 樊伟胜 阅读(910) 评论(0) 推荐(0)
摘要: 要使192.168.52.0/24网络内的计算机(这此计算机的网关应设为192.168.52.10)强制访问指定的站点,在做为防火墙的计算机(192.168.52.10)上应添加以下规则: 1. 打开ip包转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward 2. 阅读全文
posted @ 2019-07-03 17:17 樊伟胜 阅读(1129) 评论(0) 推荐(0)
摘要: 要使因特网上的计算机访问到内部网的FTP服务器、WEB服务器,在做为防火墙的计算机上应添加以下规则: 1. echo 1 > /proc/sys/net/ipv4/ip_forward 2. 发布内部网web服务器 iptables -t nat -I PREROUTING -p tcp -i et 阅读全文
posted @ 2019-07-03 17:17 樊伟胜 阅读(211) 评论(0) 推荐(0)
摘要: #iptables -D FORWARD -p udp --dport 8000 -j REJECT 阅读全文
posted @ 2019-07-03 17:14 樊伟胜 阅读(430) 评论(0) 推荐(0)
摘要: 除192.168.62.1外,禁止其它人ping我的主机 #iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type echo-request -j ACCEPT #iptables -A INPUT -i et 阅读全文
posted @ 2019-07-03 17:13 樊伟胜 阅读(3391) 评论(0) 推荐(0)
摘要: #iptables -A INPUT -p tcp --dport 3128 -j REJECT 阅读全文
posted @ 2019-07-03 17:12 樊伟胜 阅读(218) 评论(0) 推荐(0)
摘要: 只允许在192.168.62.1上使用ssh远程登录,从其它计算机上禁止使用ssh #iptables -A INPUT -s 192.168.62.1 -p tcp --dport 22 -j ACCEPT #iptables -A INPUT -p tcp --dport 22 -j DROP 阅读全文
posted @ 2019-07-03 17:11 樊伟胜 阅读(2114) 评论(0) 推荐(0)
摘要: SuperSocket服务器管理器文档 客户端安全证书验证 在 TLS/SSL 安全通信中, 客户端的安全证书不是必需的, 但是有些系统需要更高级别的安全保障. 因此有些用户提出了在服务器端验证客户端证书的需求. 现在在 SuperSocket 1.6 中, 这个新功能已经被加入了. 首先, 要启用 阅读全文
posted @ 2019-07-03 17:07 樊伟胜 阅读(498) 评论(0) 推荐(0)
摘要: 性能数据采集的应用程序接口作了修改,两个虚方法已经被更改: protected virtual void UpdateServerSummary(ServerSummary serverSummary); protected virtual void OnServerSummaryCollected 阅读全文
posted @ 2019-07-03 17:06 樊伟胜 阅读(531) 评论(0) 推荐(0)
摘要: 你可以指定你想要加载的证书的存储地点: <certificate storeName="My" storeLocation="LocalMachine" thumbprint="‎f42585bceed2cb049ef4a3c6d0ad572a6699f6f3"/> 阅读全文
posted @ 2019-07-03 17:06 樊伟胜 阅读(154) 评论(0) 推荐(0)
摘要: 你可以从服务器端主动连接客户端, 连接建立之后的网络通信处理将和客户端主动建立连接的处理方式一样。 var activeConnector = appServer as IActiveConnector; var task = activeConnector.ActiveConnect(remote 阅读全文
posted @ 2019-07-03 17:06 樊伟胜 阅读(796) 评论(0) 推荐(0)
摘要: 在 SuperSocket 1.5 中, 我们增加了 AppDomain 级别隔离的功能,让你可以运行多个服务器实例在相互独立的 AppDomain 上。 此功能提供了较高级别的安全性和资源的隔离,并且给哪些希望将SuperSocket当做多服务托管程序运行的用户带来了很多其他的帮助。 在 Supe 阅读全文
posted @ 2019-07-03 17:05 樊伟胜 阅读(700) 评论(3) 推荐(0)
摘要: 这个新增的功能只支持 .Net framework 4.5 及其以上版本。 它允许你设置所有线程的默认Culture, 不管这些线程是如何创建,通过代码或者来自于线程池. 这个新的配置属性 "defaultCulture" 可以加到配置根节点或者服务器实例节点,因此你可以为所有服务器实例配置默认的 阅读全文
posted @ 2019-07-03 17:03 樊伟胜 阅读(353) 评论(0) 推荐(0)
摘要: 在 SuperSocket 1.6 之前的版本, 当你通过Session对象发送文本时, 将文本信息转换成能够通过Socket传输的二进制数据的默认编码是UTF8。 你可以通过设置 Session 的 Charset 属性来修改这个编码。 现在在 SuperSocket 1.6 中, 你可以在配置中 阅读全文
posted @ 2019-07-03 17:02 樊伟胜 阅读(879) 评论(0) 推荐(0)
摘要: SuperSocket 服务器管理器当前有两种类型的客户端, Silverlight客户端和WPF客户端。这两种客户端的代码都在源代码中的"Management"目录,你可以自行编译然后使用他们。 我们还提供了能够直接使用的在线的Silverlight服务器管理器客户端: http://server 阅读全文
posted @ 2019-07-03 16:35 樊伟胜 阅读(404) 评论(0) 推荐(0)
摘要: 什么 SuperSocket 服务管理器? SuperSocket 服务管理器是一个让你能够在客户中用图形化界面来管理和监控你的SuperSocket服务器程序的组件. 在服务器端配置服务器管理器 事实上, 服务器管理器是一个独立的 SuperSocket AppServer。 要让起作用,首先你要 阅读全文
posted @ 2019-07-03 16:33 樊伟胜 阅读(526) 评论(0) 推荐(0)
摘要: SuperSocket通过(Mono 2.10或更新版本)来实现跨平台的特性 由于Unix/Linux不同于Windows上的文件路径格式,SuperSocket提供了专用于Unix/Linux系统上的log4net文件:/Solution Items/log4net.unix.config 因此, 阅读全文
posted @ 2019-07-03 16:31 樊伟胜 阅读(317) 评论(0) 推荐(0)
摘要: 配置和使用 Input Endpoint 由于Windows Azure的内部网络架构,你不能直接监听你配置中的IP和端口。在这种情况下,你需要在Windows Azure项目中配置Input Endpoint: 这些 endpoint的命名规则是 "AppServerName_Configured 阅读全文
posted @ 2019-07-03 16:23 樊伟胜 阅读(494) 评论(0) 推荐(0)
摘要: 与其它SuperSocket程序相同,启动代码同样也要写到程序的入口处,如 Windows Azure 的 WorkRole 项目的OnStart() 方法: public override bool OnStart() { // Set the maximum number of concurre 阅读全文
posted @ 2019-07-03 16:22 樊伟胜 阅读(178) 评论(0) 推荐(0)
摘要: 关键字: Windows Azure, WorkRole, InputEndPoint, 云计算, 微软云 什么是 Windows Azure? Windows Azure 是微软的云计算平台!微软的Windows Azure通过它的数据中心提供了按需分配的计算能力和存储空间用于在互联网上托管,扩展 阅读全文
posted @ 2019-07-03 16:21 樊伟胜 阅读(188) 评论(0) 推荐(0)
摘要: 你也可以通过本地证书仓库的证书,而不是使用一个物理文件。 你只需要在配置中设置你要使用的证书的storeName和thumbprint: <server name="EchoServer" serverTypeName="EchoService" ip="Any" port="443" securi 阅读全文
posted @ 2019-07-03 16:18 樊伟胜 阅读(344) 评论(0) 推荐(0)
摘要: 你需要通过下面的步骤修改配置文件来使用你准备好的证书文件: 在server节点设置security属性; 在server节点下增加certificate子节点; 最后配置应该像这样: <server name="EchoServer" serverTypeName="EchoService" ip= 阅读全文
posted @ 2019-07-03 16:15 樊伟胜 阅读(686) 评论(0) 推荐(0)
摘要: 关键字: TLS, SSL, 传输层加密, 传输层安全, 证书使用, X509Certificate SuperSocket 支持传输层加密(TLS/SSL) SuperSocket 有自动的对TLS/SSL的支持,你可以无须增加或者修改任何代码,就能让你的服务器支持TLS/SSL。 想要为你的 S 阅读全文
posted @ 2019-07-03 16:14 樊伟胜 阅读(605) 评论(0) 推荐(0)
摘要: 关键字: 策略服务器, Flash策略服务器, Silverlight策略服务器, Policy Server, Flash Policy Server, Silverlight Policy Server SuperSocket 包含一个可用于Flash和Silverlight的Socket策略服 阅读全文
posted @ 2019-07-03 16:13 樊伟胜 阅读(212) 评论(0) 推荐(0)
摘要: <?xml version="1.0"?> <configuration> <configSections> <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, S 阅读全文
posted @ 2019-07-03 16:13 樊伟胜 阅读(165) 评论(0) 推荐(0)
摘要: SuperSocket 允许你自定义你的 Logger。 例如,你如果想要把你的业务操作日志保存到一个独立的地方,你仅需要在log4net配置文件中添加一个新的 logger 并为这个 logger 设置相应的 appender(假设你默认使用log4net): <appender name="my 阅读全文
posted @ 2019-07-03 16:07 樊伟胜 阅读(322) 评论(0) 推荐(0)
摘要: SuperSocket的日志功能非常简单,你几乎可以在任何地方都能记录日志。 AppServer 和 AppSession 都有Logger属性, 你可以直接用它来记录日志。 以下代码演示了日志接口的使用: A - /// <summary> /// PolicyServer base class 阅读全文
posted @ 2019-07-03 16:06 樊伟胜 阅读(327) 评论(0) 推荐(0)
摘要: 当 SuperSocket boostrap 启动时,日志系统将会自动启动。 所以你无须创建自己的日志工具,最好直接使用SuperSocket内置的日志功能。 SuperSocket 默认使用log4net作为第三方日志框架。 所以如果你熟悉log4net,你就能非常容易的使用和自定义SuperSo 阅读全文
posted @ 2019-07-03 16:01 樊伟胜 阅读(698) 评论(0) 推荐(0)
摘要: 步骤如下: 1.添加 DLR (dynamic language runtime) 配置片段; Section 定义: <section name="microsoft.scripting" requirePermission="false" type="Microsoft.Scripting.Ho 阅读全文
posted @ 2019-07-03 16:00 樊伟胜 阅读(201) 评论(0) 推荐(0)
摘要: 现在, 如果你有一个命令行协议的服务器实例 "IronPythonServer", 而且我们要用 Python 创建一个 "ADD" 命令用于让两个整数相加,然后把计算结果返回给客户端, 我们就要完成下面的步骤: 1.创建 python 脚本文件 "ADD.py", 并书写如下内容: def exe 阅读全文
posted @ 2019-07-03 16:00 樊伟胜 阅读(389) 评论(0) 推荐(0)
摘要: 由于我们无法像 C# 中一样方便的将 CLR 属性添加到 Python 文件或者函数中,因此我们需要定义一个函数 "getFilters()" 用于将命令过滤器方会给 CLR 运行时. ADD.py def getFilters(): return [LogTimeCommandFilter(), 阅读全文
posted @ 2019-07-03 16:00 樊伟胜 阅读(265) 评论(0) 推荐(0)
摘要: 你可以增加一个子节点 "listeners" 用于添加多对监听 ip/port: <superSocket> <servers> <server name="EchoServer" serverTypeName="EchoService"> <listeners> <add ip="127.0.0. 阅读全文
posted @ 2019-07-03 15:59 樊伟胜 阅读(463) 评论(0) 推荐(0)
摘要: 在下面的配置中,你可以配置服务器的监听 ip/port: <superSocket> <servers> <server name="TelnetServer" serverType="SuperSocket.QuickStart.TelnetServer_StartByConfig.TelnetS 阅读全文
posted @ 2019-07-03 15:58 樊伟胜 阅读(223) 评论(0) 推荐(0)
摘要: 关键字: 命令过滤器, 命令, 过滤器, OnCommandExecuting, OnCommandExecuted SuperSocket 中的命令过滤器看起来有些像 ASP.NET MVC 中的 Action Filter,你可以用它来做命令执行的拦截,命令过滤器会在命令执行前和执行后被调用。 阅读全文
posted @ 2019-07-03 15:53 樊伟胜 阅读(475) 评论(0) 推荐(0)
摘要: SuperSocket 支持以下配置选项的热更新: * logCommand * idleSessionTimeOut * maxRequestLength * logBasicSessionActivity * logAllSocketException SuperSocket 支持所有自定义配置 阅读全文
posted @ 2019-07-03 15:49 樊伟胜 阅读(291) 评论(0) 推荐(0)
摘要: Keywords: 配置,热更新 此功能能够允许你在不重启服务器的前提下更新服务器实例的配置。 (仅限1.6.5及其以上版本) 阅读全文
posted @ 2019-07-03 15:48 樊伟胜 阅读(290) 评论(0) 推荐(0)
摘要: 关键字: 扩展配置, 自定义配置, 自定义属性, GetChildConfig, 读取配置,子节点 当你使用 SuperSocket 实现 Socket 服务器的时候,不可避免的需要在配置文件中定义一些参数。 SuperSocket 提供了非常简单的方法,让你在配置文件中定义这些参数,然后在你的代码 阅读全文
posted @ 2019-07-03 15:44 樊伟胜 阅读(393) 评论(0) 推荐(1)
摘要: 如果你有一个自定义的属性 "CompanyId" 在你的 AppSession 类之中,如果你想要获取这个属性等于某值的 的所有 Session, 你可以使用 AppServer 的方法 GetSessions(...): var sessions = appServer.GetSessions(s 阅读全文
posted @ 2019-07-03 15:43 樊伟胜 阅读(781) 评论(0) 推荐(0)
摘要: 你也可以从 AppServer 实例获取所有连接上的 session 然后推送数据到所有客户端: foreach(var session in appServer.GetAllSessions()) { session.Send(data, 0, data.Length); } 如果你启用了 Ses 阅读全文
posted @ 2019-07-03 15:42 樊伟胜 阅读(1138) 评论(0) 推荐(0)
摘要: 关键字: 主动推送, 推送数据, 客户端推送, 获取Session, 发送数据, 回话快照 通过Session对象发送数据到客户端 前面已经说过,AppSession 代表了一个逻辑的 socket 连接,基于连接的操作都应该定义在此类之中。 这个AppSession 类也封装了通过 socket 阅读全文
posted @ 2019-07-03 15:41 樊伟胜 阅读(1105) 评论(0) 推荐(0)
摘要: 前面提到过,如果你获取了连接的 Session 实例,你就可以通过 "Send()" 方法向客户端发送数据。但是在某些情况下,你无法直接获取 Session 实例。 SuperSocket 提供了一个 API 让你从 AppServer 的 Session 容器中通过 SessionID 获取 Se 阅读全文
posted @ 2019-07-03 15:41 樊伟胜 阅读(812) 评论(0) 推荐(0)
摘要: 订阅事件: appServer.NewSessionConnected += new SessionHandler<AppSession>(appServer_NewSessionConnected); appServer.SessionClosed += new SessionHandler<Ap 阅读全文
posted @ 2019-07-03 15:38 樊伟胜 阅读(879) 评论(0) 推荐(0)
摘要: 关键字: 连接事件, 断开事件, OnSessionStarted,OnSessionClosed, NewSessionConnected, SessionClosed AppSession 的虚方法 OnSessionStarted() 和 OnSessionClosed(CloseReason 阅读全文
posted @ 2019-07-03 15:37 樊伟胜 阅读(1119) 评论(0) 推荐(0)
摘要: 是的,SuperSocket是用反射来查找哪些公开的类实现了基本的命令接口,但是它只在你的AppServer类定义的程序集中查找。 举例来说, 你的 AppServer 定义在程序集 GameServer.dll 中, 但是你的 ADD 命令是定义在程序集 BasicModules.dll 中: G 阅读全文
posted @ 2019-07-03 15:35 樊伟胜 阅读(276) 评论(0) 推荐(0)
摘要: 在某些情况下,你可能希望通过直接的方式来加载命令,而不是通过自动的反射。 如果是这样,你可以实现你自己的命令加载器 (Command Loader): public interface ICommandLoader<TCommand> 然后配置你的服务器来使用你新建的命令加载器 (Command L 阅读全文
posted @ 2019-07-03 15:35 樊伟胜 阅读(427) 评论(0) 推荐(0)
摘要: 关键字: 命令, 命令加载器, 多命令程序集 命令 (Command) SuperSocket 中的命令设计出来是为了处理来自客户端的请求的, 它在业务逻辑处理之中起到了很重要的作用。 命令类必须实现下面的基本命令接口: public interface ICommand<TAppSession, 阅读全文
posted @ 2019-07-03 15:34 樊伟胜 阅读(783) 评论(0) 推荐(0)
摘要: 现在, 你已经有了 RequestInfo, ReceiveFilter 和 ReceiveFilterFactory, 但是你还没有正式使用它们. 如果你想让他们在你的程序里面可用, 你需要定义你们的 AppSession 和 AppServer 来使用他们. 1.为 AppSession 设置 阅读全文
posted @ 2019-07-03 15:33 樊伟胜 阅读(304) 评论(0) 推荐(0)
摘要: 接收过滤器工厂(ReceiveFilterFactory)用于为每个会话创建接收过滤器. 定义一个过滤器工厂(ReceiveFilterFactory)类型, 你必须实现接口 IReceiveFilterFactory. 类型参数 "TRequestInfo" 是你要在整个程序中使用的请求类型 // 阅读全文
posted @ 2019-07-03 15:20 樊伟胜 阅读(1026) 评论(0) 推荐(0)
摘要: 接收过滤器(ReceiveFilter)用于将接收到的二进制数据转化成请求实例(RequestInfo)。 实现一个接收过滤器(ReceiveFilter), 你需要实现接口 IReceiveFilter: public interface IReceiveFilter<TRequestInfo> 阅读全文
posted @ 2019-07-03 15:19 樊伟胜 阅读(1552) 评论(0) 推荐(0)
摘要: 内置的命令行协议(接受自定义,分隔符为“:”,“,”): 命令行协议定义了每个请求必须以回车换行结尾 "\r\n"。 由于 SuperSocket 中内置的命令行协议用空格来分割请求的Key和参,因此当客户端发送如下数据到服务器端时: "LOGIN kerry 123456" + NewLine S 阅读全文
posted @ 2019-07-03 15:18 樊伟胜 阅读(647) 评论(0) 推荐(0)
摘要: 请求类型 StringRequestInfo 用在 SuperSocket 命令行协议中。 你也可以根据你的应用程序的需要来定义你自己的请求类型。 例如, 如果所有请求都包含 DeviceID 信息,你可以在RequestInfo类里为它定义一个属性 SuperSocket 还提供了另外一个请求类 阅读全文
posted @ 2019-07-03 15:18 樊伟胜 阅读(1072) 评论(0) 推荐(0)
摘要: ² 简单易用,只需要几个类就能创建出健壮的Socket服务器端程序 ² 性能优良, 稳定可靠 ² 支持各种协议, 内置的协议解析工具让你把实现通信协议这种复杂的工作变得很简单 ² 自动支持SSL/TLS传输层加密 ² 强大,灵活而且可扩展的配置让你开发Socket服务器省时省力 ² 支持多个sock 阅读全文
posted @ 2019-07-03 15:16 樊伟胜 阅读(584) 评论(0) 推荐(0)
摘要: 总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上. “同时,确保数据表空间和索引表空间置与不同的硬盘上.”可能改为如下更为准确 “同时,确保数据表空间和索引表空间 阅读全文
posted @ 2019-07-03 12:01 樊伟胜 阅读(437) 评论(0) 推荐(0)
摘要: 使用较大的BUFFER(比如10MB , 10,240,000)可以提高EXPORT和IMPORT的速度. ORACLE将尽可能地获取你所指定的内存大小,即使在内存不满足,也不会报错.这个值至少要和表中最大的列相当,否则列值会被截断. 译者按: 可以肯定的是, 增加BUFFER会大大提高EXPORT 阅读全文
posted @ 2019-07-03 12:00 樊伟胜 阅读(517) 评论(0) 推荐(0)
摘要: 使用隐式的游标,将会执行两次操作. 第一次检索记录, 第二次检查TOO MANY ROWS 这个exception . 而显式游标不执行第二次操作. 阅读全文
posted @ 2019-07-03 11:59 樊伟胜 阅读(249) 评论(0) 推荐(0)
摘要: 当使用日期是,需要注意如果有超过5位小数加到日期上, 这个日期会进到下一天! 例如: 1. SELECT TO_DATE(‘01-JAN-93’+.99999) FROM DUAL; Returns: ’01-JAN-93 23:59:59’ 2. SELECT TO_DATE(‘01-JAN-93 阅读全文
posted @ 2019-07-03 11:58 樊伟胜 阅读(183) 评论(0) 推荐(0)
摘要: 提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多. 低效: SELECT JOB , AVG(SAL) FROM EMP GROUP JOB HAVING JOB = ‘PRESIDENT’ OR JOB = ‘ 阅读全文
posted @ 2019-07-03 11:57 樊伟胜 阅读(5292) 评论(0) 推荐(0)
摘要: 带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 例如,一个UNION查询,其中每个查询都带有GROUP BY子句, GROUP B 阅读全文
posted @ 2019-07-03 11:55 樊伟胜 阅读(441) 评论(0) 推荐(0)
摘要: 基于成本的优化器(CBO, Cost-Based Optimizer)对索引的选择性进行判断来决定索引的使用是否能提高效率. 如果索引有很高的选择性, 那就是说对于每个不重复的索引键值,只对应数量很少的记录. 比如, 表中共有100条记录而其中有80个不重复的索引键值. 这个索引的选择性就是80/1 阅读全文
posted @ 2019-07-03 11:54 樊伟胜 阅读(279) 评论(0) 推荐(0)
摘要: 如果你对一个列和一组有限的值进行比较, 优化器可能执行多次扫描并对结果进行合并连接. 举例: SELECT * FROM LODGING WHERE MANAGER IN (‘BILL GATES’,’KEN MULLER’); 优化器可能将它转换成以下形式 SELECT * FROM LODGIN 阅读全文
posted @ 2019-07-03 11:53 樊伟胜 阅读(177) 评论(0) 推荐(0)
摘要: 某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子. 在下面的例子里, ‘!=’ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. 不使用索引: SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT 阅读全文
posted @ 2019-07-03 11:50 樊伟胜 阅读(289) 评论(0) 推荐(0)
摘要: 当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换. 假设 EMPNO是一个数值类型的索引列. SELECT … FROM EMP WHERE EMPNO = ‘123’ 实际上,经过ORACLE类型转换, 语句转化为: SELECT … FROM EMP WHERE EMPNO 阅读全文
posted @ 2019-07-03 11:46 樊伟胜 阅读(473) 评论(0) 推荐(0)
摘要: ORDER BY 子句只在两种严格的条件下使用索引. ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. ORDER BY中所有的列必须定义为非空. WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列. 例如: 表DEPT包含以下列: DEPT_CODE P 阅读全文
posted @ 2019-07-03 11:45 樊伟胜 阅读(1046) 评论(0) 推荐(0)
摘要: 对于表的访问,可以使用两种Hints. FULL 和 ROWID FULL hint 告诉ORACLE使用全表扫描的方式访问指定表. 例如: SELECT /*+ FULL(EMP) */ * FROM EMP WHERE EMPNO = 7893; ROWID hint 告诉ORACLE使用TAB 阅读全文
posted @ 2019-07-03 11:44 樊伟胜 阅读(865) 评论(0) 推荐(0)
摘要: 当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. 举例: 低效: SELECT ACCT_NUM, BALANCE_AMT FRO 阅读全文
posted @ 2019-07-03 11:23 樊伟胜 阅读(704) 评论(0) 推荐(0)
摘要: 当执行查询时,ORACLE采用了内部的操作. 下表显示了几种重要的内部操作. ORACLE Clause 内部操作 ORDER BY SORT ORDER BY UNION UNION-ALL MINUS MINUS INTERSECT INTERSECT DISTINCT,MINUS,INTERS 阅读全文
posted @ 2019-07-03 11:22 樊伟胜 阅读(205) 评论(0) 推荐(0)
摘要: 避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中. 举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B 阅读全文
posted @ 2019-07-03 11:09 樊伟胜 阅读(4757) 评论(3) 推荐(2)
摘要: 如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 译者按: 这也是一条简单而重要的规则. 见以下实例. SQL> create table multiindexusage ( inda number , indb num 阅读全文
posted @ 2019-07-03 11:09 樊伟胜 阅读(399) 评论(0) 推荐(0)
摘要: 下面的查询可以被更有效率的语句替换: 低效: SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30 高效 SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30); 这是一 阅读全文
posted @ 2019-07-03 11:01 樊伟胜 阅读(2312) 评论(0) 推荐(0)
摘要: 通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引. 高效: SELE 阅读全文
posted @ 2019-07-03 11:00 樊伟胜 阅读(2900) 评论(0) 推荐(0)
摘要: 如果DEPTNO上有一个索引, 高效: SELECT * FROM EMP WHERE DEPTNO >=4 低效: SELECT * FROM EMP WHERE DEPTNO >3 两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前 阅读全文
posted @ 2019-07-03 10:59 樊伟胜 阅读(988) 评论(0) 推荐(0)
摘要: 通常, 我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的 影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描. 举例: 低效: (这里,不使用索引) SELECT … FROM DEPT WHERE DEPT_CODE NOT = 0; 高效: (这里 阅读全文
posted @ 2019-07-03 10:57 樊伟胜 阅读(561) 评论(0) 推荐(0)
摘要: 如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一性. 在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯一性索引. 举例: SELECT ENAME FROM EMP WHERE EMPNO = 2326 AND DEPTNO = 20 ; 这里,只有EMPNO上的索引 阅读全文
posted @ 2019-07-03 10:46 樊伟胜 阅读(597) 评论(0) 推荐(0)
摘要: WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描. 举例: 低效: SELECT … FROM DEPT WHERE SAL * 12 > 25000; 高效: SELECT … FROM DEPT WHERE SAL > 25000/12; 这是一个非常实用的规则,请务 阅读全文
posted @ 2019-07-03 10:45 樊伟胜 阅读(358) 评论(0) 推荐(0)
摘要: 如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) . 举例: SELECT ENAME FROM EMP WHERE EMPNO = 7935 AND DEPTNO + 0 = 10 /*DEPTNO上的索引将失效*/ AND EMP_T 阅读全文
posted @ 2019-07-03 10:39 樊伟胜 阅读(1531) 评论(0) 推荐(0)
摘要: 当ORACLE无法判断索引的等级高低差别,优化器将只使用一个索引,它就是在WHERE子句中被列在最前面的. 举例: DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. SELECT ENAME FROM EMP WHERE DEPTNO > 20 AND EMP_CAT > ‘A 阅读全文
posted @ 2019-07-03 10:30 樊伟胜 阅读(326) 评论(0) 推荐(0)
摘要: 当SQL语句的执行路径可以使用分布在多个表上的多个索引时, ORACLE会同时使用多个索引并在运行时对它们的记录进行合并, 检索出仅对全部索引有效的记录. 在ORACLE选择执行路径时,唯一性索引的等级高于非唯一性索引. 然而这个规则只有 当WHERE子句中索引列和常量比较才有效.如果索引列和其他表 阅读全文
posted @ 2019-07-03 10:29 樊伟胜 阅读(953) 评论(0) 推荐(0)
摘要: 当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较. 举例: DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. SELECT ENAME FROM EMP WHERE DEPTNO > 20 AND EMP_CAT = ‘A’; 这里只有EMP_C 阅读全文
posted @ 2019-07-03 10:29 樊伟胜 阅读(425) 评论(0) 推荐(0)
摘要: 基础表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问). 根据优化器的不同, SQL语句中基础表的选择是不一样的. 如果你使用的是CBO (COST BASED OPTIMIZER),优化器会检查SQL语句中的每个表的物理大小,索引的状态,然后选用花费最低的执行路径. 阅读全文
posted @ 2019-07-03 10:26 樊伟胜 阅读(496) 评论(0) 推荐(0)
摘要: ORACLE对索引有两种访问模式. 索引唯一扫描 ( INDEX UNIQUE SCAN) 大多数情况下, 优化器通过WHERE子句访问INDEX. 例如: 表LODGING有两个索引 : 建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING 阅读全文
posted @ 2019-07-03 10:25 樊伟胜 阅读(550) 评论(0) 推荐(0)
摘要: 索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索 阅读全文
posted @ 2019-07-03 10:24 樊伟胜 阅读(1078) 评论(0) 推荐(0)
摘要: EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称. 你需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析 阅读全文
posted @ 2019-07-03 10:10 樊伟胜 阅读(2732) 评论(0) 推荐(0)
摘要: SQL trace 工具收集正在执行的SQL的性能状态数据并记录到一个跟踪文件中. 这个跟踪文件提供了许多有用的信息,例如解析次数.执行次数,CPU使用时间等.这些数据将可以用来优化你的系统. 设置SQL TRACE在会话级别: 有效 ALTER SESSION SET SQL_TRACE TRUE 阅读全文
posted @ 2019-07-03 09:51 樊伟胜 阅读(194) 评论(0) 推荐(0)
摘要: 用下列SQL工具找出低效SQL: SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, ROUND(DISK_READS/EXECUTIONS,2) 阅读全文
posted @ 2019-07-03 09:48 樊伟胜 阅读(657) 评论(0) 推荐(0)
摘要: 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换 例如: 低效: SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E WHERE D.DEPT_NO = E.DE 阅读全文
posted @ 2019-07-03 09:47 樊伟胜 阅读(1521) 评论(0) 推荐(1)
摘要: 通常来说 , 采用表连接的方式比EXISTS更有效率 SELECT ENAME FROM EMP E WHERE EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT_NO = E.DEPT_NO AND DEPT_CAT = ‘A’); (更高效) SELECT ENAM 阅读全文
posted @ 2019-07-03 09:23 樊伟胜 阅读(964) 评论(0) 推荐(0)
摘要: 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 低效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN (SELECT DEPTNO 阅读全文
posted @ 2019-07-03 09:10 樊伟胜 阅读(1093) 评论(0) 推荐(0)
摘要: 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. 例如: SELECT … FROM EMP WH 阅读全文
posted @ 2019-07-03 09:10 樊伟胜 阅读(1430) 评论(0) 推荐(0)
摘要: 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误. (Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中出现这个Column时,SQL解析器无法判断这个Column 阅读全文
posted @ 2019-07-03 09:09 樊伟胜 阅读(3680) 评论(0) 推荐(0)
摘要: SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*) FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H WHERE H.EMPNO = E.EMPNO AND H.HIST_TYPE = T.HIST_TYPE 阅读全文
posted @ 2019-07-03 09:08 樊伟胜 阅读(494) 评论(0) 推荐(0)
摘要: 在含有子查询的SQL语句中,要特别注意减少对表的查询. 例如: 低效 SELECT TAB_NAME FROM TABLES WHERE TAB_NAME = ( SELECT TAB_NAME FROM TAB_COLUMNS WHERE VERSION = 604) AND DB_VER= ( 阅读全文
posted @ 2019-07-03 09:07 樊伟胜 阅读(307) 评论(0) 推荐(0)
摘要: 和一般的观点相反, count(*) 比count(1)稍快 , 当然如果可以通过索引检索,对索引列的计数仍旧是最快的. 例如 COUNT(EMPNO) 阅读全文
posted @ 2019-07-03 09:06 樊伟胜 阅读(2929) 评论(0) 推荐(0)
摘要: 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. 例如: 低效: SELECT REGION,AVG(LOG_SIZE) FROM LOCATION GROUP B 阅读全文
posted @ 2019-07-03 09:06 樊伟胜 阅读(633) 评论(0) 推荐(0)
摘要: 只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少: COMMIT所释放的资源: a. 回滚段上用于恢复数据的信息. b. 被程序语句获得的锁 c. redo log buffer 中的空间 d. ORACLE为管理上述3种资源中的内部花 阅读全文
posted @ 2019-07-03 09:04 樊伟胜 阅读(406) 评论(0) 推荐(0)
摘要: 最高效的删除重复记录方法 ( 因为使用了ROWID) DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO); 阅读全文
posted @ 2019-07-03 08:55 樊伟胜 阅读(265) 评论(0) 推荐(0)
摘要: 当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务, ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行 阅读全文
posted @ 2019-07-03 08:55 樊伟胜 阅读(367) 评论(0) 推荐(0)
摘要: 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) 例如: SELECT NAME FROM EMP WHERE EMP_NO = 1234; SELECT NAME FROM DPT WHERE DPT_NO = 10 ; SELECT NAME FROM CA 阅读全文
posted @ 2019-07-03 08:54 樊伟胜 阅读(390) 评论(0) 推荐(0)
摘要: 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. 例如: SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND ENAME LIKE ‘SMITH%’; SELECT COUNT(*),SUM(SAL) FROM EMP 阅读全文
posted @ 2019-07-03 08:54 樊伟胜 阅读(681) 评论(0) 推荐(0)
摘要: 当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量. 例如, 以下有三种方法可以检索出雇员号等于0342或0291的职员. 方法1 (最低效) SE 阅读全文
posted @ 2019-07-03 08:46 樊伟胜 阅读(263) 评论(0) 推荐(0)
摘要: 当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法. 不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有 的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间. 阅读全文
posted @ 2019-07-03 08:44 樊伟胜 阅读(1493) 评论(0) 推荐(0)