SVS 没有尽头

SVS is SQL & Visual Studio
随笔 - 21, 评论 - 29, 引用 - 0

导航

关于

做技术的路没有尽头,你只能看到前方几公里,但是更远的地方总是看不太清,当远处的景色渐渐清晰,回首看,有我们深深的足迹。兄弟们,上路吧,前方还有更多的难关,也有更美的景色。

每月存档

最新留言

  • re:在Transaction Replication环境中BLOB字段数据的处理
    <p>ed hardy a famous ed hardy store which sell directly ed hardy clothing, shoes, boots, swim...
    by ghds(注册) on 2010/2/27 17:12:44
  • ghd central
    <p>Choose, buy and shop for on sale tiffany jewelry including Tiffany &amp; Co Silver Nec...
    by ghds(注册) on 2010/2/27 17:11:53
  • Re
    The easiest way out to have a good grade is to get the great <a href="http://www.primewritin...
    by EMILY18(注册) on 2009/12/30 5:03:28
  • re:StreamInsight系列-Adapter
    <p>联系着看东西也会累的更别说写了</p>
    by onbove(注册) on 2009/12/28 0:50:54
  • re:StreamInsight系列-Adapter
    <p>同感啊</p>
    by onbove(注册) on 2009/12/28 0:50:06
  • re:StreamInsight系列-Adapter
    里面有张图地址在下面,我不知道怎么贴图上去 http://i.msdn.microsoft.com/Ee391355.6d4f7698-79da-4eaf-9def-d24bc76f6687(en-...
    by sun.wei(注册) on 2009/12/25 15:58:30
  • re:StreamInsight系列-Adapter
    里面有张图地址在下面,我不知道怎么贴图上去 http://i.msdn.microsoft.com/Ee391355.6d4f7698-79da-4eaf-9def-d24bc76f6687(en-...
    by sun.wei(注册) on 2009/12/25 15:58:21
  • re:StreamInsight系列-What it is
    <p>AHA, this is the first post i saw in Chinese on StreamInsight</p>
    by zee(注册) on 2009/12/25 12:12:27
  • re:RBS 补充解释
    <p>嗯,很不错的介绍。只可惜对那些刚刚开始了解RBS的人帮助会比较有限。如果再能写几篇introductory的文章就好了。</p>
    by demonfox(注册) on 2009/11/19 17:27:42
  • 黑客技术培训_www.hackes.cn
    <p>中国偶然黑客联盟黑客技术学习培训</p> <p>&nbsp; 名称:偶然网络科技 联系QQ:692566045 邮箱:<a href=&...
    by yumen1011(注册) on 2009/11/10 4:02:37

广告

【第1页/共3页,21条】
首页
前页
1
2009年12月29日

坚持每天写Blog真的是一件很困难的事情,到现在也没搞明白怎么在这个Blog上传图片和附件,只能辛苦大家读读文字和代码片段了。

QueryTemplate 就是我们在CEP服务器上预定义好并持续运行的分析和处理提交事件的业务逻辑,简单的来说就是业务逻辑的定义。

我们写程序的时候都喜欢搞内聚低藕和的东西,同样我们写程序的时候也喜欢把数据连接和查询逻辑分开,同样在StreamInsight中Adapter是负责数据的输入和输出,QueryTemplate的主要功能就是忽略Adapter是业务逻辑独立出来。例如

  CepStream<NetWorkPacket> packetStream = CepStream<NetWorkPacket>.Create("networkInput");
var avgcount = from oneminpacket in packetStream.AlterEventDuration
                   (e => TimeSpan.FromSeconds(1))
               group oneminpacket by oneminpacket.Destination into onegroup
               from eventwindow in onegroup.Snapshot()
               select new { destination = onegroup.Key, packagecount = eventwindow.Count(),packageAvgSize=eventwindow.Avg(e=>e.Length) };
          return application.CreateQueryTemplate("destinationOutput", avgcount);

这里的packetStream只是定义了事件流的泛型,但是我们不必考虑这个流怎么传入的

QueryBinder就是一个Helper,他将InputAdapter\OutputAdapter以及QueryTemplate绑定在一起,实现对业务处理的组装。

private static QueryBinder BindQuery(InputAdapter networkInputAdapter, OutputAdapter traceOutputAdapter, QueryTemplate queryTemplate)
        {
            QueryBinder queryBinder = new QueryBinder(queryTemplate);
            var networkConfig = new NetworkInputConfig
            {
                InterfaceAddress = "192.168.0.118",
                InputFieldOrders = new List<string>() {
                    "Length", "Source", "Destination", "SourcePort", "DestinationPort",
                    "Content"
                },
                CtiFrequency=3
            };
            var outputConfig = new TraceConfig()
            {
                DisplayCtiEvents = false,
                TraceName = "consoleout",
                TraceType = TraceTypeValue.Console
            };
            queryBinder.BindProducer("networkInput", networkInputAdapter, networkConfig, EventShape.Point);
            queryBinder.AddConsumer<TextFileOutputConfig>("queryresult", traceOutputAdapter, outputConfig, EventShape.Point,StreamEventOrder.ChainOrdered);

            return queryBinder;
        }

最后的Query就我们需要运行的处理实例。一旦Query运行,就会按照输入的事件进行处理并输出。

Query query = application.CreateQuery("Network_traffic_query", queryBinder, "Minute average count,filtered by address");

query.Start();

 

有了Adapter和今天提到的Query,你的StreamInsight程序就基本上差不多了,下次再写点Host和Debug的东西。

posted on 2009-12-29 21:34:20 by sun.wei  评论(2) 阅读(1835)

 
2009年12月25日

坚持每天都有Post真的是一件很困难的事情,除非是那种宅男或是患有强烈的电脑依赖症。连续写东西真的很累。

今天聊聊StreamInsight中的Adapter,这是一个很大的话题,但是很重要,因为数据的输入和输出都要靠他了。开发Adapter不是很困难的事情,但是需要先了解一下Adapter的工作机制。Adapter是基于状态机的模式进行工作我们的代码主要是实现如果在不同状态间切换及如何从数据源中获取信息并构造事件数据。

 

当Adpater创建后通过Query的启动来调用Aapter的Start方法,之后AdapterState进入Running状态,这个时候我们需要通过代码实现对事件的创建及Enqueue操作,Enqueue会返回一个结果,表示队列的状态,如果状态为进入Suppended状态,当可用时StreamInsight会调用Resume()方法重新是Adapter进入Running状态。这个图上给出的是InputAdapter和OutputAdapter的状态图。

Adapter的停止将分为2个状态Stopping和Stopped,我们在处理和生成事件的时候要注意AdapterState,如果是Stopping需要对缓冲区的数据进行处理。

Adapter的创建需要通过工厂模式进行实例化。首先我们要实现IInputAdapterFactory\ITypeInputAdapterFactory或对应的OutputAdapterFactory,这个是成对出现的。这2中接口分别用于创建弱类型和强类型的AdapterFactory,我个人认为弱类型会灵活一些,强类型的性能稍好一些,并可以编译检查,具体使用需要结合需求。下面是我的一个AdpaterFactory的代码。其中的我只处理对于Point类型Event的处理,并返回NetworkPointInput这个Adapter。

public struct NetworkInputConfig
    {

//网络监听地址
        public string InterfaceAddress { get; set; }

//CTI
        public int CtiFrequency { get; set; }

//输入数据字段名称及顺序
        public List<string> InputFieldOrders { get; set; }
    }
    public  class NetworkInputFactory:IInputAdapterFactory<NetworkInputConfig>
    {
        public InputAdapterBase Create(NetworkInputConfig configInfo, EventShape eventShape, CepEventType cepEventType)
        {
            InputAdapterBase adapter = default(InputAdapterBase);
            if (eventShape == EventShape.Point)
            {
                adapter = new NetworkPointInput(configInfo, cepEventType);
            }
            else
            {
                throw new ArgumentException("The adapter cannot instance adapter with event shape {0}", eventShape.ToString());
            }
            return adapter;
        }
        public void Dispose()
        {
        }
    }

针对Adapter我们需要继承PointInputAdapter类,并重载Resume()和Start()方法。当然我们还需要写构造函数接受AdapterFactory中传入的config和cepEventType.

public NetworkPointInput(NetworkInputConfig configInfo, CepEventType cepEventType)
    {
        _bindtimeEventType = cepEventType;
        _ctiFrequency = configInfo.CtiFrequency;
        foreach (PcapDevice device in Pcap.GetAllDevices())
        {
            foreach (PcapAddress address in device.Addresses)
            {
                if (address.Addr.ipAddress.ToString() == configInfo.InterfaceAddress)
                {
                    _device = device;
                    break;
                }
            }
            if (_device != null)
                break;
        }
        if (_device == null)
            throw new ArgumentException("Interface address is not found");
        _inputOrdinalToCepOrdinal = new Dictionary<int, int>();
        //配置文件字段数量与CepEventType字段数量不一致
        if (configInfo.InputFieldOrders != null && configInfo.InputFieldOrders.Count != cepEventType.Fields.Count)
        {
            throw new ArgumentException(
                string.Format(CultureInfo.InvariantCulture,
                "The configuration element InputFieldOrders should have {0} elements, but it only has {1} elements",
                cepEventType.Fields.Count,
                configInfo.InputFieldOrders.Count));
        }
        CepEventTypeField engineField;
        for (int i = 0; i < cepEventType.Fields.Count; i++)
        {
            if (configInfo.InputFieldOrders != null)
            {
                if (!cepEventType.Fields.TryGetValue(configInfo.InputFieldOrders[i], out engineField))
                {
                    throw new ArgumentException(
                        string.Format(CultureInfo.InvariantCulture,
                        "Event type {0} doesn't have an input field named '{1}'", cepEventType.ShortName, configInfo.InputFieldOrders[i]));
                }

              _inputOrdinalToCepOrdinal.Add(i, engineField.Ordinal);
            }
            else
            {
                // Use default mapping
                _inputOrdinalToCepOrdinal.Add(i, i);
            }
        }
        if (!_device.Opened)
            _device.Open(true, 1000);
        _device.SetFilter("ip and tcp");
    }

我的程序引用了SharpPcap类库并安装Winpcap来监听网络数据。

构造函数还是很简单基本上是从配置文件中创建需要使用的一些内部对象。

public override void Resume()
        {
            ProduceEvents();
        }

public override void Start()
        {
            ProduceEvents();
        }

