Sunday, January 18, 2009

using SSIS for send out mail

Here's my code that uses both port and BCC:

fromAddress = New MailAddress("foo@bar.co.uk", "Database Mail")
toAddress = New MailAddress("somebody@somewhere.co.uk", "Data Group")
bccAddress = New MailAddress("somebody.else@somewhere.co.uk", "Data Group")

message = New MailMessage(fromAddress, toAddress)
messag.Bcc.Add(bccAddress)
message.Subject = "Data Mart Load Start"
message.Priority = MailPriority.High
message.IsBodyHtml = False
message.Body = "The Data Mart load process has started. Please exit all reporting systems until notified that the load process has completed."

smtpClient = New SmtpClient("mail.bar.co.uk", 2525)
smtpClient.Credentials = New System.Net.NetworkCredential("login", "password")
smtpClient.Send(message)
Dts.TaskResult = Dts.Results.Success

Thursday, January 15, 2009

Maximum JVM Heap Size 32/64bit (For reference only)

Maximum JVM Heap Size 32/64bit
An important calculation to keep in mind is:
(Managed Heap + native heap + (thread stack size * number of threads)) cannot exceed 2GB on 32bit
x86 Windows or Linux systems
This is a limitation of the Sun Java VM. It means that even if you install 4GB of RAM into your server, a
single instance of the JVM cannot grow beyond 2GB on a 32bit server machine.
Note: Note that a 64 bit OS/JVM has much bigger values. It is recommended that a 64bit OS with large
memory hardware (>2GB assigned to the JVM) is used for deployments of >250 concurrent or >2500
casual users.
You can also setup your machine to cluster if you prefer to solve multi-user access performance issues
with additional machines rather than a single powerful server.

Performance Tuning Code Samples

http://java.sun.com/developer/codesamples/performance.html

JVM Structure

http://java.sun.com/docs/books/jvms/

 有排睇..

SSIS Nugget: RetainSameConnection property of the OLE DB Connection Manager

SSIS Nugget: RetainSameConnection property of the OLE DB Connection Manager

Did you know....

...that you can run regular SQL Server transactions in SSIS over multiple tasks without requiring the use of Distributed Transaction Coordinator (DTC)? Well I didn't but thanks to that man again, Kirk Haselden, I do now.

The default behaviour of a Connection Manager is that every task has its own connection which is why they are so named and not simply named "Connection" as in DTS2000. The RetainSameConnection property on the OLE DB Connection Manager enables you to run multiple tasks against SQL Server all within 1 SQL Server transaction if its RetainSameConnection property equals TRUE. That means that you can BEGIN TRANSACTION in one Execute SQL Task and then choose to COMMIT or ROLLBACK in another one. You can even enlist data-flows in that transaction as well!

Allow me to demonstrate.

Here's my package.

20050820ControlFlow.JPG


In the first Execute SQL Task I create myself a table and begin a transaction.

20050820BeginTran.JPG


The data-flow inserts some data into that table.

20050820DataFlow.JPG


And the second Execute SQL Task rolls back the transaction.

20050820RollbackTran.JPG

If you check the table afterwards.....there's nothing in it!

Have a go - you can download the package from here: http://blogs.conchango.com/Admin/ImageGallery/blogs.conchango.com/jamie.thomson/20050820RetainSameConnection.zip


Here was me thinking you could only run transactions either within the same Execute SQL Task or else using distributed transactions. There's just always something new to learn about this thing isn't there!!!

Tuesday, January 13, 2009

SSIS 不同charset 問題....

終於搵到方法....其實最簡單就係個db同d file都係utf-8啦
如果唔係既話....記住d flat file conntection 入面既所有既char
要變成unicode string,之後係 flat file source obj上right click選
advanced editor for flat file source->Input and Output Properties
 要保證external columns要係所有coding都係unicode string
而output columns既就轉返你要用既codepage(charset)
同用返string.....

char==string......
記住啦

Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine

http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

Java Performance Documentation

http://java.sun.com/docs/performance/

Java HotSpot Garbage Collection

