最近做一个OLAP项目,要用T-SQL频繁操作几个大表,数据量大概在四、五百万到一千多万之间。这些T-SQL需要在几个小时内执行完毕。开发、测试过程遇到过几次T-SQL执行超时的情况。最慢的时候要18个小时才执行完毕。还有时候太慢了就先停止了。经过多次调整,现在整批代码大概4个小时内可以执行完毕。以下是几点重要的体会:
1:对数据库来说,写比读消耗资源高许多倍。具体多少倍当然和软硬件配置、数据库逻辑设计(表之间的关系)、数据库物理设计(索引、约束、主键等)有密切关系。在这个项目中我觉得大概有100倍。
有一步操作要把不合格的数据删除。大概会把一个500万条记录的表的数据删掉一半。删除这些数据大概要花三个小时。后来改为不删除而是仅仅做标记。显然后面用到这个表的时候会话更多的时间去搜索表和索引。但是在这个项目来看这样做是合算的。后面的步骤中的操作时间并没有明显增加。
2:通过限制数据集数量,改一步执行为循环执行的方法,可以有效提高效率。开发中遇到过几次大表之间join导致执行时间超长。最终的解决方案之一就是用row_number函数加CTE加while循环,让每一次join涉及到的记录集都比较小。虽然需要循环多次,但是最终的时间要比一次执行快了许多倍。
admin
2010.05.27
Php, 技术文档
1. 分号的例外
对于 MySQL ,第一件你必须牢记的是它的每一行命令都是用分号 (;) 作为结束的,但……没有完全绝对的事,在这儿也是一样,当一行 MySQL 被插入在 PHP 代码中时,最好把后面的分号省略掉,例如:
mysql_query (“INSERT INTO tablename (first_name, last_name)
VALUES (‘$first_name’, ‘$last_name’)
“);
这是因为 PHP 也是以分号作为一行的结束的,额外的分号有时会让 PHP 的语法分析器搞不明白,所以还是省略掉的好。在这种情况下,虽然省略了分号,但是 PHP 在执行 MySQL 命令时会自动的帮你加上的。
继续阅读 »
admin
2010.05.25
Python, 技术文档
最近刚刚学python,学的也差不多了,想试试数据库编程,不过由于版本的问题,原有的数据库连接模块很多都不兼容python3。 在Google上淘了半天,终于找到了ceODBC,方法很简单,直接在SourceForge下载相应版本安装,使 用的时候import ceODBC即可。
以下是几行测试代码:
import ceODBC
con=ceODBC.connect(‘dsn=mysql1;uid=xuyun;pwd=123456′)
curser=con.curser()
curser.execute(“SELECT * FROM course”)
curser.fetchone()
完美运行。
说到这里,可能有人要问为什么不用pythonwin呢,我实在抱歉得很,目前pythonwin至少在我的机子上是用不了,只要执 行,ODBC.ODBC(”)即死了!可能是我机子的原因?这个我对数据库的底层问题不太了解,高手有知道的可以告诉我一声。 继续阅读 »
admin
2010.03.01
Php, 技术文档
<?php
$serverSite=”.”;
$db=”phpdemo”;
$name=”sa”;
$pass=”sa”;
$conn=@mssql_connect($serverSite,$name,$pass)?or?die(“数据库连接错误!”);
@mssql_select_db(“phpdemo”,$conn);
echo?’this?can?be?use!’;
$ok=@mssql_query(“insert?into?test?(name)values(‘ossem’)”,$conn);
echo?’this?database?is?:’.$conn;
if($ok)
{
echo?”ok”;
}else
{
echo?”false”;
}
?>
如果实现了PHP和MySQL链接了,PHP和MSSQL的链接其实很简单;
支持MSSQL的本地链接和远程链接,以本地链接为例:
机 器上安装了MS SQLServer 2005;
连接前配置系统:
1.检查文件 php5.2.5\ntwdblib.dll 默认下面有一个,不能连接再替换.
下载正确版本的 ntwdblib.dll (2000.80.194.0),地址: http://webzila.com/dll/1/ntwdblib.zip
2.配置php
继续阅读 »
近期评论