主要是这段ProduceEvents()

private void ProduceEvents()
{
    PointEvent currEvent = default(PointEvent);
    EnqueueOperationResult result = EnqueueOperationResult.Full;
    Packet packet = null;
    while (true)
    {
//判断设备状态

        if (!_device.Opened)
        {
            _device.Open(true, 1000);
            _device.SetFilter("ip and tcp");
        }

//循环获取网络数据包

        while ((packet = _device.GetNextPacket()) != null)
        {
            #region Adapter Stopping
            if (AdapterState.Stopping == AdapterState)
            {
                if (_pendingEvent != null)
                {
                    currEvent = _pendingEvent;
                    _pendingEvent = null;
                }
                PrepareToStop(currEvent);
                Stopped();
                return;
            }
            #endregion
            if (_pendingEvent != null)
            {
                currEvent = _pendingEvent;
                _pendingEvent = null;
            }
            else if (_pendingCtiTime != null)
            { }
            else
            {
                if (packet is TCPPacket)
                {
                    currEvent = CreateEventFromPacket(packet);
                    _pendingEvent = null;
                }
            }
            if (_pendingCtiTime != null)
            {
                result = EnqueueCtiEvent(_pendingCtiTime.Value);
                if (EnqueueOperationResult.Full == result)
                {
                    PrepareToResume(_pendingCtiTime.Value);
                    Ready();
                    return;
                }
                else
                {
                    _pendingCtiTime = null;
                }
            }
            else
            {
                DateTimeOffset currEventTime = currEvent.StartTime;
                result = Enqueue(ref currEvent);
                if (EnqueueOperationResult.Full == result)
                {
                    PrepareToResume(currEvent);
                    Ready();
                    return;
                }
                else
                {
                    _eventsEnqueued++;
                    _pendingEvent = null;
                    if (Zero == (_eventsEnqueued % _ctiFrequency))
                    {
                        DateTimeOffset currCtiTime = currEventTime + TimeSpan.FromTicks(NumberOfTicks);
                        result = EnqueueCtiEvent(currEventTime);
                        if (EnqueueOperationResult.Full == result)
                        {
                            PrepareToResume(currEventTime);
                            Ready();
                            return;
                        }
                        else
                        {
                            _pendingCtiTime = null;
                        }
                    }
                }
            }
        }
    }
}

private PointEvent CreateEventFromPacket(Packet packet)
        {
            PointEvent evt = CreateInsertEvent();
            evt.StartTime = DateTime.Now ;
            TCPPacket tcp = (TCPPacket)packet;

            string content = string.Empty;
            if (tcp.TCPData.Length > 0)
            {
                content = System.Text.ASCIIEncoding.ASCII.GetString(tcp.TCPData);
                if (content.Length > 256)
                    content = content.Substring(0, 256);
            }
            string[] data = new string[] {
                //Len
            packet.PcapHeader.CaptureLength.ToString(),
            tcp.SourceAddress.ToString(),
            tcp.DestinationAddress.ToString(),
            tcp.SourcePort.ToString(),
            tcp.DestinationPort.ToString(),
            content
                       };
            //populate the payload fields
            for (int ordinal = 0; ordinal < _bindtimeEventType.FieldsByOrdinal.Count; ordinal++)
            {
                try
                {
                    int cepOrdinal = _inputOrdinalToCepOrdinal[ordinal];
                    CepEventTypeField evtField = _bindtimeEventType.FieldsByOrdinal[cepOrdinal];
                    object value = Convert.ChangeType(data[ordinal], evtField.Type.ClrType);
                    evt.SetField(cepOrdinal, value);
                }
                catch (AdapterException e)
                {
                    Console.WriteLine(e.Message + "\n" + e.StackTrace);
                }

            }
            return evt;
        }
        private void PrepareToResume(DateTimeOffset currCtiTime)
        {
            _pendingCtiTime = currCtiTime;
        }
        private void PrepareToStop(PointEvent currEvent)
        {
            if (null != currEvent)
            {
                ReleaseEvent(ref currEvent);
            }
            if (_device.Opened)
                _device.Close();
        }
        private void PrepareToResume(PointEvent currEvent)
        {
            _pendingEvent = currEvent;
        }
    }

这些都是最核心的部分了基本上所有的Adapter都差不多,不同的是Event如何创建,这里面我有一个方法CreateEventFromPacket()来创建Event。但是需要注意的是Event Payload中的字段最多是32个这个无法改,每个字段默认最长为512字节,目前我还不知道如何更改payload默认长度限制。

@Starbucks_Guangzhou

posted on 2009-12-25 15:48:18 by sun.wei  评论(4) 阅读(1852)

 
2009年12月24日

SQL Server是一套RDBMS,这个产品的功能就不多说了,现实世界中很多情况都会使用数据库作为数据的存储和分析平台,但是有些应用场景并不适合使用数据库进行分析和处理,尤其是对于处理量高、延时低的场景。目前的SQL Server中的数据是通过内存+磁盘的方式进行持久化,换句话来说,在SQL中的数据肯定会被持久,但是在制造、监控、电力、金融等领域中更多的数据可能不需要实时的进行持久化,而是需要通过这些数据进行实时监控,这是数据库的功能就会有很多限制。

Microsoft StreamInsight provides a powerful platform for developing and deploying complex event processing (CEP) applications. CEP is a technology for high-throughput, low-latency processing of event streams. Typical event stream sources include data from manufacturing applications, financial trading applications, Web analytics, or operational analytics. The StreamInsight stream processing architecture and the familiar .NET-based development platform enable developers to quickly implement robust and highly efficient event processing applications.

StreamInsight是一个框架

很多实时监控的事件处理无法使用数据库实现这些功能,因为数据的特性并不是交易行,而是事件,这时我们需要的是基于事件驱动的处理程序。StreamInsight就是这样一个框架,通过这个框架我们可以构建健壮的、高性能的事件处理程序,可以用于制造、金融、电力、互联网等对于实时数据分析要求很高的分析系统。

举个例子大家就能很好的理解了。一家汽车制造商会几条流水线对零部件组装,为了提高效率会使用很多机器人实现焊接及装配,为了提高产品合格率,每个机器人的机械臂都会有若干传感器监视焊点位置信息。传感器将感知机械臂每次运动的轨迹及焊点位置,并将信息传送给监控系统,为了提高产品质量,肯定需要监控程序观察传感器发出的信息并将信息与预先设计的指标进行匹配,这种信息处理的延时要求很高,而且吞吐量很大,10000 events/second,延时接近于0。如果事件信息与预先设计的指标发现偏差并且偏差值高于预先设置的范围,系统应该报警。这种系统的设计如果使用关系型数据库实现,性能将无法满足。StreamInsight就可以解决这种问题,事件数据通过队列的方式发送到StreamInsight组件中并存储在内存中直到满足业务规则后从输出中取出。

StreamInsight是用于处理事件的

在StreamInsight中有2类事件

  • Insert

Insert事件用于将event和payload添加到事件流中

Header
Payload

Event kind ::= INSERT

StartTime ::= datetime

EndTime ::= datetime

Field 1 … Field n as CLR types

  • CTI

CTI事件是一种特殊的事件用于指出事件的完成

Header

Event kind ::= CTI

StartTime ::= datetime

也就是说事件Insert到队列后需要添加一个CTI指出这个事件结束

在StreamInsight中事件有3模型

  • Point

这种事件的特性是基于时间点的payload,例如2009-12-24 3:00:00 温度 24

  • Interval

这种事件的特性是描述一段时间内的payload,例如 2009-12-24 3:00:00  2009-12-24 3:00:10 车流量 100

  • Edege

这种事件的特性是在记录中没有指定结束时间,也就是说记录中事件的类型,有Start和End

我们可以通过StreamInsight输入和输出这3中类型的事件。

 

StreamInsight 核心是基于Event的payload的查询

在StreamInsight中的核心功能就是根据规则对事件进行处理,主要是根据payload中的字段进行汇总、计算、过滤及投影,这些功能是基于对内存中的事件队列进行LINQ的查询,当然这些查询并不一定是hard code,可以通过编码做成动态调整的。

StreamInsight不是内存数据库

有人认为StreamInsight是内存数据库,我认为这个观点不是正确的。因为StreamInsight中只是用于处理事件的而且这种事件一定是基于事件的,虽然在payload中我们不用存储事件字段,但是系统会帮我们添加时间字段辅助系统处理。内存数据库需要实现更多的功能,例如启动数据的装载,持久等,并实现CRUD功能,而StreamInsight没有。但是在一些业务场景上可以使用StreamInsight实现内存数据库的功能。

今天先写到这里,明天继续写 How to do

posted on 2009-12-24 15:46:16 by sun.wei  评论(1) 阅读(1835)

 
2009年11月09日

在TechED09上我讲了一节关于非结构化数据存储的课程,其中里面提到了RBS,由于时间有限,有一些概念并没有讲清楚。

RBS只是一个框架,必须依赖于数据存储的Provider来工作,如果没有Provider,RBS无法存储数据。默认情况下RBS安装之后没有Provider,必须安装Provider,现在Provider其实并不多,正式发布的Provider不多,EMC有相应的Provider,微软也有一个基于Filestream的Provider,其他的Provider正在开发过程中。

我在演示中给大家看到的那个Provider,并不是微软正式发布的Provider,而是我们在项目中开发的一个Provider,这个Provider有负载均衡的功能,如果大家有这种项目可以联系微软。在MSDN上有专门关于RBS Provider的开发规范,大家只需要按照这个规范来实现就可以了。

RBS提供了公共的维护操作,可以时间GC、Delete Blob、Delete Pool等操作,客户端调用RBS类库的时候只需要执行读或写就可以了,删除的操作只需要将元数据中的记录删除就可以了,当运行公共维护程序的时候,RBS会调用GC及DeleteBlob、DeletePool来真正的删除Blob数据,这是一个异步过程,可以优化IO。

在SQL  Server 2008里的RBS是第一个版本,里面有一个很严重的问题,就是应用程序(.exe)必须直接引用RBS类库,否则无法运行,典型的应用场景就是ASP.NET应用程序无法调用RBS,这个问题在SQL 08R2的RBS中已经解决了。当然之前的那个问题也有其他的解决方案,例如文件先落地生成本地文件,利用本地文件做一个双向的缓存,或者建立一个WCF服务来访问RBS。

下面我讲讲这个Provider的设计思路。