http://java.sun.com/javase/technologies/hotspot/gc/index.jsp

Tomcat 的JVM 内存溢出问题的解决

关键字: tomcat outofmemoryerror permgen space java heap space
最近在熟悉一个开发了有几年的项目,需要把数据库从mysql移植到oracle,首先把jdbc的连接指向mysql,打包放到tomcat里面,可以 跑起来,没有问题,可是当把jdbc连接指向oracle的时候,tomcat就连续抛java.lang.OutOfMemoryError的错误,上 网google了一下,了解了一下tomcat的运行机制,也解决了问题,share出来,以备查。

1、首先是:java.lang.OutOfMemoryError: Java heap space

解释:

Heap size 设置

JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。

解决方法:

手动设置Heap size
修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
Java代码 复制代码
  1. set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m


或修改catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"

2、其次是:java.lang.OutOfMemoryError: PermGen space

原因:

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

解决方法:

1. 手动设置MaxPermSize大小
修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在
Java代码 复制代码
  1. “echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
  2. set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m


catalina.sh下为:
Java代码 复制代码
  1. JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"



另外看到了另外一个帖子,觉得挺好,摘抄如下:
分析java.lang.OutOfMemoryError: PermGen space

发现很多人把问题归因于: spring,hibernate,tomcat,因为他们动态产生类,导致JVM中的permanent heap溢出 。然后解决方法众说纷纭,有人说升级 tomcat版本到最新甚至干脆不用tomcat。还有人怀疑spring的问题,在spring论坛上讨论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类。

但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因呢?tomcat在Q&A很隐晦的回答了这一点,我们知道这个问题,但这个问题是由一个更基础的问题产生。

于是有人对更基础的JVM做了检查,发现了问题的关键。原来SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就 固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!


对于以上两个问题,我的处理是:

在catalina.bat的第一行增加:
Java代码 复制代码
  1. set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m


在catalina.sh的第一行增加:
Java代码 复制代码
  1. JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

转自:http://kuangbaoxu.javaeye.com/blog/192433

How to loop through files in a specified folder, load one by one and move to archive folder using SSIS?

http://pragmaticworks.com/community/blogs/nayanpatel/archive/2008/11/13/how-to-loop-through-files-in-a-specified-folder-load-one-by-one-and-move-to-archive-folder-using-ssis.aspx

Monday, January 12, 2009

Android

http://www.javaworld.com.tw/jute/post/view?bid=26&id=219829&sty=1&tpg=1&age=-1
http://www.javaworld.com.tw/jute/post/view?bid=26&id=219834&sty=1&tpg=1&age=-1
http://www.javaworld.com.tw/jute/post/view?bid=26&id=219835&sty=1&tpg=1&age=-1
http://www.javaworld.com.tw/jute/post/view?bid=26&id=220066&sty=1&tpg=1&age=-1
http://www.javaworld.com.tw/jute/post/view?bid=26&id=220067&sty=1&tpg=1&age=-1
http://www.javaworld.com.tw/jute/post/view?bid=26&id=220068&sty=1&tpg=1&age=-1
http://www.javaworld.com.tw/jute/post/view?bid=26&id=220353&sty=1&tpg=1&age=-1
http://www.javaworld.com.tw/jute/post/view?bid=26&id=220354&sty=1&tpg=1&age=-1

J2ME的通用LOG框架

http://www.blogjava.net/hadeslee/archive/2008/08/04/219945.html

用RMI和CORBA进行分布式Java编程

http://www.yesky.com/18/1706018.shtml

动态语言IDE:Aptana Ruby和DLTK Ruby

http://www.infoq.com/cn/news/2008/12/ruby-ides

JDK5增强for循环的使用

JDK5增强for循环的使用,此语法有很大的缺陷,仅适用于有限的输出 package com.bulktree;

