期货交易自动化论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 32|回复: 0

请教牛人一个技术问题,牛人回答哦 - 第3页 - 金融行业 - ITPUB论坛-专业的IT技术社区

[复制链接] |主动推送

285万

主题

285万

帖子

855万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
8553710
发表于 2022-9-11 08:10:04 | 显示全部楼层 |阅读模式
cuaulong 发表于 2012-1-11 14:31

高手怎么建立 函数索引???求指教!!!
如果你的where条件建立在substr长度是固定的,就可以对这个长度的字符串进行索引,和普通索引添加一样,具体可以google一下。
分段我理解就是讲一个有意义的字段分解为IT功能使用的几个字段,这样就可以对某个字段做索引了。
数据库优化的一点建议:
2.避免使用不兼容的数据类型。例如float和int、char和varchar、binary和
varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进
行的优化操作。例如:
SELECT name FROM employee WHERE salary > 60000
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000
是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。
3、 尽量避免在WHERE子句中对字段进行函数或表达式操作,这将导致引擎放弃
使用索引而进行全表扫描。如:
SELECT * FROM T1 WHERE F1/2=100
应改为:
SELECT * FROM T1 WHERE F1=100*2
SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’
应改为:
SELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’
SELECT member_number, first_name, last_name FROM members
WHERE DATEDIFF(yy,datofbirth,GETDATE()) 21
应改为:
SELECT member_number, first_name, last_name FROM members
WHERE dateofbirth DATEADD(yy,-21,GETDATE())
即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询
时要尽可能将操作移至等号右边。
另外select count(*) from xxxxx
这样的操作在DB2中并不会产生锁,页锁的概念DB2中好像没有看到响应说明。
cuaulong 发表于 2012-1-11 20:36

高手那该怎么写?指点一二
like, match之类的操作,正常情况下都无法使用索引。
除非可以转化成between, 但如此一来,象abcdef%之类的还可以转化一下,但%abcdef或者abc%def之类的查找要求就支持不了。
有些数据库(象DB2)是支持函数索引的,可以查找一下参考手册。
monicker 发表于 2012-1-12 09:29

如果你的where条件建立在substr长度是固定的,就可以对这个长度的字符串进行索引,和普通索引添加一样,具 ...
兄弟能否写个例子 围观下
cuaulong 发表于 2012-1-12 13:02

兄弟能否写个例子 围观下
oracle中
create index index_name on XXXX (substr(a,1,6));
然后你where条件中substr(a,1,6)='abcdefg',这样就能走索引了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|期货交易自动化论坛

GMT+8, 2025-8-26 05:42 , Processed in 0.068997 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表