在我们实现的Provider中主要使用了Filestream来存储数据并提供均衡功能。我们的设计中有一个数据库提供了整个存储系统的元数据管理,例如系统中包含哪些数据库,哪些Schema,每个Schema上表的存储位置,每个Schema的负载比例等。负载均衡其实就是读取当前可以写入Pool的表,然后随机数取模,随机或得一个可用的表,然后将Blob数据通过Filestream Win32API存储到这个表上。

在RBS中有一个概念叫做Pool,是存储的基本单元,在Pool内存储的就是Blob了。Pool可以与blob_store及Collection关联,blob_store与Provider关联,在使用的时候在RBS客户端可以选在将Blob存储在相应的Collection,这样就可以选则Provider了。每个Pool都有一个属性can_store_new_blobs,我们可以利用这个属性来进行很多配置,例如存档。在我们的Provider中,每个Pool都会对应存储在不同数据库中的很多表,每个表都有自己的2个文件组,一个用户存储Row Data,一个用于存储Blob数据,这样在备份的时候我们就有很多中可选择的方式。例如,每天备份Primary文件组,因为这里存储了元数据(表及文件组信息)及每天创建的文件组,这是一种滚动的增量更新的方式。当然还可以有其他的方式,例如,每天创建新的数据库并调整配置,可以将新的数据写入新的数据库等,这些方式取决于你的要求。

对于均衡,我在Demo的时候已经给大家看了,其实就是通过调整一个创建表的数量来调整的,每次修改这个值之后必须将现有的Pool can_store_new_blobs置为0,这样先一个存储请求将建立新的Pool,新的存储配置才能够生效。

另外,如果大家写程序的时候一定要注意CreatePool的这个操作。因为RBS是在客户端调用的就可能会出现多线程同时访问CreatePool的这个方法的情况。我们的解决方法是创建一个服务,将并行转为串行,只有第一个进入CreatePool服务的请求会真正创建,其他的都直接返回已经创建好的PoolId。

如果大家有什么关于RBS的问题可以直接发邮件至 sunwei@itgoldenbridge.com 或者发到微软SQL Server论坛中。

posted on 2009-11-09 10:13:30 by sun.wei  评论(2) 阅读(2379)

 
2009年06月03日

之前无论做项目还是POC,总是要尽自己所能将产品的性能发挥到最大,这次做得POC让我非常的郁闷,客户的条条框框搞得我非常郁闷,不但要优化还要在很多限制上进行优化,虽然产品功能和性能无法正常发挥,但是还要不断努力,毕竟这种数据量和服务器还是很少能够遇到。

客户测试案例中有一些还是比较有特点,随便拿来说说。

删除重复数据

有一张用于出报表的临时数据表,4个列,a char,b char ,c datetime, d char,group by a,b ,保留最大的c,d. 类似与删除重复数据的场景。客户提供的实例SQL使用了一个临时表,然后通过max(C),max(d)的方法将最大值放到临时表中,然后在原表中删除。这种做法的日志开销、logcial read都会很大。

比较好的处理方式是将最大值插入的其他表中,然后删除源表,将新表重新命名,另外还要注意逻辑,删除最小值并不等于保留最大值,因为最大值可能会出现重复,也就是相同的最大值其实可能有多条。这个过程可以使用CTE和DENSE_RANK,目前我看到这个是最快的方法

with d as

(

select a,b,c,d

from t where desnese_rank() over(partition by a,b order c desc,d desc)=1

)

inser into t2

select a,b,c,d from d

注意多线程并行执行计划

这次测试中还遇到一个问题就是clustered index和排序。

以前总是认为如果一个表上定义了clustered index在查询中如果没有特定使用order by,则返回的记录应该按照clustered index的排序返回。这种想法不是100%可靠,虽然你看到的多数情况是这样。但是如果这个表有分区并且在多核环境上执行,结果基本上可以肯定的说不是排序的,因为生成的查询计划是并行的,虽然数据是Clustered index scan读的,但是不保证顺序。因为我在后续的SSIS处理中需要使用Merge join(这个组件需要输入的2路数据是排序的),所以导致我在数据源的查询上没有加Order by,导致Merge过程的结果都不正确,而且每次都是随机值,每次都不一样。如果在查询上加了Order by,可以保证顺序,但是性能上会有很大的影响,如果影响大,可以根据情况考虑将Sort放到SSIS中来进行操作。

还有就是在Load Test前千万别忘了update statistics,否则查询计划可能都是错误的

 

今天还看了一篇Lubor的文章谈到如何按顺序删除数据的问题,其实那个问题也可以使用CTE来解决,1次Scan解决问题。也可以大幅提高性能

with d  as
(
select top (10000) a from t3
)
delete from d;

posted on 2009-06-03 23:31:12 by sun.wei  评论(6) 阅读(3447)

 
2009年05月11日

NUMA这个词3年前就听说过,但是从来没有过很好的理解,这次的项目中终于遇到了一个NUMA的设备,对这个东西有了一些了解。

之前很多人都认为MS的产品只能使用在中小企业,进不了企业级市场,MS的东西都是在PC server上来实现,无法和IBM的主机系统来PK。随着硬件的不断发展,PC Server的优势也渐渐体现出来了,但是很多时候用户还是希望能够有更强大的PC Server来运行他们的系统。IBM的主机可以有数千颗CPU肯定比只有几十颗CPU的PC Server快很多。但是现在的PC Server也可能做到几百颗的CPU,这样就要看看微软的产品是否支持了。

硬件已经趋向使用多条系统总线,每条系统总线为一小组处理器提供服务。每组处理器都有自己的内存,并可能有自己的 I/O 通道。但是,每个 CPU 都可以通过一致的方式访问与其他组关联的内存。每个组称为一个“NUMA 节点”。NUMA 节点中的 CPU 数量取决于硬件供应商。访问本地内存比访问与其他 NUMA 节点关联的内存快。这就是“非一致性内存访问体系结构”名称的由来。

在 NUMA 硬件上,有些内存区域与其他区域位于不同的物理总线上。由于 NUMA 同时使用本地内存和外部内存,因此,访问某些内存区域的时间会比访问其他内存区域的要长。“本地内存”和“外部内存”通常用于引用当前正在运行的线程。本地内存是指与当前正在运行线程的 CPU 位于同一节点上的内存。任何不属于当前正在运行的线程所在的节点的内存均为外部内存。外部内存也称为“远程内存”。访问外部内存的开销与访问本地内存的开销比率称为 NUMA 比率。如果 NUMA 比率为 1,则它是对称多处理 (SMP)。比率越高,访问其他节点内存的开销就越大。不支持 NUMA 的 Windows 应用程序(包括 SQL Server 2000 SP3 及更低版本)有时在 NUMA 硬件上的执行效果非常差。

NUMA 的主要优点是伸缩性。NUMA 体系结构在设计上已超越了 SMP 体系结构在伸缩性上的限制。通过 SMP,所有的内存访问都传递到相同的共享内存总线。这种方式非常适用于 CPU 数量相对较少的情况,但不适用于具有几十个甚至几百个 CPU 的情况,因为这些 CPU 会相互竞争对共享内存总线的访问。NUMA 通过限制任何一条内存总线上的 CPU 数量并依靠高速互连来连接各个节点,从而缓解了这些瓶颈状况。

这次使用的系统是Unisys ES7000,有4个NUMA节点,每个节点有4颗6核的CPU组成,总计16颗CPU,96核,内存224GB,存储超过20T。很容易看出这套系统是由多台PC Server组成的,这样中系统的扩展性和性价比是主机系统无法比拟的。

既然有这样的硬件,软件也 需要能够支持这种类型的PC server。NUMA在这里起了很大的作用。使软件能够更好的使用CPU和CPU缓存。对于数据库应用来说是非常有益的,SQL Server 2005以后的版本支持Soft NUMA,可以通过配置在硬件NUMA上提供软件NUMA这样就可以提供多个IO线程和Lazy Writer线程。下面这个就是在创建索引时CPU的工作情况。

 

image

posted on 2009-05-11 18:21:39 by sun.wei  评论(1) 阅读(4284)

 

最近好久都没发文章了,因为一直在做一个关于dw的POC,主要就是使用SSIS来做一些ETL的东西,现在拿出来和大家分享一下。

数据源文件

对于ETL来说经常会遇到文本形式的源文件,如果在导入数据库时不需要进行转换,可以直接通过BCP来导入数据库。但是对于文本中有中文的情况要注意一些问题,尤其是繁体中文。通常情况下为了减少文本的大小我们都会使用ANSI的格式进行文本的导出,但是如果在一个列中存在简体中文和繁体中文,这个时候必须使用unicode,否则会出现问题,而且通常情况下我们都不会使用逗号进行列的分割,更多的时候会选择|来做为分隔符,而繁体中文的编码中很多字都会被转成|,这样列的顺序就出现了错误。如果能够统一使用一种文字是不会出现这种问题的,因为在选择文本的时候我们可以为文本选择相应的编码,例如简体中文可以选择GBK 936,但是这样就不能支持繁体中文了。我在项目中就遇到了这样的问题,所以只能通过编写一个转换unicode文件的工具来实现,这样的副作用就是文件体积会增大一倍。

SSIS

对于SSIS来说,重要的是选择如何能够设计一个能够最大并行化的系统过程。现在的服务器都有很多个核和CPU,例如我这次使用的就是一个96核的服务器,但是如果只能使用1个线程来做SSIS,这样肯定无法更多的利用系统资源。

对于SQL Server来说,在SQL 2005以后的版本可以支持分区,这个功能可以有效的使用线程资源,例如在进行全量数据导入的时候就可以使用这个特性,将源文件分割成多份,每一份对应成一个分区,这样多个分区可以同时使用。

对于SSIS的设计来说,SSIS中使用了流的模式,这样最好将转换都在SSIS的Pipeline中实现,而对于SSIS来说可能存在block的操作尽量在其他的地方实现。例如Sort、Merge等。

还有一点要注意的地方就是aggregate,在SSIS中aggregate无法对string进行计算,而这个操作在数据库中是可以实现的。原因在于,在数据库中已经制订了排序的方式,而在SSIS中就无法进行设置,当然这个设置和aggregate组件的设计有些关系,但是还好毕竟很少会对字符进行max(),min()的操作

SQL Server