import java.util.ArrayList;
import java.util.Collection;
/**//*
* jdk.15增加的for循环
* */
public class TestFor
{
public static void main(String[] args)
{
int[] arr = {1,2,3,4,5,6,7,8,9,0};
for(int i : arr)
{
System.out.println(i);
}

Collection c = new ArrayList();
c.add(new String("111"));
c.add(new String("222"));
c.add(new String("333"));
c.add(new String("444"));
c.add(new String("555"));
c.add(new String("666"));
c.add(new String("777"));
c.add(new String("888"));
c.add(new String("999"));
c.add(new String("000"));
for(Object o : c)
{
System.out.println(o);
}
}
}

Java 7 路线图更新:反响强烈!

在Devoxx大会上,Java SE首席工程师Mark Reinhol,做了一个关于Java 7(2010年初发布)最新发展方向的演讲。虽然,Mark称这次演讲的内容只是暂时的计划、不具约束力,但是仍然在社区中引起了很多反响,特别是针对闭 包特性(Closures)的遗漏。

出席会议的Hamlet D'Arcy提供了一个Mark演讲中有关Java 7特性的总结。其中一些比较重要的变化包括:

模块化——294和Jigsaw项目

292——JVM对动态语言的支持

JSR 203——更多新的I/O API已基本完成,包括真正异步的I/O(不仅仅是非阻塞I/O)和一个真正的文件系统API。

JSR TBD:小的语言变化(见下)

安全重抛出——允许一个广泛的catch语句,编译器可以更加智能的基于try语句块中抛出的异常管理重新抛出。(我以前没有见过,不过看起来不错)

Nulll解引用(dereference)表达式——Null通过'?'语法检查,类似于Groovy...使开发人员避免一连串null检查。

更好的类型推断(type inference)——与泛型实例化有关,但目前还不清楚这种推断会达到什么程度(我觉得越多越好)。

多捕捉(Multi-catch)——(是的!)允许在catch语句中用逗号分割一系列异常类型。

Joe Darcy正在领导Open JDK开发,他的博客地址是http://blogs.sun.com/darcy

JSR 296——Swing应用框架——仍然需要更简化以方便Swing应用开发。

6u10特性的向前兼容(Java Kernal、QUickstarter、新Plug-in等)。

他同时提到了曾经考虑过但可能不会引入到Java 7的特性:

闭包——围绕提议没有形成一致意见
具体化泛型(Reified generics)

第一类属性(1st class properties)

操作符重载

BigDecimal语法

JSR 295——Bean绑定

Java.net开展了一次有关“哪些Java 7未采纳的特性是你最感兴趣的”的调查,其中闭包明显处于其他特性之前:

闭包 47.4% (734 Votes)
具体化泛型 17.2% (266 Votes)

第一类属性 10.4% (162 Votes)

操作符重载 4.3% (67 Votes)

BigDecimal语法 3.4% (54 Votes)

JSR-295 Bean绑定 7.3% (113 Votes)

我对任何特性都不感兴趣 9.7% (150 Votes)

Ricky Clarkson认为没有闭包Java将灭亡:

果然被证实了。虽然James Gosling想要闭包,虽然已经有了3个闭包原型编译器,虽然其他JVM语言支持闭包,Java 7还是没有闭包。

Martin Kneissl也认为Java 7中没有闭包是个坏消息:

应该增加闭包而不是Java 5中的“for”循环新形式。在Java 6中就应该有闭包。现在似乎Java 7中也不会有了。

闭包并不难以理解。至少当你把它们与Java中的匿名内部类作比较时是这样的。有的人不赞同。他们觉得总有一些愚蠢的程序员,所以应该限制语言以防止他们引起太多破坏,我不认同这个理由。这是不可能的。不称职的程序员在任何语言中都会搬起石头砸自己的脚。

幸运的是,JVM上还有其他语言可以使用Java的优点:库、可移植性和工具(某种程度上)。

Dustin Marx在关于Java 7中最期待的特性的帖子中对闭包有一些矛盾的看法:

