sql查询执行效率条件中最好不要使用OR 或IN )
1.有索引的列优先,都有索引的看查询出来的数据量,少的优先
in ,not in,<>,is null,is not null 等由于不会走索引,尽量不要使用。
WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如
Select * from zl_yhjbqk where dy_dj = '1K以下' and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1K以下'
以 上两个SQL中dy_dj及xh_bz两个字段都没进行索引,所以执行的时候都是全表扫描,第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的 比较,而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。
2.选择最有效率的表名顺序
sql解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表
如果tab2中记录数明显高于tab1,用
SELECT COUNT(*) FROM tab2, tab1
效率明显优于
SELECT COUNT(*) FROM tab1, tab2
1、操作符号: NOT IN操作符
此 操作是强列推荐不使用的,因为它不能应用表的索引。推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替 "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", "LIKE '%500'",因为他们不走索引全是表扫描。NOT IN会多次扫描表,使用EXISTS、NOT EXISTS、IN、LEFT OUTER JOIN来替代,特别是左连接,而Exists比IN更快,最慢的是NOT操作. 如果列的值含有空,以前它的索引不起作用,现在2000的优化器能够处理了。相同的是IS NULL,"NOT", "NOT EXISTS", "NOT IN"能优化她,而"<>"等还是不能优化,用不到索引。
2、注意union和union all的区别。union比union all多做了一步distinct操作。能用union all的情况下尽量不用union。
3、查询时尽量不要返回不需要的行、列。另外在多表连接查询时,尽量改成连接查询,少用子查询。
4、尽量少用视图,它的效率低。对视图操作比直接对表操作慢,可以用存储过程来代替它。特别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。
我们看视图的本质:它是存放在服务器上的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时,不要使用指向多个表的视图,
直接从表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。
5、创建合理的索引,对于插入或者修改比较频繁的表,尽量慎用索引。因为如果表中存在索引,插入和修改时也会引起全表扫描。
索引一般使用于where后经常用作条件的字段上。
6、在表中定义字段或者存储过程、函数中定义参数时,将参数的大小设置为合适即可,勿设置太大。这样开销很大。
7、Between在某些时候比IN速度更快,Between能够更快地根据索引找到范围。用查询优化器可见到差别。
select * from chineseresume where title in ('男','女')
Select * from chineseresume where between '男' and '女'是一样的。由于in会在比较多次,所以有时会慢些。
8、在必要是对全局或者局部临时表创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗费大量的资源。他的创建同是实际表一样。
9、WHERE后面的条件顺序影响
WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如
Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'
以 上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,如果dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的 比较,而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。所以尽量 将范围小的条件放在前面。
10、用OR的字句可以分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用 UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。
11、没有必要时不要用DISTINCT和ORDER BY,这些动作可以改在客户端执行。它们增加了额外的开销。这同UNION和UNION ALL一样的道理。
12、使用in时,在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,这样可以减少判断的次数
13、 当用SELECT INTO时,它会锁住系统表(sysobjects,sysindexes等等),阻塞其他的连接的存取。创建临时表时用显示声明语句,在另一个连接中 SELECT * from sysobjects可以看到 SELECT INTO 会锁住系统表, Create table 也会锁系统表(不管是临时表还是系统表)。所以千万不要在事物内使用它!!!这样的话如果是经常要用的临时表请使用实表,或者临时表变量。
14、 一般在GROUP BY和HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优:select 的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。这样Group By和Having的开销小,查询快.对于大的数据行进行分组和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快
15、一次更新多条记录比分多次更新每次一条快,就是说批处理好
16、慎用临时表,临时表存储于tempdb库中,操作临时表时,会引起跨库操作。尽量用结果集和表变量来代替它。
17、尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优化过,并且被组织到一个执行规划里、且存储在数据库中的 SQL语句,是控制流语言的集合,速度当然快。
18、不要在一段SQL或者存储过程中多次使用相同的函数或相同的查询语句,这样比较浪费资源,建议将结果放在变量里再调用。这样更快。
19、按照一定的次序来访问你的表。如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照这个顺序来锁定它们。如果你(不经意的)某个存储过程中先锁定表B,再锁定表A,这可能就会导致一个死锁。如果锁定顺序没有被预先详细的设计好,死锁很难被发现
2011年8月8日 星期一
全文檢索使用同義字
C:\Program Files\Microsoft SQL Server\MSSQL10_50.BLOGD\MSSQL\FTData
(檔名tsCHT.XML,編碼UNICODE)
USE master
GO
CREATE DATABASE temp_sbcs COLLATE SQL_Latin1_General_CP1_CI_AS
GO
USE temp_sbcs
GO
EXEC sys.sp_fulltext_load_thesaurus_file 1028
GO
USE master
GO
DROP DATABASE temp_sbcs
GO
(檔名tsCHT.XML,編碼UNICODE)
USE master
GO
CREATE DATABASE temp_sbcs COLLATE SQL_Latin1_General_CP1_CI_AS
GO
USE temp_sbcs
GO
EXEC sys.sp_fulltext_load_thesaurus_file 1028
GO
USE master
GO
DROP DATABASE temp_sbcs
GO
2011年7月21日 星期四
SQL語法效能提升
一般來說大家都會推薦利用join
但是用join 有一個條件要特別注意就是其中一個table資料筆數應該盡量少
例如 select a inner join b on a.date=b.date and a.Country=b.Counrty and a.City=b.City and a.Product=b.Product
a---10000000筆資料
b---1000筆資料
這樣會比
select * from a where ....快
但是如果b有三四萬筆的資料時,而其中date, Counrty在一萬筆中多半為一致的情形下
此時就應該減少b跟a join 的條件,而是在最後JOIN出來的結果處再下where 處理
這樣效能會好很多
修改後變成
select * from a inner join b on a.City=b.City and a.Product=b.Product where a.Date='991201' and a.Country='Taiwan'
這樣會比
select * from a inner join b on a.City=b.City and a.Product=b.Product and a.date=b.date and a.Counrty=b.Counrty
更快
但是用join 有一個條件要特別注意就是其中一個table資料筆數應該盡量少
例如 select a inner join b on a.date=b.date and a.Country=b.Counrty and a.City=b.City and a.Product=b.Product
a---10000000筆資料
b---1000筆資料
這樣會比
select * from a where ....快
但是如果b有三四萬筆的資料時,而其中date, Counrty在一萬筆中多半為一致的情形下
此時就應該減少b跟a join 的條件,而是在最後JOIN出來的結果處再下where 處理
這樣效能會好很多
修改後變成
select * from a inner join b on a.City=b.City and a.Product=b.Product where a.Date='991201' and a.Country='Taiwan'
這樣會比
select * from a inner join b on a.City=b.City and a.Product=b.Product and a.date=b.date and a.Counrty=b.Counrty
更快
2011年7月17日 星期日
查SQL最耗費CPU以及時間的語法
先清除暫存
dbcc freeProcCache
再下SQL
SELECT TOP 10
total_worker_time/1000000 AS [总消耗CPU 时间(s)],execution_count [运行次数],
qs.total_worker_time/qs.execution_count/1000000. as [平均消耗CPU 时间(s)],
SUBSTRING(qt.text,qs.statement_start_offset/2+1,
(case when qs.statement_end_offset = -1
then DATALENGTH(qt.text)
else qs.statement_end_offset end -qs.statement_start_offset)/2 + 1)
as [使用CPU的语法], qt.text [完整语法],
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
FROM sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY
total_worker_time DESC
dbcc freeProcCache
再下SQL
SELECT TOP 10
total_worker_time/1000000 AS [总消耗CPU 时间(s)],execution_count [运行次数],
qs.total_worker_time/qs.execution_count/1000000. as [平均消耗CPU 时间(s)],
SUBSTRING(qt.text,qs.statement_start_offset/2+1,
(case when qs.statement_end_offset = -1
then DATALENGTH(qt.text)
else qs.statement_end_offset end -qs.statement_start_offset)/2 + 1)
as [使用CPU的语法], qt.text [完整语法],
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
FROM sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY
total_worker_time DESC
2011年7月12日 星期二
2011年6月28日 星期二
讓網站轉址的方法
1. HTML 的轉址方法:
在 HTML 網頁的 前加入以下 HMTL 碼,網頁就會自動轉址。
< meta equiv="refresh" content="0;url=http://mepopeidia.com" >
其中 content=... 中的 0 是指 0 秒後自動重新整理,並轉址到 "http://mepopeidia.com" 這個 URL。
2. Javascript 的轉址方法:
在 HTML 網頁中原則上是任一地方加入以下 JavaScript 網頁就會轉址。但放在網頁 HTML 碼的開始較有效率(也較有意義)。
<script>document.location.href="http://mepopedia.com";</script >
在 HTML 網頁的 前加入以下 HMTL 碼,網頁就會自動轉址。
< meta equiv="refresh" content="0;url=http://mepopeidia.com" >
其中 content=... 中的 0 是指 0 秒後自動重新整理,並轉址到 "http://mepopeidia.com" 這個 URL。
2. Javascript 的轉址方法:
在 HTML 網頁中原則上是任一地方加入以下 JavaScript 網頁就會轉址。但放在網頁 HTML 碼的開始較有效率(也較有意義)。
<script>document.location.href="http://mepopedia.com";</script >
2011年6月27日 星期一
讓SQL幫你找尋需要重建的索引
SELECT 'ALTER INDEX [' + ix.name + '] ON [' + s.name + '].[' + t.name + '] ' +
CASE
WHEN ps.avg_fragmentation_in_percent > 15
THEN 'REBUILD'
ELSE 'REORGANIZE'
END +
CASE
WHEN pc.partition_count > 1
THEN ' PARTITION = ' + CAST(ps.partition_number AS nvarchar(MAX))
ELSE ''
END,
avg_fragmentation_in_percent
FROM sys.indexes AS ix
INNER JOIN sys.tables t
ON t.object_id = ix.object_id
INNER JOIN sys.schemas s
ON t.schema_id = s.schema_id
INNER JOIN
(SELECT object_id ,
index_id ,
avg_fragmentation_in_percent,
partition_number
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL)
) ps
ON t.object_id = ps.object_id
AND ix.index_id = ps.index_id
INNER JOIN
(SELECT object_id,
index_id ,
COUNT(DISTINCT partition_number) AS partition_count
FROM sys.partitions
GROUP BY object_id,
index_id
) pc
ON t.object_id = pc.object_id
AND ix.index_id = pc.index_id
WHERE ps.avg_fragmentation_in_percent > 10
AND ix.name IS NOT NULL
CASE
WHEN ps.avg_fragmentation_in_percent > 15
THEN 'REBUILD'
ELSE 'REORGANIZE'
END +
CASE
WHEN pc.partition_count > 1
THEN ' PARTITION = ' + CAST(ps.partition_number AS nvarchar(MAX))
ELSE ''
END,
avg_fragmentation_in_percent
FROM sys.indexes AS ix
INNER JOIN sys.tables t
ON t.object_id = ix.object_id
INNER JOIN sys.schemas s
ON t.schema_id = s.schema_id
INNER JOIN
(SELECT object_id ,
index_id ,
avg_fragmentation_in_percent,
partition_number
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL)
) ps
ON t.object_id = ps.object_id
AND ix.index_id = ps.index_id
INNER JOIN
(SELECT object_id,
index_id ,
COUNT(DISTINCT partition_number) AS partition_count
FROM sys.partitions
GROUP BY object_id,
index_id
) pc
ON t.object_id = pc.object_id
AND ix.index_id = pc.index_id
WHERE ps.avg_fragmentation_in_percent > 10
AND ix.name IS NOT NULL
2011年6月23日 星期四
javascript對下拉式選單控制的程式
1 检测是否有选中
if(objSelect.selectedIndex > -1) {
//说明选中
} else {
//说明没有选中
}
2.动态创建select
function createSelect(){
var mySelect = document.createElement("select");
mySelect.id = "mySelect";
document.body.appendChild(mySelect);
}
3.添加选项option
function addOption(){
//根据id查找对象,
var obj=document.getElementById('mySelect');
//添加一个选项
obj.add(new Option("文本","值"));
}
4.删除所有选项option
function removeAll(){
var obj=document.getElementById('mySelect');
obj.options.length=0;
}
5.删除一个选项option
function removeOne(){
var obj=document.getElementById('mySelect');
//index,要删除选项的序号,这里取当前选中选项的序号
var index=obj.selectedIndex;
obj.options.remove(index);
}
6.获得选项option的值
var obj=document.getElementById('mySelect');
var index=obj.selectedIndex; //序号,取当前选中选项的序号
var val = obj.options[index].value;
7.获得选项option的文本
var obj=document.getElementById('mySelect');
var index=obj.selectedIndex; //序号,取当前选中选项的序号
var val = obj.options[index].text;
8.修改选项option
var obj=document.getElementById('mySelect');
var index=obj.selectedIndex; //序号,取当前选中选项的序号
var val = obj.options[index]=new Option("新文本","新值");
9.删除select
function removeSelect(){
var mySelect = document.getElementById("mySelect");
mySelect.parentNode.removeChild(mySelect);
}
qcy1121
1人
了这篇文章
if(objSelect.selectedIndex > -1) {
//说明选中
} else {
//说明没有选中
}
2.动态创建select
function createSelect(){
var mySelect = document.createElement("select");
mySelect.id = "mySelect";
document.body.appendChild(mySelect);
}
3.添加选项option
function addOption(){
//根据id查找对象,
var obj=document.getElementById('mySelect');
//添加一个选项
obj.add(new Option("文本","值"));
}
4.删除所有选项option
function removeAll(){
var obj=document.getElementById('mySelect');
obj.options.length=0;
}
5.删除一个选项option
function removeOne(){
var obj=document.getElementById('mySelect');
//index,要删除选项的序号,这里取当前选中选项的序号
var index=obj.selectedIndex;
obj.options.remove(index);
}
6.获得选项option的值
var obj=document.getElementById('mySelect');
var index=obj.selectedIndex; //序号,取当前选中选项的序号
var val = obj.options[index].value;
7.获得选项option的文本
var obj=document.getElementById('mySelect');
var index=obj.selectedIndex; //序号,取当前选中选项的序号
var val = obj.options[index].text;
8.修改选项option
var obj=document.getElementById('mySelect');
var index=obj.selectedIndex; //序号,取当前选中选项的序号
var val = obj.options[index]=new Option("新文本","新值");
9.删除select
function removeSelect(){
var mySelect = document.getElementById("mySelect");
mySelect.parentNode.removeChild(mySelect);
}
qcy1121
1人
了这篇文章
2011年6月17日 星期五
net use 指令
net use ipipc$ " " /user:" " 建立IPC空链接
net use ipipc$ "密码" /user:"用户名" 建立IPC非空链接
net use h: ipc$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H:
net use h: ipc$ 登陆后映射对方C:到本地为H:
****net use ipipc$ /del 删除IPC链接
net use h: /del 删除映射对方到本地的为H:的映射
net user 用户名 密码 /add 建立用户
net user guest /active:yes 激活guest用户
net user 查看有哪些用户
net user 帐户名 查看帐户的属性
net localgroup administrators 用户名 /add 把“用户”添加到管理员中使其具有管理员权限,注意:administrator后加s用复数
net start 查看开启了哪些服务
net start 服务名 开启服务;(如:net start telnet, net start schedule)
net stop 服务名 停止某服务
net time 目标ip 查看对方时间
net time 目标ip /set 设置本地计算机时间与“目标IP”主机的时间同步,加上参数/yes可取消确认信息
net view 查看本地局域网内开启了哪些共享
net view ip 查看对方局域网内开启了哪些共享
net config 显示系统网络设置
net logoff 断开连接的共享
net pause 服务名 暂停某服务
net send ip "文本信息" 向对方发信息
net ver 局域网内正在使用的网络连接类型和信息
net share 查看本地开启的共享
net share ipc$ 开启ipc$共享
net share ipc$ /del 删除ipc$共享
net share c$ /del 删除C:共享
net user guest 12345 用guest用户登陆后用将密码改为12345
net password 密码 更改系统登陆密码
netstat -a 查看开启了哪些端口,常用netstat -an
netstat -n 查看端口的网络连接情况,常用netstat -an
netstat -v 查看正在进行的工作
netstat -p 协议名 例:netstat -p tcq/ip 查看某协议使用情况(查看tcp/ip协议使用情况)
netstat -s 查看正在使用的所有协议使用情况
nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写
tracert -参数 ip(或计算机名) 跟踪路由(数据包),参数:“-w数字”用于设置超时间隔。
ping ip(或域名) 向对方主机发送默认大小为32字节的数据,参数:“-l[空格]数据包大小”;“-n发送数据次数”;“-t”指一直ping。
ping -t -l 65550 ip 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping)
ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数“/all”显示全部配置信息
tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如“DEL/AR *.*”表示删除当前目录下所有只读文件,“DEL/A-S *.*”表示删除当前目录下除系统文件以外的所有文件
net use ipipc$ "密码" /user:"用户名" 建立IPC非空链接
net use h: ipc$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H:
net use h: ipc$ 登陆后映射对方C:到本地为H:
****net use ipipc$ /del 删除IPC链接
net use h: /del 删除映射对方到本地的为H:的映射
net user 用户名 密码 /add 建立用户
net user guest /active:yes 激活guest用户
net user 查看有哪些用户
net user 帐户名 查看帐户的属性
net localgroup administrators 用户名 /add 把“用户”添加到管理员中使其具有管理员权限,注意:administrator后加s用复数
net start 查看开启了哪些服务
net start 服务名 开启服务;(如:net start telnet, net start schedule)
net stop 服务名 停止某服务
net time 目标ip 查看对方时间
net time 目标ip /set 设置本地计算机时间与“目标IP”主机的时间同步,加上参数/yes可取消确认信息
net view 查看本地局域网内开启了哪些共享
net view ip 查看对方局域网内开启了哪些共享
net config 显示系统网络设置
net logoff 断开连接的共享
net pause 服务名 暂停某服务
net send ip "文本信息" 向对方发信息
net ver 局域网内正在使用的网络连接类型和信息
net share 查看本地开启的共享
net share ipc$ 开启ipc$共享
net share ipc$ /del 删除ipc$共享
net share c$ /del 删除C:共享
net user guest 12345 用guest用户登陆后用将密码改为12345
net password 密码 更改系统登陆密码
netstat -a 查看开启了哪些端口,常用netstat -an
netstat -n 查看端口的网络连接情况,常用netstat -an
netstat -v 查看正在进行的工作
netstat -p 协议名 例:netstat -p tcq/ip 查看某协议使用情况(查看tcp/ip协议使用情况)
netstat -s 查看正在使用的所有协议使用情况
nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写
tracert -参数 ip(或计算机名) 跟踪路由(数据包),参数:“-w数字”用于设置超时间隔。
ping ip(或域名) 向对方主机发送默认大小为32字节的数据,参数:“-l[空格]数据包大小”;“-n发送数据次数”;“-t”指一直ping。
ping -t -l 65550 ip 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping)
ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数“/all”显示全部配置信息
tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如“DEL/AR *.*”表示删除当前目录下所有只读文件,“DEL/A-S *.*”表示删除当前目录下除系统文件以外的所有文件
SQL 2008 出現了錯誤訊息"防止儲存需要資料表重建的變更"!
今天使用SQL 2008 SQL Server Management Studio 變更資料表結構時.出現了錯誤訊息"防止儲存需要資料表重建的變更"!
最後在 小惡魔 網站看到了解決方式
解決方法:SSMS 工具->選項->左邊選單 Designers,裡面把”防止儲存需要資料表重建的變更”,取消掉即可
最後在 小惡魔 網站看到了解決方式
解決方法:SSMS 工具->選項->左邊選單 Designers,裡面把”防止儲存需要資料表重建的變更”,取消掉即可
2011年6月6日 星期一
2011年5月5日 星期四
Rails 一般輸入框簡單驗證法
<%=h text_field("", :number, :size => 10, :onkeyup => "if(isNaN($('#_number').val())){ alert('请输入数字'); $('#_number').val('');}" ) %>
2011年4月7日 星期四
掛載virtualbox 分享資料夾方法
mount -t vboxsf RubyOnRails /root/ror
自動掛載
vi /etc/fstab
RubyOnRails /root/ror vboxsf
自動掛載
vi /etc/fstab
RubyOnRails /root/ror vboxsf
2011年3月29日 星期二
ERP簡易說明
一天中午,丈夫在外給家?打電話:「親愛的老婆,晚上我想帶幾個同事回家吃飯可以嗎?」(訂貨意向)
妻子:「當然可以,來幾個人,幾點來,想吃什麼菜?」
丈夫:「6個人,我們7點左右回來,準備些酒、烤鴨、番茄炒蛋、涼菜、蛋花湯……你看可以嗎?」(商務溝通)
妻子:「沒問題,我會準備好的,」(訂單確認)
妻子記錄下需要做的功能表(MPS計劃),
具體要準備的菜:鴨 酒 番茄 雞蛋 調料──(BOM物料清單),
發現需要:1只鴨,5瓶酒,4個番茄,──(BOM展開),
炒蛋需要6個雞蛋,蛋花湯需要4個雞蛋(共用物料)。
打開冰箱一看(庫房),只剩下2個雞蛋(缺料)。
來到自由市場,妻子:「請問雞蛋怎麼賣?」(採購詢價)
小販:「1個4元,半打20元,1打38元。」
妻子:「我只需要8個,但這次買1打。」(經濟批量採購)
妻子:「這有一個壞的,換一個。」(驗收,退料,換料)
回到家中,準備洗菜、切菜、炒菜──(工藝路線),
廚房中有瓦斯、微波爐、電鍋──(工作中心)。
妻子發現拔鴨毛最費時間(瓶頸工序,關鍵工藝路線),
用微波爐自己做烤鴨可能就來不及(產能不足),
於是決定在樓下的餐廳?買現成的(產品委外)。
下午4點,電話鈴又響:「媽媽,晚上幾個同學想來家?吃飯,你幫準備一下。」(緊急訂單)
「好的,兒子,你們想吃什麼,爸爸晚上也有客人,你願意和他們一起吃嗎?」
「菜你看著辦吧,但一定要有番茄炒雞蛋。我們不和大人一起吃,6:30左右回來。」(呵呵,不能併單處理)
「好的,肯定讓你們滿意。」(訂單確認)
雞蛋又不夠了,打電話叫小販送來。(緊急採購)
6:30,一切準備就緒,可烤鴨還沒送來,急忙打電話詢問:「我是李太太,怎麼訂的烤鴨還沒送來。」(採購委外單跟催)
「不好意思,送貨的人已經走了,可能是堵車吧,馬上就會到的。」門鈴響了,「李太,這是您要的烤鴨。請在單上簽一個字。」(驗收、入庫、轉應付帳款)
6:45,女兒的電話:「媽媽,我想現在帶幾個朋友回家吃飯可以嗎?」(呵呵,又是緊急訂購意向,要求現貨)
「不行呀,女兒,今天媽媽已經需要準備兩桌飯了,時間實在是來不及,真的非常抱歉,下次早點說,一定給你們準備好。」(哈哈,這就是ERP的使用侷限,要有穩定的外部環境,要有一個起碼的提前期)
送走了所有客人,疲憊的妻子坐在沙發上對丈夫說:「親愛的,現在咱們家請客的頻率非常高,應該要買些廚房用品了(設備採購),最好能再雇個小保姆(連人力資源系統也有介面了)。」
丈夫:「家?你做主,需要什麼你就去辦吧。」(通過審核)
妻子:「還有,最近家?花銷太大,用你的私房錢來補貼一下,好嗎?」(哈哈哈哈,最後就是應收貨款的催要。還可再加上成本核算,總帳,決策分析等等)。
例如……送走了所有客人,妻子拿著計算器,準確地算出了今天的各項成本(成本核算)和節餘原材料(車間退料),並計入了日記帳(總帳),把結果念給丈夫聽(給主管報表),丈夫說道「值得,花了582元,請了好幾個朋友,感情儲蓄帳戶增加了若干」(經濟效益分析)。
還可再寫下去,種種原因妻子和丈夫打架,造成整個ERP系統岌岌可危,請來了幾大著名的ERP諮詢公司,妻子和某諮詢顧問搞上了(key user跳槽到了諮詢公司)…………
妻子:「當然可以,來幾個人,幾點來,想吃什麼菜?」
丈夫:「6個人,我們7點左右回來,準備些酒、烤鴨、番茄炒蛋、涼菜、蛋花湯……你看可以嗎?」(商務溝通)
妻子:「沒問題,我會準備好的,」(訂單確認)
妻子記錄下需要做的功能表(MPS計劃),
具體要準備的菜:鴨 酒 番茄 雞蛋 調料──(BOM物料清單),
發現需要:1只鴨,5瓶酒,4個番茄,──(BOM展開),
炒蛋需要6個雞蛋,蛋花湯需要4個雞蛋(共用物料)。
打開冰箱一看(庫房),只剩下2個雞蛋(缺料)。
來到自由市場,妻子:「請問雞蛋怎麼賣?」(採購詢價)
小販:「1個4元,半打20元,1打38元。」
妻子:「我只需要8個,但這次買1打。」(經濟批量採購)
妻子:「這有一個壞的,換一個。」(驗收,退料,換料)
回到家中,準備洗菜、切菜、炒菜──(工藝路線),
廚房中有瓦斯、微波爐、電鍋──(工作中心)。
妻子發現拔鴨毛最費時間(瓶頸工序,關鍵工藝路線),
用微波爐自己做烤鴨可能就來不及(產能不足),
於是決定在樓下的餐廳?買現成的(產品委外)。
下午4點,電話鈴又響:「媽媽,晚上幾個同學想來家?吃飯,你幫準備一下。」(緊急訂單)
「好的,兒子,你們想吃什麼,爸爸晚上也有客人,你願意和他們一起吃嗎?」
「菜你看著辦吧,但一定要有番茄炒雞蛋。我們不和大人一起吃,6:30左右回來。」(呵呵,不能併單處理)
「好的,肯定讓你們滿意。」(訂單確認)
雞蛋又不夠了,打電話叫小販送來。(緊急採購)
6:30,一切準備就緒,可烤鴨還沒送來,急忙打電話詢問:「我是李太太,怎麼訂的烤鴨還沒送來。」(採購委外單跟催)
「不好意思,送貨的人已經走了,可能是堵車吧,馬上就會到的。」門鈴響了,「李太,這是您要的烤鴨。請在單上簽一個字。」(驗收、入庫、轉應付帳款)
6:45,女兒的電話:「媽媽,我想現在帶幾個朋友回家吃飯可以嗎?」(呵呵,又是緊急訂購意向,要求現貨)
「不行呀,女兒,今天媽媽已經需要準備兩桌飯了,時間實在是來不及,真的非常抱歉,下次早點說,一定給你們準備好。」(哈哈,這就是ERP的使用侷限,要有穩定的外部環境,要有一個起碼的提前期)
送走了所有客人,疲憊的妻子坐在沙發上對丈夫說:「親愛的,現在咱們家請客的頻率非常高,應該要買些廚房用品了(設備採購),最好能再雇個小保姆(連人力資源系統也有介面了)。」
丈夫:「家?你做主,需要什麼你就去辦吧。」(通過審核)
妻子:「還有,最近家?花銷太大,用你的私房錢來補貼一下,好嗎?」(哈哈哈哈,最後就是應收貨款的催要。還可再加上成本核算,總帳,決策分析等等)。
例如……送走了所有客人,妻子拿著計算器,準確地算出了今天的各項成本(成本核算)和節餘原材料(車間退料),並計入了日記帳(總帳),把結果念給丈夫聽(給主管報表),丈夫說道「值得,花了582元,請了好幾個朋友,感情儲蓄帳戶增加了若干」(經濟效益分析)。
還可再寫下去,種種原因妻子和丈夫打架,造成整個ERP系統岌岌可危,請來了幾大著名的ERP諮詢公司,妻子和某諮詢顧問搞上了(key user跳槽到了諮詢公司)…………
2011年3月18日 星期五
JQuery validation
基本所提供的validation有
* required:必填欄位,範例:required:true
* remote:使用遠端系統其他API來檢核,範例:remote : {url:"my.do", type:"post" data:{param1: function(){return $("#inputField").val();}}}
* minlength:最小資料長度,範例:minlength:2
* maxlength:最大資料長度,範例:maxlength:10
* rangelength:資料長度區間,範例:rangelength:[2,10]
* min:最小值,範例:min:2
* max:最大值,範例:max:20
* range:資料區間,範例:range:[2,20]
* email:是否符合email格式,範例:email:true
* url:是否符合url格式,範例:url:true
* date:是否符合日期格式,此格式為20/08/2010,僅有格式而已....,範例:date:true
* dateISO:是否符合國際日期格式,此格式為2010/08/20,僅有格式而已....,範例:dateISO:true
* number:資料是否為數字類,可輸入小數,範例:number:true
* digits:資料是否為整數,範例:digits:true
* accept:用以檢查副檔名,範例:accept: "xls|csv"
* equalTo:檢查兩欄位值是否相同,範例:equalTo:"#password"
* lessEquleThan:檢查是否有小於或等於某欄位,範例:lessEquleThan: "#amount"
* required:必填欄位,範例:required:true
* remote:使用遠端系統其他API來檢核,範例:remote : {url:"my.do", type:"post" data:{param1: function(){return $("#inputField").val();}}}
* minlength:最小資料長度,範例:minlength:2
* maxlength:最大資料長度,範例:maxlength:10
* rangelength:資料長度區間,範例:rangelength:[2,10]
* min:最小值,範例:min:2
* max:最大值,範例:max:20
* range:資料區間,範例:range:[2,20]
* email:是否符合email格式,範例:email:true
* url:是否符合url格式,範例:url:true
* date:是否符合日期格式,此格式為20/08/2010,僅有格式而已....,範例:date:true
* dateISO:是否符合國際日期格式,此格式為2010/08/20,僅有格式而已....,範例:dateISO:true
* number:資料是否為數字類,可輸入小數,範例:number:true
* digits:資料是否為整數,範例:digits:true
* accept:用以檢查副檔名,範例:accept: "xls|csv"
* equalTo:檢查兩欄位值是否相同,範例:equalTo:"#password"
* lessEquleThan:檢查是否有小於或等於某欄位,範例:lessEquleThan: "#amount"
2011年2月28日 星期一
2011年2月17日 星期四
更換apt-get抓取軟體的url
.1 備份 sources.list
sudo cp /etc/apt/sources.list /etc/apt/sources.list.ORG
2.打開 sources.list
sudo vi /etc/apt/sources.list
3.變更成其他國家的伺服器
在 vi 用下面指令把 tw 換成 us
:1,$s/tw/us/g
4.儲存 source.list
:wq!
5.更新套件清單
sudo apt-get update
sudo cp /etc/apt/sources.list /etc/apt/sources.list.ORG
2.打開 sources.list
sudo vi /etc/apt/sources.list
3.變更成其他國家的伺服器
在 vi 用下面指令把 tw 換成 us
:1,$s/tw/us/g
4.儲存 source.list
:wq!
5.更新套件清單
sudo apt-get update
2011年2月16日 星期三
在apache2設定數個網站
這個記錄是以Apache2作為HTTP daemon,在Apache2上設定數個網站。因為Apache2本來就在設計上支援這個目的。
Apache2在預設安裝後, 一般使用/var/www/作為網站的資夾料,看一下裡面會發現一個index.html檔案。
但我們既然要在這台伺服器上跑幾個網站,就得用一個資料夾有系統地存放。
我選擇在/home下建立一個叫www的資料夾,然後再在上面因應不同網站建不同的資料夾。
sudo mkdir /home/www
設定這個資料夾所屬的群組和擁有者
sudo chown www-data /home/www
sudo chgrp www-data /home/www
為新的網站建立資料夾
sudo mkdir /home/www/notes.antonyho.net
這些資料夾是用作存放CGI或者log的
sudo mkdir /home/www/notes.antonyho.net/cgi-bin
sudo mkdir /home/www/notes.antonyho.net/logs
sudo mkdir /home/www/notes.antonyho.net/htdocs
設定這個網站的擁有者為owner,設定www-data為資料夾的群組以方便儲取。
sudo chown antony -R /home/www/notes.antonyho.net
sudo chgrp www-data -R /home/www/notes.antonyho.net
好,到戲肉了。
Apache2建立virtual host的方式是在 /etc/apache2/sites-available/ 這個資料夾裡建一個設定檔,在裡面把您網站的資料夾,存取限制設定好。
假設我的網站是notes.antonyho.net,我就在 /etc/apache2/sites-available/ 裡建一個以網址命名的設定檔。
sudo touch /etc/apache2/sites-available/notes.antonyho.net
又或者利用預設的設定檔再作修改
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/notes.antonyho.net
修改這個檔案
sudo nano /etc/apache2/sites-available/notes.antonyho.net
以下是一個可供設考的設定檔
ServerAdmin admin@notes.antonyho.net #網站負責人的電郵
ServerName notes.antonyho.net #網址
ServerAlias notes.antonyho.net #如果網站有縮寫網址可在這裡設定
DocumentRoot /home/www/notes.antonyho.net #改為你網站用的資料夾
#這裡記得在資料夾尾加/
Options Indexes FollowSymLinks MultiViews
#上面是設定資料夾的一些屬性
#Indexes,訪客可以要求資料夾的檔案清單,這個要小心設定使用與否。
AllowOverride None
Order allow,deny
allow from all
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ #設了這個就可以使用CGI
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
ErrorLog /home/www/notes.antonyho.net/logs/error.log #error log的位置
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined #access log的位置
Alias /htdocs/ "/home/www/notes.antonyho.net/htdocs/"
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
設定好後儲存。
然後啟用這個網站。
sudo a2ensite hkuoshard.com
重載Apache2的設定
sudo /etc/init.d/apache2 reload
提DNS設定指向到這個伺服器後,並把網站的檔案存到/home/www/notes.antonyho.net,訪問notes.antonyho.net該會正常顯示到網站囉。
我在設定時也是主要參考下面這個英文的Debian管理教學,而我使用的是Ubuntu Server。
http://www.debian-administration.org/articles/412
Apache2在預設安裝後, 一般使用/var/www/作為網站的資夾料,看一下裡面會發現一個index.html檔案。
但我們既然要在這台伺服器上跑幾個網站,就得用一個資料夾有系統地存放。
我選擇在/home下建立一個叫www的資料夾,然後再在上面因應不同網站建不同的資料夾。
sudo mkdir /home/www
設定這個資料夾所屬的群組和擁有者
sudo chown www-data /home/www
sudo chgrp www-data /home/www
為新的網站建立資料夾
sudo mkdir /home/www/notes.antonyho.net
這些資料夾是用作存放CGI或者log的
sudo mkdir /home/www/notes.antonyho.net/cgi-bin
sudo mkdir /home/www/notes.antonyho.net/logs
sudo mkdir /home/www/notes.antonyho.net/htdocs
設定這個網站的擁有者為owner,設定www-data為資料夾的群組以方便儲取。
sudo chown antony -R /home/www/notes.antonyho.net
sudo chgrp www-data -R /home/www/notes.antonyho.net
好,到戲肉了。
Apache2建立virtual host的方式是在 /etc/apache2/sites-available/ 這個資料夾裡建一個設定檔,在裡面把您網站的資料夾,存取限制設定好。
假設我的網站是notes.antonyho.net,我就在 /etc/apache2/sites-available/ 裡建一個以網址命名的設定檔。
sudo touch /etc/apache2/sites-available/notes.antonyho.net
又或者利用預設的設定檔再作修改
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/notes.antonyho.net
修改這個檔案
sudo nano /etc/apache2/sites-available/notes.antonyho.net
以下是一個可供設考的設定檔
ServerAdmin admin@notes.antonyho.net #網站負責人的電郵
ServerName notes.antonyho.net #網址
ServerAlias notes.antonyho.net #如果網站有縮寫網址可在這裡設定
DocumentRoot /home/www/notes.antonyho.net #改為你網站用的資料夾
Options Indexes FollowSymLinks MultiViews
#上面是設定資料夾的一些屬性
#Indexes,訪客可以要求資料夾的檔案清單,這個要小心設定使用與否。
AllowOverride None
Order allow,deny
allow from all
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ #設了這個就可以使用CGI
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
ErrorLog /home/www/notes.antonyho.net/logs/error.log #error log的位置
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined #access log的位置
Alias /htdocs/ "/home/www/notes.antonyho.net/htdocs/"
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
設定好後儲存。
然後啟用這個網站。
sudo a2ensite hkuoshard.com
重載Apache2的設定
sudo /etc/init.d/apache2 reload
提DNS設定指向到這個伺服器後,並把網站的檔案存到/home/www/notes.antonyho.net,訪問notes.antonyho.net該會正常顯示到網站囉。
我在設定時也是主要參考下面這個英文的Debian管理教學,而我使用的是Ubuntu Server。
http://www.debian-administration.org/articles/412
2011年2月15日 星期二
rails 送出時的錯誤
發生ActionController::InvalidAuthenticityToken時
在Controller上面加入
protect_from_forgery :except => :index
# you can disable csrf protection on controller-by-controller basis: skip_before_filter :verify_authenticity_token
在Controller上面加入
protect_from_forgery :except => :index
# you can disable csrf protection on controller-by-controller basis: skip_before_filter :verify_authenticity_token
2011年2月13日 星期日
git做branch的流程
git branch 20100214 轉到分支20100214
git branch show出所有的支架
git branch -a show出所有的支架(連同remote)
git checkout -b v2011021501-bookjob remotes/origin/v2011021501-bookjob 將remotes的某分支下載到local分支,如果有這分支名稱的話請執行xxxxxxxx
git checkout 20100214 轉到某支架
git merge 20100214 將master和20100214合併
git branch -d 20100214 在local刪除20100214分支
git push origin v20110217-prepay 把v20110217-prepay上到remote的origin
git pull -a 下載remote資訊
git push
git branch show出所有的支架
git branch -a show出所有的支架(連同remote)
git checkout -b v2011021501-bookjob remotes/origin/v2011021501-bookjob 將remotes的某分支下載到local分支,如果有這分支名稱的話請執行xxxxxxxx
git checkout 20100214 轉到某支架
git merge 20100214 將master和20100214合併
git branch -d 20100214 在local刪除20100214分支
git push origin v20110217-prepay 把v20110217-prepay上到remote的origin
git pull -a 下載remote資訊
git push
2011年2月10日 星期四
訂閱:
文章 (Atom)