在SQL Server中除了分区之外还要注意的一个问题就是压缩。压缩对于数据仓库来说还是非常重要的,可以对数据和Index来进行压缩,收益在于同一个页中可以存储更多的数据,这样一个physical read可以多读一些行,而损失在于压缩和解压的过程需要20%的CPU损耗,如果你的系统磁盘是瓶颈的话,可以使用压缩来进行缓解,但是会影响CPU,这个需要根据不同的服务器系统进行平衡

 

最重要的就是选择合适的技术来实现需求,而不是使用一种方法来实现全部的功能,ETL的工具有ETL和ELT的模式区别,都是各有优缺点,有些需求就可以使用staging 数据库然后用ELT的方法做,有些就可以直接用SSIS来ETL做,这个取决与需求。

posted on 2009-05-11 17:45:52 by sun.wei  评论(0) 阅读(3333)

 
2009年03月17日

又回来了,在国外休假回来又开始了忙碌的工作,做顾问就是这样,公司总是将你的时间分片然后分到不同的项目上,这点符合我们CPU的工作原理。

最近穿梭于3个项目中,分别是不同领域的项目。项目1使用了SQL Server 2008+RBS,经过了快8个月的折磨,开发商终于有时间来研究我们的这个组件了,而且也验证了我们写的东西还不错,对下一个RBS项目和有帮助。项目2就是AD+VB6+WMI的开发,功能不复杂就是环境和需求用户总摸不清楚,搞得我也快晕了,遇到N多怪问题。项目3就是我们接下来要说的TFS了。

多年前我们在进行软件开发的过程中,基本上和少有人把开发过程提升到方法论的层次上来讨论,随着今年国家对于软件产业的支持,要求我们的开发企业更加正规化和流程化。随着大家理论的不断丰富和对于现实的不断了解,终于发现理论和实际之间还差一个能将理论付诸实施的工具。MS给我们们TFS,当然一般MS的产品在第一个版本上都会有很多不足,这也是人之常情,市场上没有的东西,哪有那么容易就做到尽善尽美。TFS 2008已经是第2个版本了,但是很多用户还是对于TFS不是十分的理解,或者仅仅将TFS当作VSS的升级版(如果这么用太亏了)。当然能用好TFS的企业也非常非常少,而且规模越大越难实施。

实施步骤

实施TFS绝对不是简单的安装和配置,当然装不上是肯定用不了的。第一步应该去研究一下自己企业的生产过程,将过程进行优化,并根据过程建立相应的模型。每个企业都不一样,有的企业做项目,有的企业做产品。做项目型的企业相对来说实施难度小很多,因为TFS中默认的模板基本上够用了,修要修改的地方不多。如果是做产品,这个步骤非常重要。例如,产品型的公司需要从产品设计开始,逐步转向计划开发,再到开发过程管理,发布管理等多个过程,其中细节的工作非常多,这些可以参考微软产品开发的过程来做,当然这也只能是参考。

第二步,就是根据之前设计的开发模型定制TFS的项目模板。项目模板在TFS2008中是非常容易定制的,因为集成了Process Template editor的工具,这个在2005的版本中只能通过PowerToy中找到。根据过程模型中分解定制任务,场景等具体的WorkItem。

第三步,就是开发相应的工具来支持TFS。微软提供的Excel\Project\TE等工具功能都比较弱,而且最重要的是,我们在开发过程中有很多流程,在项目模板中的一些流程的制定功能非常弱,复杂的流程必须通过其他方式来实现。还好TFS提供了事件订阅的方式,我们可以通过这个机制编写自己的流程。TFS Event Handler是一个不错的组件,可以帮我们注册并接获事件的通知,然后调用我们的代码。我们需要做的就是从事件传递出的XML数据中解析我们需要的部分,并通过调用TFS对象模型操作其他对象。例如,一个Feature下的所有任务完成,feature的状态转为完成。还有就是需要根据需要对Project\Excel做一些宏的开发,来辅助我们自定义模板中的一些WorkItem属性。

如果不经历这3步,用户对于TFS的认识只能说,这个东西是垃圾。真正走过这些阶段的用户才能开到使用TFS的收益。

posted on 2009-03-17 22:00:29 by sun.wei  评论(0) 阅读(5409)

 
2009年03月02日
最近的项目中经常会使用VB+WMI来操作OS的一些方法,也经常遇到一些错误,这里找了一些错误代码,写程序的时候处理异常可以使用
 