就 在我写这篇帖子的时候,已经有160票投完(不过很快就会出现新的投票),其中Java SE 7中最期待的落选特性是闭包。目前,闭包特性已经得到了总票数的几乎一半。从某种意义上说,这并不奇怪。闭包似乎主宰了Java SE 7的讨论直到被宣布不会在Java SE 7中引入。但是讨论是围绕着闭包的概念和如何实现闭包进行的争论。虽然闭包是Java SE 7最期待的落选特性之一,但是我个人对此非常矛盾。我有时会偶然的在工作中意识到闭包是多么有用,但是多数情况下没有它我也可以应付。也就是说,我不介意 它被引入,但是当我听到没有被包含在Java SE 7中时这并没有困扰我。但是,如果我们相信目前的投票结果,那么接近一半的Java开发人员最想要这个特性。这与Java.net有关开发人员最想要 Java SE 7引入闭包的问卷调查是一致的。


Osvaldo Doederlein对新特性感到兴奋,不过仍然很期望闭包:

Java 7是多年基础设施智能化的最好版本:294/Jigsaw,并发类加载——我认为这会提高大应用程序的启动时间,特别是类似于JavaEE服务器和IDE 等基于微内核的应用,XRender——将最终使Java成为Linux桌面应用的一等公民,G1,全64位支持(将在6u12中首次亮相,获取beta 版),ForkJoin。

这么多的好特性,我几乎都快忘了失去闭包的悲伤了。我猜是时候转移到Scala、JavaFX或者其他现代 JVM语言上了(只要不是类似于Ruby 或者Python的动态类型语言)。我认为从现在开始五年,如果我编写某种低层次的运行时,我会只写“标准”Java代码。多亏社区的保护,Java语言 正在慢慢转为一种遗产和低层次的角色。

另一方面,Matt Grommes关注于BigDecimal语法:

我致力于一个金融系统有一年多时间了,BigDecimal语法简直太痛苦了。我真的非常不满意。

Stephen Colebourne向Devoxx和JavaEdge的与会者展示了JDK7语言的10种可能变化,并请他们投票:

绝对的胜者是——null处理。Null处理获得了50张最优先支持票,是排在第二位的字符串切换(string switch)特性票数的两倍,几乎是全部最优先支持票数的三分之一。而且,几乎有三分之二的与会者把它放在了前四位优先支持的特性里。

其他受欢迎的特性包括字符串切换、异常的多捕捉、对Map的增强型for-each循环(能够删除或者查找索引)和ARM风格的资源管理。

不受欢迎的特性(特别认为是糟糕建议的)是通过[]访问List/Map和字符串插值(字符串中的${variable} )。

泛型推断和多行字符串处于相对较低优先级但与会者不是特别反感。

值得一提的是,在Devoxx上对闭包特性的投票结果是50:50。

Java应用逐步从集中式步入分布式

http://www.blogjava.net/BlueDavy/archive/2009/01/04/249763.html

Sunday, January 11, 2009

索引for ms-sql

有參考價值

索引问题

一 概述

可以利用索引快速访问数据库表中的特定信息。索引是对数据库表中一个或多个列的值进行排序的结构。
索引提供指针以指向存储在表中指定列的数据值,然后根据指定的排序次序排列这些指针。
数据库使用索引的方式与使用书的目录很相似:通过搜索索引找到特定的值,
然后跟随指针到达包含该值的行


二 索引的两种类型:

聚集索引=簇集索引

聚集索引基于数据行的键值在表内排序和存储这些数据行。由于数据行按基于聚集索引键的排序次序存储,
因此聚集索引对查找行很有效。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。
数据行本身构成聚集索引的最低级别。

只有当表包含聚集索引时,表内的数据行才按排序次序存储。如果表没有聚集索引,
则其数据行按堆集方式存储。

聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,
便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行的一个查询经常检索某一日期范围
内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,
直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时
经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,
从而节省成本

非聚集索引

非聚集索引具有完全独立于数据行的结构。非聚集索引的最低行包含非聚集索引的键值,
并且每个键值项都有指针指向包含该键值的数据行。数据行不按基于非聚集键的次序存储。

