[20140714]关于在那些字段建立索引的问题

[20140714]关于在那些字段建立索引的问题.txt

前几天有人问我,如何确定在那些字段建立索引的问题,我的方法很简单,通过awr报表可以来确定一部分索引的建立,应用程序绑定做的很
好,方法很简单,可以使用toad的SGA trace,组合一些查询条件很容易确定,这个方法的缺陷就是,如果你应用绑定没做好,shared pool设置
很大的情况下,每次扫描真的是一种灾难!(不是很快,多次操作心里很烦!)

与别人交谈,提到利用col_usage$,可以知道谓词的使用情况,从而决定在那些字段做了索引.我google相关信息发现如下链接:

http://www.dba-scripts.com/scripts/diagnostic-and-tuning/troubleshooting/find-missing-index/

SELECT *
  FROM (  SELECT    'the column '
                 || c.name
                 || ' of the table '
                 || us.name
                 || '.'
                 || o.name
                 || ' was used '
                 || u.equality_preds
                 || ' times in an equality predicate and '
                 || u.equijoin_preds
                 || ' times in an equijoin predicate and is not indexed'
                    AS colum_to_index
            FROM sys.col_usage$ u,
                 sys.obj$ o,
                 sys.col$ c,
                 sys.user$ us
           WHERE     u.obj# = o.obj#
                 AND u.obj# = c.obj#
                 AND us.user# = o.owner#
                 AND u.intcol# = c.col#
                 AND us.name = '&SCHEMA_NAME'
                 AND c.name NOT IN (SELECT column_name
                                      FROM dba_ind_columns
                                     WHERE index_owner = '&SCHEMA_NAME')
                 AND (u.equality_preds > 100 OR u.equijoin_preds > 100)
        ORDER BY u.equality_preds + u.equijoin_preds DESC)
WHERE ROWNUM

--我做了一些改动加入统计信息,方便确定那些字段需要建立索引:

/* Formatted on 2014/7/14 10:25:10 (QP5 v5.252.13127.32867) */
SELECT *
  FROM (  SELECT    'the column '
                 || c.name
                 || ' of the table '
                 || us.name
                 || '.'
                 || o.name
                 || ' was used '
                 || u.equality_preds
                 || ' times in an equality predicate and '
                 || u.equijoin_preds
                 || ' times in an equijoin predicate and is not indexed'
                    AS colum_to_index,
                 h.DISTCNT,
                 h.ROW_CNT,
                 h.NULL_CNT,
                 h.DENSITY,
                 u.EQUALITY_PREDS,
                 u.EQUIJOIN_PREDS,
                 u.NONEQUIJOIN_PREDS,
                 u.RANGE_PREDS,
                 u.LIKE_PREDS,
                 u.NULL_PREDS
            FROM sys.col_usage$ u,
                 sys.obj$ o,
                 sys.col$ c,
                 sys.hist_head$ h,
                 sys.user$ us
           WHERE     u.obj# = o.obj#
                 AND u.obj# = c.obj#
                 AND us.user# = o.owner#
                 AND u.intcol# = c.col#
                 AND us.name = '&SCHEMA_NAME'
                 AND h.obj# = o.obj#
                 AND h.col# = c.col#
                 AND c.name NOT IN (SELECT column_name
                                      FROM dba_ind_columns
                                     WHERE index_owner = '&SCHEMA_NAME')
                 AND (   u.equality_preds > 100
                      OR u.equijoin_preds > 100
                      OR u.RANGE_PREDS > 100)
        ORDER BY u.equality_preds + u.equijoin_preds DESC)
WHERE ROWNUM

--大家可以根据自己的需要修改查询范围和条件!

时间: 2024-09-20 20:33:05

[20140714]关于在那些字段建立索引的问题的相关文章

mysql中经常根据时间列筛选数据,那么可以为时间字段建立索引吗

问题描述 mysql中经常根据时间列筛选数据,那么可以为时间字段建立索引吗 mysql中经常根据时间列筛选数据,那么可以为时间字段建立索引吗?谢谢! (数据量比较大,但是一般查询只查询今天的数据,而表中存有所有历史记录) 解决方案 可以建立,但是你还要看看你的查询条件,如果查询条件中有对时间用函数等,那么索引的效果并不会有多好. ALTER TABLE reqs ADD INDEX date_ndx (date); 解决方案二: 是可以的,添加data类型的索引,取出时将日期进行比较,大于昨天的