0000 操作已成功完成。 
0001 错误的函数。 
0002 系统找不到指定的文件。 
0003 系统找不到指定的路径。 
0004 系统无法打开文件。 
0005 拒绝访问。 
0006 句柄无效。 
0007 存储区控制块已损坏。 
0008 可用的存储区不足,无法执行该命令。 
0009 存储区控制块地址无效。 
0010 环境错误。 
0011 试图使用不正确的格式加载程序。 
0012 访问代码无效。 
0013 数据无效。 
0014 可用的存储区不足,无法完成该操作。 
0015 系统找不到指定的驱动器。 
0016 无法删除该目录。 
0017 系统无法将文件移到其他磁盘驱动器上。 
0018 没有其他文件。 
0019 媒体写保护。 
0020 系统找不到指定的设备。 
0021 设备尚未准备好。 
0022 设备无法识别该命令。 
0023 数据错误(循环冗余检查)。 
0024 程序发出命令,但是该命令的长度错误。 
0025 驱动器在磁盘上无法定位指定的区域或磁道。 
0026 无法访问指定的磁盘或软盘。 
0027 驱动器找不到所请求的扇区。 
0028 打印机缺纸。 
0029 系统无法写入指定的设备。 
0030 系统无法读取指定的设备。 
0031 与系统连接的设备不能正常运转。 
0032 其他进程正使用该文件,因此现在无法访问。 
0033 另一进程已锁定该文件的某一部分,因此现在无法访问。 
0034 驱动器中的软盘不正确。请将 %2 (卷标序列号: %3)插入驱动器 %1。 
0036 打开共享的文件太多。 
0038 已到达文件结尾。 
0039 磁盘已满。 
0050 不支持此网络请求。 
0051 远程计算机无法使用。 
0052 网络中存在重名。 
0053 找不到网络路径。 
0054 网络正忙。 
0055 指定的网络资源或设备已不可用。 
0056 已经达到网络命令的极限。 
0057 网络适配器出现错误。 
0058 指定的服务器无法执行所请求的操作。 
0059 网络出现意外错误。 
0060 远程适配器不兼容。 
0061 打印机队列已满。 
0062 服务器上没有存储等待打印的文件的空间。 
0063 已经删除等候打印的文件。 
0064 指定的网络名无法使用。 
0065 拒绝访问网络。 
0066 网络资源类型错误。 
0067 找不到网络名。 
0068 已超过本地计算机网络适配器卡的名称极限。 
0069 已超过网络 BIOS 会话的极限。 
0070 远程服务器已经暂停或者正在启动过程中。 
0071 由于该计算机的连接数目已达到上限,此时无法再连接到该远程计算机。 
0072 指定的打印机或磁盘设备已经暂停。 
0080 该文件存在。 
0082 无法创建该目录或文件。 
0083 INT 24 失败。 
0084 处理该请求的存储区不可用。 
0085 正在使用该本地设备名。 
0086 指定的网络密码不正确。 
0087 参数错误。 
0088 网络出现写入错误。 
0089 此时系统无法启动其他进程。 
0100 无法创建其他系统标志。 
0101 属于其他进程的专用标志。 
0102 标志已经设置,无法关闭。 
0103 无法再次设置该标志。 
0104 中断时无法请求专用标志。 
0105 此标志先前的所有权已终止。 
0106 请将软盘插入驱动器 %1。 
0107 后续软盘尚未插入,程序停止。 
0108 磁盘正在使用或已由其他进程锁定。 
0109 管道已经结束。 
0110 系统无法打开指定的设备或文件。 
0111 文件名太长。 
0112 磁盘空间不足。 
0113 没有其他可用的内部文件标识符。 
0114 目标内部文件标识符不正确。 
0117 该应用程序所运行的 IOCTL 调用不正确。 
0118 校验写入的开关参数值不正确。 
0119 系统不支持所请求的命令。 
0120 该系统上不支持此功能。 
0121 标记已超时。 
0123 文件名、目录名或卷标语法错误。 
0124 系统调用层不正确。 
0125 磁盘没有卷标。 
0126 找不到指定的模块。 
0127 找不到指定的过程。 
0128 没有要等候的子进程。 
0129 模式下运行。 
0130 试图使用操作(而非原始磁盘I/O)的已打开磁盘分区的文件句柄。 
0131 试图将文件指针移至文件开头之前。 
0132 无法在指定的设备或文件中设置文件指针。 
0133 对于包含已连接驱动器的驱动器,不能使用 JOIN 或 SUBST 命令。 
0134 试图在已经连接的驱动器上使用 JOIN 或 SUBST 命令。 
0135 试图在已经替换的驱动器上使用 JOIN 或 SUBST 命令。 
0136 系统试图删除尚未连接的驱动器的 JOIN。 
0137 系统试图删除尚未替换的驱动器的替换项。 
0138 系统试图将驱动器连接到已连接的驱动器下的目录。 
0139 系统试图将驱动器替换成已替换的驱动器下的目录。 
0140 系统试图将驱动器连接到已替换的驱动器的一个目录中。 
0141 系统试图将驱动器替换成到已连接的驱动器下的目录。 
0142 此时系统无法运行 JOIN 或 SUBST。 
0143 系统无法将驱动器连接到或替换成同一驱动器下的目录。 
0144 此目录不是该根目录的子目录。 
0145 该目录未清空。 
0146 指定的路径已经在替换中使用。 
0147 资源不足,无法执行该命令。 
0148 此时无法使用指定的路径。 
0149 试图连接或替换某个驱动器目录,该驱动器上的某个目录是上一次替换的目标目录。 
0150 CONFIG.SYS 文件未指定系统跟踪信息,或禁止跟踪。 
0151 DosMuxSemWait 的指定信号事件的数目不正确。 
0152 DosMuxSemWait 没有运行;已经设置太多的标志。 
0153 DosMuxSemWait 列表不正确。 
0154 输入的卷标超过目标文件系统的标号字符长度极限。 
0155 无法创建其他线程。 
0156 接收进程拒绝该信号。 
0157 已经放弃该区域,因此无法锁定。 
0158 该区域已经解除锁定。 
0159 线程标识符的地址错误。 
0160 传到 DosExecPgm 的参数字符串错误。 
0161 指定的路径无效。 
0162 信号已挂起。 
0164 系统无法创建其他线程。 
0167 无法锁定文件的范围。 
0170 所要求的资源正在使用中。 
0173 锁定请求对于提供的取消区域不重要。 
0174 文件系统不支持到锁定类型的自动更改。 
0180 系统检测到错误的区域号码。 
0182 操作系统无法运行 %1。 
0183 不能创建已经存在的文件。 
0186 传送的标志不正确。 
0187 找不到指定的系统信号名称。 
0188 操作系统无法运行 %1。 
0189 操作系统无法运行 %1。 
0190 操作系统无法运行 %1。 
0191 无法在 Win32 模式下运行 %1。 
0192 操作系统无法运行 %1。 
0193 %1 不是有效的 Win32 应用程序。 
0194 操作系统无法运行 %1。 
0195 操作系统无法运行 %1。 
0196 操作系统无法运行此应用程序。 
0197 当前无法配置操作系统运行此应用程序。 
0198 操作系统无法运行 %1。 
0199 操作系统无法运行此应用程序。 
0200 代码段应小于 64K。 
0201 操作系统无法运行 %1。 
0202 操作系统无法运行 %1。 
0203 系统找不到输入的环境选项。 
0205 在命令子树中的进程没有信号句柄。 
0206 文件名或扩展名太长。 
0207 环 2 堆栈正在使用中。 
0208 输入的全局文件名字符 * 或 ? 不正确,或指定的全局文件名字符太多。 
0209 所发送的信号不正确。 
0210 无法设置信号处理程序。 
0212 区域已锁定,无法重新分配。 
0214 附加到此程序或动态链接模块的动态链接模块太多。 
0215 无法嵌套调用 LoadModule。 
0216 图像文件 %1 有效,但不适用于本机类型。 
0230 管道状态无效。 
0231 所有的管道实例都处于忙状态。 
0232 管道正在关闭。 
0233 在管道的另一端没有进程。 
0234 有更多可用的数据。 
0240 已取消会话。 
0254 指定的扩展属性名无效。 
0255 扩展属性不一致。 
0258 等待操作过时。 
0259 没有其他可用数据。 
0266 无法使用复制功能。 
0267 目录名无效。 
0275 扩展属性不匹配缓冲区。 
0276 所装载的文件系统上的扩展属性文件已被损坏。 
0277 扩展属性表格文件已满。 
0278 指定的扩展属性句柄无效。 
0282 安装的文件系统不支持扩展属性。 
0288 试图释放不属于调用者的多路同步信号。 
0298 信号投递的次数太多。 
0299 仅完成部分 ReadProcessMemory 或 WriteProcessMemory 请求。 
0300 操作锁定请求被拒绝。 
0301 系统接收了一个无效的操作锁定确认。 
0317 在 %2 的消息文件中,系统无法找到消息号为 0x%1 的消息文本。 
0487 试图访问无效地址。 
0534 运算结果超过 32 位。 
0535 该管道的另一方有一进程。 
0536 等候进程打开管道的另一端。 
0994 拒绝对扩展属性的访问。 
0995 由于线程退出或应用程序的要求,I/O 操作异常终止。 
0996 重叠的 I/O 事件不处于已标记状态。 
0997 正在处理重叠的 I/O 操作。 
0998 对内存位置的无效访问。 
0999 执行页内操作出错。 
1001 递归太深;堆栈溢出。 
1002 窗口无法用来发送消息。 
1003 无法完成此项功能。 
1004 标志无效。 
1005 卷不包含已识别的文件系统。请确认所有需要的文件系统驱动程序都已经加载,而且卷没有任何损坏。 
1006 某文件的卷已在外部改变,因而打开的文件不再有效。 
1007 要求的操作无法以全屏幕模式执行。 
1008 试图引用并不存在的符号。 
1009 配置注册表数据库已损坏。 
1010 配置注册表主键无效。 
1011 无法打开配置注册表主键。 
1012 无法读取配置注册表主键。 
1013 无法写入配置注册表主键。 
1014 必须使用日志文件或其他副本来恢复注册表数据库中的某个文件。恢复成功。 
1015 注册表已损坏。可能是一个包含注册表数据文件的结构已损坏,也可能内存中该文件的系统映像已损坏,或者因为备份副本(或日志)不存在(或损坏)导致无法恢复该文件。 
1016 由注册表引起的 I/O 操作发生了不可恢复的错误。注册表将不能读取、写出或刷新包含注册表系统映像的其中一个文件。 
1017 系统试图将文件加载或还原到注册表中,但是,指定的文件不是注册表文件格式。 
1018 试图在注册表键(已经标记为删除)中完成的操作非法。 
1019 系统无法在注册表日志文件中分配所需的空间。 
1020 无法在已经有子键或键值的注册表项中创建符号链接。 
1021 在易失的父键下不能创建固定的子键。 
1022 通知的更改请求已经完成,并且返回信息还没有被送到调用者的缓冲区中。调用者需要列举所有文件以找到改动的内容。 
1051 已将停止控制发送给与其他运行服务相关的服务。 
1052 所要求的控制对此服务无效。 
1053 服务没有及时地响应启动或控制请求。 
1054 无法为该服务创建线程。 
1055 服务数据库已锁定。 
1056 该服务的实例已在运行。 
1057 帐户名无效或者不存在,或者指定帐户名的密码无效。 
1058 服务无法启动,可能因为被禁用,也可能因为没有关联的可用设备。 
1059 已经指定了循环服务的从属关系。 
1060 指定的服务不是所安装的服务。 
1061 该服务此时无法接收控制消息。 
1062 服务尚未启动。 
1063 服务进程无法连接到服务控制程序。 
1064 处理控制请求时,服务出现意外情况。 
1065 指定的数据库不存在。 
1066 服务返回服务特定的错误码。 
1067 进程意外地终止。 
1068 无法启动从属服务或组。 
1069 由于登录失败,没有启动服务。 
1070 启动后,服务保持在启动挂起状态。 
1071 指定的服务数据库锁定无效。 
1072 指定的服务已经标记为删除。 
1073 指定的服务已经存在。 
1074 系统当前正以上一次运行成功的配置运行。 
1075 从属服务不存在,或已经标记为删除。 
1076 已接受使用当前引导作为最后的有效控制设置。 
1077 自从上一次启动以后,没有再次启动过该服务。 
1078 该名称已经用作服务名或服务显示名。 
1079 此服务的帐户不同于运行于同一进程上的其它服务的帐户。 
1080 只能为 Win32 服务设置失败操作,不能为驱动程序设置。 
1081 这个服务所运行的进程和服务控制管理器相同。所以,如果服务进程意外中止的话,服务控制管理器无法进行任何操作。 
1082 这个服务没有设置恢复程序。 
1083 配置成在该可执行程序中运行的这个服务不能执行该服务。 
1100 已经到达磁带的物理尽头。 
1101 磁带访问到文件标记。 
1102 到达磁带或分区首部。 
1103 磁带访问到文件组的末尾。 
1104 磁带上没有其他数据。 
1105 磁带无法分区。 
1106 访问多重卷分区的新磁带时,当前的区块大小不正确。 
1107 加载磁带时,找不到磁带分区信息。 
1108 无法锁定媒体退出功能。 
1109 无法卸载媒体。 
1110 驱动器中的媒体已经更改。 
1111 已经复位 I/O 总线。 
1112 驱动器中没有媒体。 
1113 在目标多字节代码页中不存在对单码字符的映射。 
1114 动态链接库 (DLL) 初始化例程失败。 
1115 正在关闭系统。 
1116 无法终止系统关机,因为没有进行中的关机操作。 
1117 由于 I/O 设备出现错误,无法运行该请求。 
1118 串行设备初始化失败。将卸载串行驱动程序。 
1119 无法打开正与其他设备共享中断请求 (IRQ) 的设备。至少有一个使用该 IRQ 的设备已经打开。 
1120 由于再次写入串行口,串行 I/O 操作已结束。(IOCTL_SERIAL_XOFF_COUNTER 为零。) 
1121 由于超时,串行 I/O 操作已结束。 (IOCTL_SERIAL_XOFF_COUNTER 未达到零。) 
1122 在软盘上找不到标识符地址标记。 
1123 软盘扇区标识符字段与软盘控制器磁道地址不匹配。 
1124 软盘控制器报告软盘驱动程序不能识别的错误。 
1125 软盘控制器返回的结果和注册的不一致。 
1126 访问硬盘时,再校准操作失败,再试一次后也无法操作。 
1127 访问硬盘时,磁盘操作失败,再试一次后仍没有作用。 
1128 访问硬盘时,需要重启动磁盘控制器,但仍未成功。 
1129 磁带已卷到尽头。 
1130 可用的服务器存储区不足,无法执行该命令。 
1131 检测到潜在的死锁情况。 
1132 指定的基址或文件偏移量没有正确对齐。 
1140 试图更改系统电源状态的操作被另一应用程序或驱动程序禁止。 
1141 系统 BIOS 无法更改系统电源状态。 
1142 试图在一文件上创建超过系统允许数额的链接。 
1150 指定的程序需要新的 Windows 版本。 
1151 指定的程序不是 Windows 或 MS-DOS 程序。 
1152 无法启动指定程序的多个实例。 
1153 指定的程序是为 Windows 的早期版本编写的。 
1154 运行此应用程序所需的某个库文件已损。 
1155 没有应用程序与该操作中所指定的文件关联。 
1156 将命令发送到应用程序时出现错误。 
1157 找不到运行此应用程序所需的某个库文件。 
1158 当前进程已使用了 Window 管理器对象的系统允许的所有句柄。 
1159 消息只能与同步操作一起使用。 
1160 指出的源元素没有媒体。 
1161 指出的目标元素已包含媒体。 
1162 指出的元素不存在。 
1163 指出的元素是未显示的存储资源的一部分。 
1164 指出的设备需要重新初始化,因为硬件有错误。 
1165 设备显示在尝试进一步操作之前需要清除。 
1166 设备显示它的门仍是打开状态。 
1167 设备没有连接。 
1168 找不到元素。 
1169 索引中没有同指定项相匹配的项。 
1170 在对象上不存在指定的属性集。 
1171 传递到 GetMouseMovePoints 的点不在缓冲区中。 
1172 跟踪(工作站)服务没运行。 
1173 找不到卷 ID。 
1175 无法删除要被替换的文件。 
1176 无法将替换文件移到要被替换的文件。要被替换的文件保持原来的名称。 
1177 无法将替换文件移到要被替换的文件。要被替换的文件已被重新命名为备份名称。 
1178 卷更改记录被删除。 
1179 卷更改记录服务不处于活动中。 
1180 找到一份文件,但是可能不是正确的文件。 
1181 日志项已从日志中删除。 
1200 指定的设备名无效。 
1201 设备当前虽然未连接,但它是记忆连接。 
1202 试图记起已经记住的设备。 
1203 网络供应商不接受给定的网络路径。 
1204 指定的网络供应商名无效。 
1205 无法打开网络连接配置文件。 
1206 网络连接配置文件已损坏。 
1207 无法列举非包容类。 
1208 出现扩展错误。 
1209 指定组名的格式无效。 
1210 指定计算机名的格式无效。 
1211 指定事件名的格式无效。 
1212 指定域名的格式无效。 
1213 指定服务名的格式无效。 
1214 指定网络名的格式无效。 
1215 指定共享名的格式无效。 
1216 指定密码的格式无效。 
1217 指定的邮件名无效。 
1218 指定邮件目的地的格式无效。 
1219 所提供的凭据与现有凭据设置冲突。 
1220 试图与网络服务器建立会话,但目前与该服务器建立的会话太多。 
1221 网络上的其他计算机已经使用该工作组或域名。 
1222 网络不存在或者没有启动。 
1223 用户已经取消该操作。 
1224 所要求的操作无法在已经打开用户映射区域的文件中运行。 
1225 远程系统拒绝网络连接。 
1226 已经关闭网络连接。 
1227 网络传输的终点已经有一个地址与其关联。 
1228 网络终点尚未与地址关联。 
1229 试图在不存在的网络连接中操作。 
1230 试图在活动的网络连接上进行无效操作。 
1231 不能访问网络位置。有关网络疑难解答的信息,请参阅 Windows 帮助。 
1232 不能访问网络位置。有关网络疑难解答的信息,请参阅 Windows 帮助。 
1233 不能访问网络位置。有关网络疑难解答的信息,请参阅 Windows 帮助。 
1234 远程系统的目标网络端点没有运行任何服务。 
1235 该请求已经终止。 
1236 本地系统已经终止网络连接。 
1237 无法完成操作。请再试一次。 
1238 无法创建到该服务器的连接,因为已经到达了该帐户同时连接的最大数目。 
1239 试图在该帐户未授权的时间内登录。 
1240 尚未授权此帐户从该站登录网络。 
1241 网络地址无法用于要求的操作。 
1242 服务已经注册。 
1243 指定的服务不存在。 
1244 由于尚未验证用户身份,无法执行要求的操作。 
1245 由于用户尚未登录网络,无法运行要求的操作。指定的服务不存在。 
1246 继续工作。 
1247 完成初始化操作后,试图再次运行初始化操作。 
1248 没有其他本地设备。 
1249 指定的站点不存在。 
1250 具有指定名称的域控制器已经存在。 
1251 只有连接到服务器上时,才支持该操作。 
1252 即使没有改动,组策略框架也应该调用扩展。 
1253 指定的用户没有一个有效的配置文件。 
1254 Microsoft Small Business Server 不支持此操作。 
1300 不是对所有的调用方分配引用特权。 
1301 帐户名与安全标识符之间的映射未完成。 
1302 没有为该帐户明确地设置系统配额限制。 
1303 没有可用的密钥。返回已知的密钥。 
1304 密码太复杂,无法转换成 LAN Manager 密码。返回的 LAN Manager 密码是空字符串。 
1305 修订级别未知。 
1306 表示两个修订级别不兼容。 
1307 无法将此安全标识符指定为该对象的拥有者。 
1308 无法将此安全标识符指定为主要的对象组。 
1309 当前并未模拟客户的线程试图操作模拟令牌。 
1310 不可以禁用该组。 
1311 目前没有可用的登录服务器处理登录请求。 
1312 指定的登录会话不存在。该会话可能已终止。 
1313 指定的权限不存在。 
1314 客户不保留请求的权限。 
1315 提供的名称不是正确的帐户名称格式。 
1316 指定的用户已经存在。 
1317 指定的用户不存在。 
1318 指定的组已经存在。 
1319 指定的组不存在。 
1320 或者指定的用户帐户已经是某个特定组的成员,或者也可能指定的组非空而不能被删除。 
1321 指定的用户帐户不是所指定组帐户的成员。 
1322 上次保留的管理帐户无法关闭或删除。 
1323 无法更新密码。所输入的密码不正确。 
1324 无法更新密码。所提供的新密码包含不可用于密码的值。 
1325 无法更新密码。为新密码提供的值不符合字符域的长度、复杂性或历史要求。 
1326 登录失败: 用户名未知或密码错误。 
1327 登录失败: 用户帐户限制。 
1328 登录失败: 违反帐户登录时间限制。 
1329 登录失败: 禁止用户登录到该计算机上。 
1330 登录失败: 指定的帐户密码已过期。 
1331 登录失败: 当前禁用帐户。 
1332 未完成帐户名与安全性标识符之间的映射。 
1333 一次请求的本地用户标识符(LUID)太多。 
1334 没有其他可用的本地用户标识符(LUID)。 
1335 对这个特定使用来说,安全标识符的子部分是无效的。 
1336 访问控制清单(ACL)结构无效。 
1337 安全标识符结构无效。 
1338 安全描述符结构无效。 
1340 无法创建继承的访问控制列表(ACL)或访问控制项目(ACE)。 
1341 当前已禁用服务器。 
1342 当前已启用服务器。 
1343 所提供的值是无效的标识符授权值。 
1344 没有更多的内存用于更新安全信息。 
1345 指定的属性无效,或指定的属性与整个组的属性不兼容。 
1346 或者没有提供所申请的模仿级别,或者提供的模仿级别无效。 
1347 无法打开匿名级安全性符号。 
1348 所请求的验证信息类别无效。 
1349 该类符号不能以所尝试的方式使用。 
1350 无法在没有相关安全性的对象上运行安全操作。 
1351 未能从域控制器读取配置信息,或者是因为机器不可使用,或者是访问被拒绝。 
1352 安全帐户管理程序(SAM)或本地安全颁发机构(LSA)服务器状态不正确,所以无法运行安全操作。 
1353 域处于执行安全操作的错误状态。 
1354 该操作只能在域的主域控制器中执行。 
1355 指定的域不存在或联系不上。 
1356 指定的域已经存在。 
1357 试图超过每个服务器域数目的极限。 
1358 由于严重的媒体错误或磁盘的数据结构损坏,无法完成所请求的操作。 
1359 发生内部错误。 
1360 通用的访问类型包含在访问掩码中,该掩码已经映射为非通用类型。 
1361 安全性描述符的格式错误(绝对或自相关)。 
1362 请求的操作只准登录进程使用。该调用过程并未被记录为登录进程。 
1363 无法用已经使用的标识符来启动新的登录会话。 
1364 指定的确认数据包未知。 
1365 登录会话的状态与请求的操作不一致。 
1366 登录会话标识符正在使用中。 
1367 登录请求包含无效的登录类型值。 
1368 在使用命名管道读取数据之前,无法经由该管道模拟。 
1369 注册表子树的事务状态与所请求的操作不兼容。 
1370 突发的内部安全性数据库故障。 
1371 无法在内部帐户下运行该操作。 
1372 无法在该内部特定组中运行该操作。 
1373 无法在该内部特定用户中运行该操作。 
1374 因为该组当前是用户的主要组,所以不能从此组中删除用户。 
1375 该符号已作为主要符号使用。 
1376 指定的本地组不存在。 
1377 指定的帐户名不是本地组的成员。 
1378 指定的帐户名已经是本地组的成员。 
1379 指定的本地组已经存在。 
1380 登录失败: 用户在本计算机上没有被授与所需注册类型。 
1381 超过了可以存储在单个系统中的最大机密限制。 
1382 机密的长度超过了最大允许值。 
1383 本地安全授权数据库包含内部不一致的错误。 
1384 登录时,用户的安全性上下文累积太多的安全标识符。 
1385 登录失败: 用户在本计算机上没有被授与所需注册类型。 
1386 经交叉加密的密码必须更改用户密码。 
1387 成员不存在,因此无法将其添加到本地组或从中删除。 
1388 新成员的帐户类型有误,因此无法将其添加到本地组。 
1389 指定的安全标识符太多。 
1390 经交叉加密的密码必须更改该用户密码。 
1391 表示 ACL 没有可继承的组件。 
1392 文件或目录已损坏,无法读取数据。 
1393 磁盘结构已损坏,无法读取数据。 
1394 指定的登录会话没有用户会话密钥。 
1395 正在访问的服务允许特定数目的连接。因为连接的数目已达到服务可接受的数目,所以此时无法创建新的服务连接。 
1396 登录失败: 该目标帐户名称不正确。 
1397 相互身份验证失败。该服务器在域控制器的密码过期。 
1398 在客户机和服务器之间有一个时间差。 
1400 窗口句柄无效。 
1401 菜单句柄无效。 
1402 光标句柄无效。 
1403 加速键表的句柄无效。 
1404 挂接句柄无效。 
1405 多重窗口位置结构句柄无效。 
1406 无法创建最上层的子窗口。 
1407 找不到窗口类。 
1408 窗口无效;属于其他线程。 
1409 已经注册热键。 
1410 类已经存在。 
1411 类不存在。 
1412 类窗口仍打开着。 
1413 索引无效。 
1414 图标句柄无效。 
1415 使用私人对话框窗口字。 
1416 找不到列表框标识符。 
1417 找不到任何通配符。 
1418 线程没有打开剪贴板。 
1419 尚未注册热键。 
1420 该窗口不是有效的对话框窗口。 
1421 找不到控制标识符。 
1422 由于没有编辑控制,因此该组合框的消息无效。 
1423 窗口不是组合框。 
1424 高度必须小于 256。 
1425 设备上下文(DC)句柄无效。 
1426 挂接过程类型无效。 
1427 挂接过程无效。 
1428 不能在无模块句柄的情况下设置非本地的挂接。 
1429 只能全局设置该挂接过程。 
1430 已安装日记挂接过程。 
1431 未安装挂接过程。 
1432 单选列表框的消息无效。 
1433 LB_SETCOUNT 发送到活动的列表框。 
1434 该列表框不支持制表符。 
1435 无法破坏由其他线程所创建的对象。 
1436 子窗口不能有菜单。 
1437 窗口没有系统菜单。 
1438 消息框样式无效。 
1439 系统范围内的(SPI_*)的参数无效。 
1440 屏幕已经锁定。 
1441 多重窗口位置结构中所有窗口句柄必须具有相同的父窗口。 
1442 窗口不是子窗口。 
1443 GW_* 命令无效。 
1444 线程标识符无效。 
1445 无法处理非多文档接口(MDI)窗口的消息。 
1446 弹出式菜单已激活。 
1447 窗口没有滚动条。 
1448 滚动条范围不能大于 MAXLONG。 
1449 无法以指定的方式显示或关闭窗口。 
1450 系统资源不足,无法完成所请求的服务。 
1451 系统资源不足,无法完成所请求的服务。 
1452 系统资源不足,无法完成所请求的服务。 
1453 配额不足,无法完成请求的服务。 
1454 配额不足,无法完成请求的服务。 
1455 页面交换文件太小,无法完成此项操作。 
1456 找不到菜单项。 
1457 键盘布局句柄无效。 
1458 不允许使用挂钩类型。 
1459 该操作需要交互式窗口工作站。 
1460 由于超时时间已过,该操作返回。 
1461 无效监视器句柄。 
1500 事件日志文件已损坏。 
1501 无法打开事件日志文件,因此无法启动事件记录服务。 
1502 事件日志文件已满。 
1503 事件日志文件在两次读取操作间已发生变化。 
1601 无法访问 Windows 安装服务。请与技术支持人员联系,确认 Windows 安装服务是否注册正确。 
1602 用户取消了安装。 
1603 安装时发生严重错误。 
1604 安装已挂起,未完成。 
1605 这个操作只对当前安装的产品有效。 
1606 功能 ID 未注册。 
1607 组件 ID 未注册。 
1608 未知属性。 
1609 句柄处于不正确的状态。 
1610 这个产品的配置数据已损坏。请与技术支持人员联系。 
1611 组件限制语不存在。 
1612 这个产品的安装来源无法使用。请验证来源是否存在,是否可以访问。 
1613 Windows 安装服务无法安装这个安装程序包。您必须安装含有 Windows 安装服务新版本的 Windows Service Park。 
1614 产品已卸载。 
1615 SQL 查询语法不正确或不被支持。 
1616 记录字符域不存在。 
1617 设备已被删除。 
1618 正在进行另一个安装操作。请在继续这个安装操作之前完成那个操作。 
1619 未能打开这个安装程序包。请验证程序包是否存在,是否可以访问;或者与应用程序供应商联系,验证这是否是有效的 Windows 安装程序包。 
1620 未能打开这个安装程序包。请与应用程序供应商联系,验证这是否是有效的 Windows 安装程序包。 
1621 启动 Windows 安装服务用户界面时有错误。请与技术支持人员联系。 
1622 打开安装日志文件时出错。请验证指定的日志文件位置是否存在,是否可以写入。 
1623 安装程序包的语言不受系统支持。 
1624 应用变换时出错。请验证指定的变换路径是否有效。 
1625 系统策略禁止这个安装。请与系统管理员联系。 
1626 无法执行函数。 
1627 执行期间,函数出了问题。 
1628 指定了无效的或未知的表格。 
1629 提供的数据类型不对。 
1630 这个类型的数据不受支持。 
1631 Windows 安装服务未能启动。请与技术支持人员联系。 
1632 临时文件夹已满或无法使用。请验证临时文件夹是否存在,是否可以写入。 
1633 这个处理器类型不支持该安装程序包。请与产品供应商联系。 
1634 组件没有在这台计算机上使用。 
1635 无法打开修补程序包。请验证修补程序包是否存在,是否可以访问;或者与应用程序供应商联系,验证这是否是有效的 Windows 安装修补程序包。 
1636 无法打开修补程序包。请与应用程序供应商联系,验证这是否是有效的 Windows 安装修补程序包。 
1637 Windows 安装服务无法处理这个修补程序包。您必须安装含有 Windows 安装服务新版本的 Windows Service Pack。 
1638 已安装这个产品的另一个版本。这个版本的安装无法继续。要配置或删除这个产品的现有版本,请用“控制面板”上的“添加/删除程序”。 
1639 无效的命令行参数。有关详细的命令行帮助,请查阅 Windows 安装服务的 SDK。 
1640 在终端服务远程会话期间,只有管理员有添加、删除或配置服务器软件的权限。如果您要在服务器上安装或配置软件,请与网络管理员联系。 
1641 要求的操作已成功结束。要使改动生效,必须重新启动系统。 
1642 Windows 安装服务无法安装升级修补程序,因为被升级的程序丢失,或者升级修补程序将更新此程序的其他版本。请确认要被升级的程序在您的计算机上且您的升级修补程序是正确的。 
1700 串绑定无效。 
1701 绑定句柄的类型错误。 
1702 绑定句柄无效。 
1703 不支持 RPC 协议顺序。 
1704 RPC 协议序列无效。 
1705 字符串的全球唯一标识符(UUID)无效。 
1706 终点的格式无效。 
1707 网络地址无效。 
1708 未找到终点。 
1709 超时设置值无效。 
1710 找不到该对象的全球唯一标识符(UUID)。 
1711 该对象的全球唯一标识符(UUID)已经注册。 
1712 这一类型的全球唯一标识符(UUID)已经注册。 
1713 RPC 服务器正在监听。 
1714 尚未注册协议顺序。 
1715 RPC 服务器不处于监听状态。 
1716 管理程序的类型未知。 
1717 接口未知。 
1718 没有绑定。 
1719 没有协议序列。 
1720 无法创建终点。 
1721 资源不足,无法完成该操作。 
1722 RPC 服务器无法使用。 
1723 RPC 服务器太忙,无法完成此项操作。 
1724 网络选项无效。 
1725 该线程中不存在活动的远程过程调用。 
1726 远程过程调用失败。 
1727 远程过程调用失败并且无法执行。 
1728 远程过程调用(RPC)协议出现错误。 
1730 RPC 服务器不支持传输语法。 
1732 不支持这种类型的全球唯一标识符。 
1733 标识无效。 
1734 数组边界无效。 
1735 绑定类型中不包含项目名。 
1736 名称语法无效。 
1737 不支持这种命名语法。 
1739 没有可用的网络地址,无法创建全球唯一标识符(UUID)。 
1740 终结点重复。 
1741 身份验证类型未知。 
1742 调用次数的上限太小。 
1743 字符串太长。 
1744 找不到 RPC 协议序列。 
1745 过程号超出范围。 
1746 此次绑定不包含任何身份验证信息。 
1747 身份验证服务未知。 
1748 身份验证级别未知。 
1749 安全描述符无效。 
1750 身份验证服务未知。 
1751 项目无效。 
1752 服务器的终结点无法执行此项操作。 
1753 终点的映射器没有更多的终点可用。 
1754 没有导出任何接口。 
1755 项目名不完整。 
1756 版本选项无效。 
1757 没有其他成员。 
1758 可以导出全部内容。 
1759 未找到接口。 
1760 项目已经存在。 
1761 项目找不到。 
1762 名称服务不可用。 
1763 网络地址集无效。 
1764 不支持请求的操作。 
1765 没有可供冒仿的安全性描述符。 
1766 远程过程调用(RPC)出现内部错误。 
1767 RPC 服务器企图进行整除零运算。 
1768 RPC 服务器出现寻址错误。 
1769 RPC 服务器中的浮点运算造成被零除。 
1770 RPC 服务器产生了浮点下溢错误。 
1771 RPC 服务器产生了浮点上溢错误。 
1772 可用于自动句柄绑定的 RPC 服务器列表已经用完。 
1773 无法打开字符转换表文件。 
1774 包含字符转换表的文件小于 512 个字节。 
1775 在远程过程调用中,客户机向主机传送了一个空的描述体句柄。 
1777 远程过程调用中的描述体句柄发生变化。 
1778 发送到远程过程调用的绑定句柄不匹配。 
1779 占位程序无法获得远程过程调用的句柄。 
1780 将空的参考指针发送给占位程序。 
1781 列举值超出范围。 
1782 字节数目太小。 
1783 占位程序接收到错误数据。 
1784 所提供的用户缓冲区对所申请的操作无效。 
1785 无法识别磁盘媒体。它可能还未格式化。 
1786 工作站没有信任密码。 
1787 服务器上的安全数据库中没有该工作站信任关系的计算机帐户。 
1788 建立主域和受托域间的信任关系失败。 
1789 建立工作站和主域间的信任关系失败。 
1790 网络登录失败。 
1791 该线程执行过程中已经进行了远程过程调用。 
1792 试图登录网络,但网络登录服务尚未启动。 
1793 用户帐户已到期。 
1794 重定向程序正在使用,无法卸载。 
1795 已经安装所指定的打印机驱动程序。 
1796 指定的端口未知。 
1797 打印机驱动程序未知。 
1798 打印处理程序未知。 
1799 指定的分隔符文件无效。 
1800 指定的优先级无效。 
1801 打印机名无效。 
1802 打印机已经存在。 
1803 打印机命令无效。 
1804 指定的数据类型无效。 
1805 指定的环境无效。 
1806 没有其他绑定。 
1807 使用的帐户是跨网络的信任帐户。请使用全局用户帐户或本地用户帐户来访问此服务器。 
1808 所使用的帐户是计算机帐户。请使用全局用户帐户或本地用户帐户来访问该服务器。 
1809 使用的帐户是服务器信任帐户。请使用全局用户帐户或本地用户帐户来访问该服务器。 
1810 指定的域名或安全标识符与域的信任信息不一致。 
1811 服务器正在使用中,无法卸载。 
1812 指定的映像文件不包含资源部分。 
1813 在映像文件中找不到指定的资源类型。 
1814 在映像文件中找不到指定的资源名称。 
1815 在映像文件中找不到指定的资源语言 ID 。 
1816 可用的配额不足,无法执行该命令。 
1817 没有已注册的接口。 
1818 远程过程调用被取消。 
1819 绑定句柄不包含所有需要的信息。 
1820 远程调用过程中发生通讯失败。 
1821 所需的身份验证级别不被支持。 
1822 主要的名称没有注册。 
1823 指定的错误不是有效的 Windows RPC 错误代码。 
1824 已分配仅在本机上有效的 UUID。 
1825 产生了特定的安全包错误。 
1826 没有取消线程。 
1827 在编码/解码处理时的操作无效。 
1828 序列化软件包的版本不兼容。 
1829 RPC 占位程序的版本不兼容。 
1830 RPC 管道对象无效或已损坏。 
1831 试图在 RPC 管道对象上进行无效操作。 
1832 不被支持的 RPC 管道版本。 
1898 找不到组成员。 
1899 无法创建终结点映射数据库条目。 
1900 对象的全球标识符(UUID)为空。 
1901 指定的时间无效。 
1902 指定的表单名无效。 
1903 指定的表单大小无效。 
1904 指定的打印机句柄正在等候处理 
1905 指定的打印机已经删除。 
1906 打印机的状态无效。 
1907 用户首次登录前,必须先更改其密码。 
1908 找不到该域的域控制器。 
1909 引用的帐户目前被锁定,可能无法登录。 
1910 没有发现指定的此对象导出者。 
1911 没有发现指定的对象。 
1912 没有发现指定的对象解析器。 
1913 一些待发数据仍停留在请求缓冲区内。 
1914 无效的异步远程过程调用句柄。 
1915 这个操作的异步 RPC 调用句柄不正确。 
1916 RPC 管道对象已经关闭。 
1917 RPC 调用在全部的管道都被处理之前完成。 
1918 没有其他可用的数据来自 RPC 管道。 
1919 这个机器没有可用的站点名。 
1920 系统无法访问此文件。 
1921 系统无法解析文件名。 
1922 项目不是所要的类型。 
1923 无法将所有对象的 UUID 导出到指定的项。 
1924 无法将接口导出到指定的项。 
1925 无法添加指定的配置文件项。 
1926 无法添加指定的配置文件元素。 
1927 无法删除指定的配置文件元素。 
1928 无法添加组元素。 
1929 无法删除组元素。 
2000 像素格式无效。 
2001 指定的驱动程序无效。 
2002 该操作的窗口样式或类属性无效。 
2003 不支持请求的图元文件操作。 
2004 不支持请求的转换操作。 
2005 不支持请求的剪辑操作。 
2010 指定的颜色管理模块无效。 
2011 指定的颜色文件配置无效。 
2012 找不到指定的标识。 
2013 所需的标识不存在。 
2014 指定的标识已经存在。 
2015 指定的颜色文件配置与任何设备都不相关。 
2016 找不到该指定的颜色文件配置。 
2017 指定的颜色空间无效。 
2018 图像颜色管理没有启用。 
2019 在删除该颜色转换时有一个错误。 
2020 指定的颜色转换无效。 
2021 指定的转换与位图的颜色空间不匹配。 
2022 指定的命名颜色索引在配置文件中不存在。 
2108 网络连接已成功,但需要提示用户输入一个不同于原始指定的密码。 
2202 指定的用户名无效。 
2250 网络连接不存在。 
2401 在这个网络连接上已存在打开的文件或未处理的请求。 
2402 活动的连接仍然存在。 
2404 设备正由活动进程使用,无法断开连接。 
3000 指定的打印监视程序未知。 
3001 指定的打印机驱动程序正在使用中。 
3002 找不到假脱机文件。 
3003 没有发出 StartDocPrinter 调用。 
3004 尚未发出 AddJob 调用。 
3005 指定的打印处理程序已经安装。 
3006 指定的打印监视程序已经安装。 
3007 该指定的打印监视器不具备所要求的功能。 
3008 指定的打印机监视器正在使用中。 
3009 当打印机有作业排成队列时此操作请求是不允许的。 
3010 请求的操作成功。只有重新启动系统,更改才会生效。 
3011 请求的操作成功。只有重新启动服务,更改才会生效。 
3012 找不到打印机。 
4000 WINS 在处理命令时遇到执行错误。 
4001 无法删除本地的 WINS。 
4002 从文件引入失败。 
4003 备份失败。以前执行过完整的备份吗? 
4004 备份失败。请检查备份数据库的目标目录。 
4005 名称在 WINS 数据库中不存在。 
4006 不允许进行未配置部分的复制。 
4100 DHCP 客户获得一个在网上已被使用的 IP 地址。直到 DHCP 客户可以获得新的地址前,本地接口将被禁用。 
4200 WMI 数据提供程序不能识别传来的 GUID 是否有效。 
4201 WMI 数据提供程序无法识别传来的实例名是否有效。 
4202 WMI 数据提供程序无法识别传来的数据项目标识符是否有效。 
4203 无法完成 WMI 请求,请重试一次。 
4204 找不到 WMI 数据提供程序。 
4205 WMI 数据提供程序引用到一个未注册的实例组。 
4206 WMI 数据块或事件通知已启用。 
4207 WMI 数据块不再可用。 
4208 WMI 数据服务无法使用。 
4209 WMI 数据提供程序无法完成请求。 
4210 WMI MOF 信息无效。 
4211 WMI 注册信息无效。 
4212 WMI 数据块或事件通知已禁用。 
4213 WMI 数据项目或数据块为只读。 
4214 WMI 数据项目或数据块不能更改。 
6118 该工作组的服务器列表当前不可用。 
6200 要正常运行,任务计划程序服务的配置必须在系统帐户中运行。单独的任务可以被配置成在其他帐户中运行。 
7001 指定的会话名无效。 
7002 指定的协议驱动程序无效。 
7003 在系统路径上找不到指定的协议驱动程序。 
7004 在系统路径上找不到指定的终端连接驱动程序。 
7005 不能为这个会话创建一个事件日志的注册键。 
7006 同名的一个服务已经在系统中存在。 
7007 在会话上一个关闭操作挂起。 
7008 没有可用的输出缓冲器。 
7009 找不到 MODEM.INF 文件。 
7010 在 MODEM.INF 中没有找到调制解调器名称。 
7011 调制解调器没有接受发送给它的指令。验证配置的调制解调器与连接的调制解调器是否匹配。 
7012 调制解调器没有响应发送给它的指令。验证该调制解调器是否接线正确并且打开了电源开关。 
7013 由于断开连接,载波检测失败或载波停止。 
7014 在要求的时间内没有发现拨号音。确定电话线连接正确并可使用。 
7015 在远程站点回叫时检测到了占线信号。 
7016 在回叫时远程站点上检测到了声音。 
7017 传输驱动程序错误 
7022 找不到指定的会话。 
7023 指定的会话名称已处于使用中。 
7024 由于终端连接目前正在忙于处理一个连接、断开连接、复位或删除操作,无法完成该请求的操作。 
7025 试图连接到其视频模式不受当前客户支持的会话。 
7035 应用程序尝试启动 DOS 图形模式。不支持 DOS 图形模式。 
7037 您的交互式登录权限已被禁用。请与您的管理员联系。 
7038 该请求的操作只能在系统控制台上执行。这通常是一个驱动程序或系统 DLL 要求直接控制台访问的结果。 
7040 客户未能对服务器连接消息作出响应。 
7041 不支持断开控制台会话。 
7042 不支持重新将一个断开的会话连接到控制台。 
7044 远程控制另一个会话的请求被拒绝。 
7045 拒绝请求的会话访问。 
7049 指定的终端连接驱动程序无效。 
7050 不能远程控制请求的会话。这也许是由于该会话被中断或目前没有一个用户登录。另外,您不能从该系统控制台远程控制一个会话或远程控制系统控制台。并且,您不能远程控制您自己的当前会话。 
7051 该请求的会话没有配置成允许远程控制。 
7052 连接到这个终端服务器的申请被拒绝。终端服务器客户许可证目前正在被另一个用户使用。请与系统管理员联系,获取一份新的终端服务器客户,其许可证号码必须是有效的、唯一的。 
7053 连接到这个终端服务器的申请被拒绝。还没有为这份终端服务器客户输入您的终端服务器客户许可证号码。请与系统管理员联系,为该终端服务器客户输入一个有效的、唯一的许可证号码。 
7054 系统已达到其授权的登录限制。请以后再试一次。 
7055 您正在使用的客户没有使用该系统的授权。您的登录请求被拒绝。 
7056 系统许可证已过期。您的登录请求被拒绝。 