在非聚集索引内,从索引行指向数据行的指针称为行定位器。
行定位器的结构取决于数据页的存储方式是堆集还是聚集。对于堆集,行定位器是指向行的指针。
对于有聚集索引的表,行定位器是聚集索引键。
只有在表上创建了聚集索引时,表内的行才按特定的顺序存储。这些行就基于聚集索引键按顺序存储。
如果一个表只有非聚集索引,它的数据行将按无序的堆集方式存储
非聚集索引可以建多个,两者都能改善查询性能

非聚集索引与聚集索引一样有 B 树结构,但是有两个重大差别:
数据行不按非聚集索引键的顺序排序和存储。
非聚集索引的叶层不包含数据页。
相反,叶节点包含索引行。每个索引行包含非聚集键值以及一个或多个行定位器,
这些行定位器指向有该键值的数据行(如果索引不唯一,则可能是多行)。
非聚集索引可以在有聚集索引的表、堆集或索引视图上定义


另外
唯一索引

唯一索引可以确保索引列不包含重复的值。在多列唯一索引的情况下,该索引可以确保索引列中每个值组
合都是唯一的。唯一索引既是索引也是约束。

复合索引
索引项是多个的就叫组合索引,也叫复合索引。复合索引使用时需要注意索引项的次序。

二 索引的创建

有两种方法可以在 SQL Server 内定义索引: CREATE INDEX 语句和CREATE TABLE 语句

CREATE TABLE支持在创建索引时使用下列约束:

PRIMARY KEY 创建唯一索引来强制执行主键
UNIQUE 创建唯一索引
CLUSTERED 创建聚集索引
NONCLUSTERED 创建非聚集索引

注: 1 定义索引时,可以指定每列的数据是按升序还是降序存储。如果不指定,则默认为升序
2 支持在计算列上创建索引
3 为索引指定填充因子
可标识填充因子来指定每个索引页的填满程度。索引页上的空余空间量很重要,
因为当索引页填满时,系统必须花时间拆分它以便为新行腾出空间。


三 索引的维护语句

DBCC DBREINDEX 重建指定数据库中表的一个或多个索引
DBCC INDEXFRAG  整理指定的表或视图的聚集索引和辅助索引碎片

比较

速度 兼容性 日志影响 数据访问影响 额外磁盘空间
DBCC 最快 最好 大,但能通过把 操作过程中数据不 需要大
DBREINDEX 可以重 故障还原模型设 能访问,影响大
建所有 为简单减少日志
有索引

DBCC 慢 但可 必须分 小 数据未被锁定 需要小
INDEXDEFRAG 随时终 别指定
止执行


drop index 中等 必须分 大,但能通过把 仅在操作执行时 中等,操作在
create index 别指定 故障还原模型设 锁定数据 tempdb中进行为简单减少日志


四 查看索引的方法

sp_indexes 返回指定远程表的索引信息
INDEXKEY_PROPERTY 返回有关索引键的信息
sysindexes系统表 数据库中的每个索引和表在表中各占一行,该表存储在每个数据库中


五 可以通过执行计划
查看sql语句执行时是否建立在索引之上

比如
CREATE TABLE Test
(Field_1 int NOT NULL,
Field_2 int CONSTRAINT PK_Test
PRIMARY KEY CLUSTERED (Field_1))

CREATE index IX_Test ON Test (Field_2)

1 SELECT * FROM Test WHERE Field_2 =408
执行计划可以看出使用了IX_Test索引
2 SELECT * FROM Test WHERE Field_1 =1
执行计划可以看出使用了PK_Test
3 但如果是SELECT * FROM Test with (index(IX_Test)) WHERE Field_1 =1
则指定使用索引


六 索引的具体使用 (转贴)

