faint ~~ 这个版人气真高~~
解决方案 »
- 表中一字段,值是日期型的,数据为:2006-4-28 19:36:21,我想查询日期为2006-4-28的数据,怎样才能把该行数据查出来?
- 请教多条件查询?
- 对几个概念的混淆,希望大家能解答一下。
- 关于用存储过程做得查询怎么分页得问题,急!!!!在线等,好用马上结贴!!!!!!!!
- 删除所有但保留一条相同记录的SQL语句如何写?详细请进!!!
- 请教:如何编辑TXT类型的字段。
- 已经安装了MSDE,能否再安装MS SQL 2000?
- 在不破坏原加密存储过程的前提下,解密存储过程!(补充j9988)
- 我在WIN98安装MSSQL个人版本,但老是安装不上,错误提示:,Provider cannot be found.it may not be properly installed;
- 十万火急! Applet 连接SQL Server数据库超级问题
- 怎么在Access中转换日期格式
- MSSQL中,有位网友email问我的问题,下面是我给出的方案,大家也来看一看吧.(zhuzhichao)
1.可以给表做索引,但最好是不常更新的表,因为有几个不利因素要考虑,一个是作索引会减慢对数据的更新速度,另外也会占用更多储存空间。这个当然要与你其他功能模块综合考虑。
2.另外在写SQL时多做复杂度分析,最好不要只想直接,想到什么就什么。要以集合运算的本质来考虑问题。
3.你用的是DB2的数据库那就刚好了,多用表表达式,将大表化成小表再进行关联,可以大大提高速度,特别是对于大表效果特别明显,同时也可以达到一个SQL内完成的效果。
4.如果非常不幸的用了CURSOR,那就要非常坚决地抛弃它。那是速度毒药来的,除非是特别复杂的查询否则不要用。但就算是复杂的查询一般也都可以用CASE WHEN ...摆平。
你没说你是什么数据库, 是olap还是oltp, 检索的复杂程度和能否拆分等等笼统的原则楼上说了一些了, 优化的次序是: 设计结构->sql语句->物理存储
关于建立索引的看法,我与bluepower2008(蓝色力量)的一样。关于大表化成小表,zxyufan(宇凡) 和 liujianjun(流星尔) 可能理解错我的意思了。我说的意思是用DB2的表表达式来化,同时又可以在一个sql语句里面完成,这样可以直接用在一些控件里面,比如PB的DATAWINDOW。DB2的这个功能也是我比较喜欢的。
DB2的表表达式其实就是动态的视图,其中的公共表达式的语法大概是:
with 表表达式定义,表表达式定义
主查询语句
下面是个例子:
(1) WITH
PAYLEVEL AS
(SELECT EMPNO, YEAR(HIREDATE) AS HIREYEAR, EDLEVEL,
SALARY+BONUS+COMM AS TOTAL_PAY
FROM EMPLOYEE
WHERE EDLEVEL > 16),(2)
PAYBYED (EDUC_LEVEL, YEAR_OF_HIRE, AVG_TOTAL_PAY) AS
(SELECT EDLEVEL, HIREYEAR, AVG(TOTAL_PAY)
FROM PAYLEVEL
GROUP BY EDLEVEL, HIREYEAR)(3) SELECT EMPNO, EDLEVEL, YEAR_OF_HIRE, TOTAL_PAY, DECIMAL(AVG_TOTAL_PAY,7,2)
FROM PAYLEVEL, PAYBYED
WHERE EDLEVEL=EDUC_LEVEL
AND HIREYEAR = YEAR_OF_HIRE
AND TOTAL_PAY < AVG_TOTAL_PAY 其中(1) 、(2)就是表表达式的定义,其实它就是定义了一个结果集PAYLEVEL、PAYBYED,然后把这个结果集当表,(3)的主查询语句再用此两个结果集进行连接,这样在数据库的内部是先建临时表,用来存放表达式的结果集,然后再用结果集进行笛卡尔乘,显然,当表非常大,而我们只是想取其中一小部分进行运算时,这样的复杂度远远小于直接的连接。这也就是为什么能提高速度,为什么我说“把大表化成小表”的原因。我们所要作的就是在表表达式的定义加入WHERE条件,在大表里面过滤出小表来。这个当然与建立临时表类似,但显然后者麻烦很多,无法在一个sql里完成而且速度可能会慢点。
这个东西的好处还在于它是动态的,一般的视图是写死的。另外DB2还有另一种表表达式---嵌套表表达式.SQL SERVER 也有类似功能。