posted on 2009-03-02 18:50:49 by sun.wei  评论(0) 阅读(4617)

 
2009年02月21日

很久没有执行过Backup database的语句了,想想上次客户那里执行backup还是去年10月份的事情。当时发现SQL Server 2008中的backup compression是一个很不错的功能,可以省去购买Lite Speed的成本了(虽然那个东西也不贵),不但能够提升备份的速度还可以减少备份文件的尺寸,节约空间就是节约成本(节约的成本要是能够把50%分给个人就好了)。今天讲课时突然想到,如果压缩遇到其他的SQL特性会如何。

备份压缩要是遇到表压缩空间和速度观察了一下,没有太对变化,当然不可能用户对所有的表都压缩(我测试的数据库只有1个表,选择了行压缩和页压缩)。

use bk01
go
create table t0
(id int identity(1,1), d datetime2)
go
use bk02
go
create table t1
(id int identity(1,1), d datetime2)
go
declare @i int=100000
while(@i>0)
begin
insert bk02.dbo.t1 values(SYSDATETIME())
insert bk01.dbo.t0 values(SYSDATETIME())
set @i-=1
end
backup database bk02 to disk='e:\bk02_notablecompression_nobackupcompression.bak'
backup database bk02 to disk='e:\bk02_notablecompression_backupcompression.bak' with compression
backup database bk01 to disk='e:\bk01_tablecompression_nobackupcompression.bak'
backup database bk01 to disk='e:\bk01_tablecompression_backupcompression.bak' with compression

运行结果是

tablecompression_backupcompression 811KB

tablecompression_nobackupcompression 3162KB

notablecompression_backupcompression 640KB

notablecompression_nobackupcompression 3731KB

表压缩对于减少备份压缩没有太多帮助。

 

如果备份压缩遇到TDE,感觉备份文件的大小没有什么变化,这个应该和文件的内容有关系。例如文本文件和视频文件的压缩比会差很多,文本文家加密后的压缩比就与视频文件的比较类似了。TDE是在存储文件的内容上进行的加密,原来SQL Server的文件都是明文的,存在可以压缩的规律,但是加密后数据没有什么规律,这样备份压缩就起不到太大作用,而且还会带来额外的CPU开销。

TDE和备份压缩建议不要一起使用。

posted on 2009-02-21 14:54:49 by sun.wei  评论(0) 阅读(3432)

 
【第1页/共3页,21条】
首页
前页
1

Powered by: Joycode.MVC引擎 0.5.2.0