1) 索引的设计
A:尽量避免表扫描
检查你的查询语句的where子句,因为这是优化器重要关注的地方。包含在where里面的每一列(column)都是可能的侯选索引,为能达到最优的性能,考虑在下面给出的例子:对于在where子句中给出了column1这个列。
下面的两个条件可以提高索引的优化查询性能!
第一:在表中的column1列上有一个单索引
第二:在表中有多索引,但是column1是第一个索引的列
避免定义多索引而column1是第二个或后面的索引,这样的索引不能优化服务器性能
例如:下面的例子用了pubs数据库。
SELECT au_id, au_lname, au_fname FROM authors
WHERE au_lname = ’White’
按下面几个列上建立的索引将会是对优化器有用的索引
?au_lname
?au_lname, au_fname
而在下面几个列上建立的索引将不会对优化器起到好的作用
?au_address
?au_fname, au_lname
考虑使用窄的索引在一个或两个列上,窄索引比多索引和复合索引更能有效。用窄的索引,在每一页上
将会有更多的行和更少的索引级别(相对与多索引和复合索引而言),这将推进系统性能。
对于多列索引,SQL Server维持一个在所有列的索引上的密度统计(用于联合)和在第一个索引上的
histogram(柱状图)统计。根据统计结果,如果在复合索引上的第一个索引很少被选择使用,那么优化器对很多查询请求将不会使用索引。
有用的索引会提高select语句的性能,包括insert,uodate,delete。
但是,由于改变一个表的内容,将会影响索引。每一个insert,update,delete语句将会使性能下降一些。实验表明,不要在一个单表上用大量的索引,不要在共享的列上(指在多表中用了参考约束)使用重叠的索引。
在某一列上检查唯一的数据的个数,比较它与表中数据的行数做一个比较。这就是数据的选择性,这比较结果将会帮助你决定是否将某一列作为侯选的索引列,如果需要,建哪一种索引。你可以用下面的查询语句返回某一列的不同值的数目。
select count(distinct cloumn_name) from table_name
假设column_name是一个10000行的表,则看column_name返回值来决定是否应该使用,及应该使用什么索引。
Unique values Index

5000 Nonclustered index
20 Clustered index
3 No index


2) 镞索引和非镞索引的选择

<1:> 镞索引是行的物理顺序和索引的顺序是一致的。页级,低层等索引的各个级别上都包含实际的数据页。一个表只能是有一个镞索引。由于 update,delete语句要求相对多一些的读操作,因此镞索引常常能加速这样的操作。在至少有一个索引的表中,你应该有一个镞索引。
在下面的几个情况下,你可以考虑用镞索引:
例如: 某列包括的不同值的个数是有限的(但是不是极少的)
顾客表的州名列有50个左右的不同州名的缩写值,可以使用镞索引。
例如: 对返回一定范围内值的列可以使用镞索引,比如用between,>,>=,<,<=等等来对列进行操作的列上。
select * from sales where ord_date between ’5/1/93’ and ’6/1/93’
例如: 对查询时返回大量结果的列可以使用镞索引。
SELECT * FROM phonebook WHERE last_name = ’Smith’

当有大量的行正在被插入表中时,要避免在本表一个自然增长(例如,identity列)的列上建立镞索引。如果你建立了镞的索引,那么insert的性能就会大大降低。因为每一个插入的行必须到表的最后,表的最后一个数据页。
当一个数据正在被插入(这时这个数据页是被锁定的),所有的其他插入行必须等待直到当前的插入已经结束。
一个索引的叶级页中包括实际的数据页,并且在硬盘上的数据页的次序是跟镞索引的逻辑次序一样的。

<2:>一个非镞的索引就是行的物理次序与索引的次序是不同的。一个非镞索引的叶级包含了指向行数据页的指针。
在一个表中可以有多个非镞索引,你可以在以下几个情况下考虑使用非镞索引。
在有很多不同值的列上可以考虑使用非镞索引
例如:一个part_id列在一个part表中
select * from employee where emp_id = ’pcm9809f’
查询语句中用order by 子句的列上可以考虑使用镞索引



3) 一个表列如果设为主键(primary key),它会自动生成一个聚簇索引
这时不能直接使用Drop index Table1.Tableindex1语句
必须删除主键约束,用语句:alter table table1 drop constraint 约束名(如pk_xxx)


最后补充

全文索引请参考
http://expert.csdn.net/Expert/topic/1594/1594455.xml?temp=.1432154

Saturday, January 10, 2009