[数据库]Oracle中如果对“性别”这样的字段建立索引

oracle|数据|数据库|索引 由于"性别"这样的字段中的变化值很少,建立不同的Normal索引是毫无用处的.但我们在查询中还是会经常用的检索"性别为男的大于30岁"这样的条件,如果不加索引在数据量加大的时候还是会很慢,其实,Oracle中对此是有解决办法的,那就是Bitmap类型索引,我实验发现加了这种类型索引后,速度可以大大提高.

分区表建立索引

全局索引 ============ CREATE INDEX month_ix ON sales(sales_month) 本地索引 ============ CREATE INDEX loc_dept_ix ON dept(deptno) LOCAL; 全局分区索引 ============ CREATE INDEX month_ix ON sales(sales_month) GLOBAL PARTITION BY RANGE(sales_month) (PARTITION pm1_ix V

mysql使用crc32字段建索引提高查询效率

之前也写过这样的一篇文章,再来一篇. 给字符串类型的字段建立索引效率不高,但是必须要经常查这个字段怎么建索引?比如这个字段名称是sys_trans_id字符串类型,那么可以建一个字段sys_trans_id_src32来存储crc32的值,并给这个字段建立索引. crc32是整形,在MySQL中,给整形字段建立索引效率比较高,crc32虽然不能确保唯一性,但是无碍,相同的机率也是极小,关键是可以大大减少查询的范围,给sys_trans_id_src32这个字段建立索引,查询的时候带上crc32字

数据库建立索引的原则

使用索引可快速访问数据库表中的特定信息.索引是对数据库表中一列或多列的 值进行排序的一种结构,例如 employee 表的姓(lname)列.如果要按姓查找 特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息.            索引是一个单独的.物理的数据库结构,它是某个表中一列或若干列值的集 合和相应的指向表中物理标识这些值的数据页的逻辑指针清单.          索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序 顺序对这些指针排序.数据库使用索引的方

用SQL建立索引的方法步骤_MsSql

进入查询窗口后,输入下面的语句: CREATE INDEX mycolumn_index ON mytable (myclumn) 这个语句建立了一个名为mycolumn_index的索引.你可以给一个索引起任何名字,但你应该在索引名中包含所索引的字段名,这对你将来弄清楚建立该索引的意图是有帮助的. 注意: 在本书中你执行任何SQL语句,都会收到如下的信息: This command did not return data,and it did not return any rows 这说明该语

mssql 建立索引第1/2页

表的索引与附在一本书后面的索引非常相似.它可以极大地提高查询的速度.对一个较大的表来说,通过加索引,一个通常要花费几个小时来完成的查询只要几分钟就可以完成.因此没有理由对需要频繁查询的表增加索引. 注意: 当你的内存容量或硬盘空间不足时,也许你不想给一个表增加索引.对于包含索引的数据库,SQL Sever需要一个可观的额外空间.例如,要建立一个聚簇索引,需要大约1.2倍于数据大小的空间.要看一看一个表的索引在数据库中所占的空间大小,你可以使用系统存储过程sp_spaceused,对象名指定为被索

用SQL建立索引的方法步骤

进入查询窗口后,输入下面的语句: CREATE INDEX mycolumn_index ON mytable (myclumn) 这个语句建立了一个名为mycolumn_index的索引.你可以给一个索引起任何名字,但你应该在索引名中包含所索引的字段名,这对你将来弄清楚建立该索引的意图是有帮助的. 注意: 在本书中你执行任何SQL语句,都会收到如下的信息: This command did not return data,and it did not return any rows 这说明该语

sql-SQL2008 几乎每个表每天自动增加_mask_from_v2字段,并建立索引。

问题描述 SQL2008 几乎每个表每天自动增加_mask_from_v2字段,并建立索引. SQL2008 几乎每个表每天自动增加_mask_from_v2字段,并建立索引,导致系统报错.将其删除后第二天又出现,无法找到原因,请大神出招解决! 解决方案 表列是不能重复的 不可能 每天都增加 mask_from_v2 字段 解决方案二: 是删除后,又自动生成出来,,不删除不会增加.. 解决方案三: 你的数据库有没有设置同步或触发器,比如使用了syncnavigator或者workbench等工具