select a.Item_number, a.customer_group_id, a.submitted_year, a.submitted_mth,sum(a.sumOfSMFQty) as sumOfSMFQty

from

(select smf.Item_number, cl.customer_group_id,
'F'+Right(DatePart(yyyy, DateAdd(m, 1, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2) AS submitted_Year,
'P'+Replace(Str(DatePart(m, DateAdd(m, 1, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2), ' ', '0') as submitted_mth,
sum(quantity)as sumOfSMFQty

from
shipment_month_figure smf left join customer_list cl
on cl.customer_number= smf.customer_number
and is_invoiced='invoiced'

group by item_number, cl.customer_group_id, fiscal_year, fiscal_Period

UNION

select smf.Item_number, cl.customer_group_id,
'F'+Right(DatePart(yyyy, DateAdd(m, 2, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2) AS submitted_Year,
'P'+Replace(Str(DatePart(m, DateAdd(m, 2, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2), ' ', '0') as submitted_mth,
sum(quantity)as sumOfSMFQty

from
shipment_month_figure smf left join customer_list cl
on cl.customer_number= smf.customer_number
and is_invoiced='invoiced'

group by item_number, cl.customer_group_id, fiscal_year, fiscal_Period

UNION

select smf.Item_number, cl.customer_group_id,
'F'+Right(DatePart(yyyy, DateAdd(m, 3, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2) AS Submitted_Year,
'P'+Replace(Str(DatePart(m, DateAdd(m, 3, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2), ' ', '0') as submitted_mth,
sum(quantity)as sumOfSMFQty

from
shipment_month_figure smf left join customer_list cl
on cl.customer_number= smf.customer_number
and is_invoiced='invoiced'

group by item_number, cl.customer_group_id, fiscal_year, fiscal_Period

UNION

select smf.Item_number, cl.customer_group_id,
'F'+Right(DatePart(yyyy, DateAdd(m, 4, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2) AS Submitted_Year,
'P'+Replace(Str(DatePart(m, DateAdd(m, 4, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2), ' ', '0') as submitted_mth,
sum(quantity)as sumOfSMFQty

from
shipment_month_figure smf left join customer_list cl
on cl.customer_number= smf.customer_number
and is_invoiced='invoiced'

group by item_number, cl.customer_group_id, fiscal_year, fiscal_Period

UNION

select smf.Item_number, cl.customer_group_id,
'F'+Right(DatePart(yyyy, DateAdd(m, 5, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2) AS submitted_Year,
'P'+Replace(Str(DatePart(m, DateAdd(m, 5, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2), ' ', '0') as submitted_mth,
sum(quantity)as sumOfSMFQty

from
shipment_month_figure smf left join customer_list cl
on cl.customer_number= smf.customer_number
and is_invoiced='invoiced'

group by item_number, cl.customer_group_id, fiscal_year, fiscal_Period

UNION

select smf.Item_number, cl.customer_group_id,
'F'+Right(DatePart(yyyy, DateAdd(m, 6, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2) AS submitted_Year,
'P'+Replace(Str(DatePart(m, DateAdd(m, 6, '20'+Replace(smf.fiscal_year,'F','')+Replace(smf.fiscal_period,'P','')+'01' )), 2), ' ', '0') as submitted_mth,
sum(quantity)as sumOfSMFQty

from
shipment_month_figure smf left join customer_list cl
on cl.customer_number= smf.customer_number
and is_invoiced='invoiced'

group by item_number, cl.customer_group_id, fiscal_year, fiscal_Period


) a

Group by a.Item_number, a.customer_group_id, a.submitted_year, a.submitted_mth



原來咁樣做可以囉到六個月既total數....好crazy

Tuesday, January 6, 2009

SSIS number vs decimal 及 encoding

number 可以set長度同小數位
decimal 只可set小數位




encoding 問題未解決
問題如下....當encode file係utf8 用ssis食入去一個db 係lantin
但char field係唔可能用unicode....因為佢唔比....
所以強行食入未必得...會有error...代解決

update 8/1/2008
呢個問題解決唔到...因為本身個table個encoding問1.題....無謂試....