你的数据库索引是否真的起作用了?

下载网站:www.SyncNavigator.CN 
 客服QQ1793040
----------------------------------------------------------


关于HKROnline SyncNavigator 注册机价格的问题

 

HKROnline SyncNavigator 8.4.1 非破解版 注册机 授权激活教程
 

 

最近一直在研究数据库同步的问题,在网上查了很多资料,也请教了很多人,找到了一种通过快照复制的方法。研究了一番后发现之前就是用的这个方法,效果不是很好,果断放弃。经过了一番寻觅和他人指点,最后从一位热心网友那里得知一款很好用的软件—— SyncNavigator。

好东西就要拿出来跟大家分享,所以今天向大家介绍一下这款软件,及其一些使用方法。下面先看看它有什么强大的功能吧!

SyncNavigator的基本功能:

自动同步数据/定时同步数据
无论是实时同步/24小时不间断同步,还是根据计划任务(每小时/每日/每周/等)定时自动同步都能完全胜任。

完整支持 Microsoft SQL Server
完整支持 Microsoft SQL Server 2000 2005 2008 数据库类型。并能在不同数据库版本之间相互同步数据。

支持 MySQL 4.1 以上版本
支持 MySQL 4.1 5.0 5.1 5.4 5.5。并能在不同数据库版本之间相互同步数据。

无人值守和故障自动恢复
当数据库故障或网络故障以后,无需人工干预(或操作)自动恢复同步并确保数据完全准确,可靠。

同构数据库同步/异构数据库同步
SQL Server to SQL Server, MySQL to MySQL, SQL Server to MySQL 等都能轻松实现。

断点续传和增量同步
当同步完成(或中断)后,再次同步时能继续上一次的位置增量同步,避免每次都需要从头开始的问题。

为了加快你的查询,增加正确的索引是必不可少的。 但是过了一段时间,当你的系统增长了,你可能会发现自己大量的索引导致数据库的写操作变慢 -- 由于每一次对表的写操作,都需要在事务中更新索引。

也许,五年后, 你的数据库(和你的查询)在某种方式中进化,不再需要一些索引了。例如,有一些明显的情况下,这两个索引是多余的:

  1. -- 原设计  
  2. CREATE INDEX ON customer (first_name); 
  1. -- 5年后  
  2. CREATE INDEX ON customer (first_name, last_name); 

但在许多其他情况下,事情并没有那么明显。例如…

  • 你可能添加了一个在外键上的索引,但随着表的增长,你的数据库开始运行更多的哈希联接,而不是嵌套循环联接,这种情况下索引并没有被使用。
  • 或者,你已经完全停止查询姓/名。
  • 或者你已经开始使用一个比实际名称更具选择性的谓词。
  • 或者你的客户突然都叫史密斯。

每个人都叫史密斯-倒霉的索引!

如果你的索引不再被使用,你可以(并且应该)删除它们。

但如何找到未使用的索引

如果你使用的是Oracle数据库,并且你访问的是生产系统,实际上有一个非常好的方法来查询诊断表,以便知道在游标缓存中是否有任何查询,当前正在使用你的索引。只要运行:

  1. SELECT sql_fulltext 
  2. FROM v$sql 
  3. WHERE sql_id IN ( 
  4.     SELECT sql_id 
  5.     FROM v$sql_plan 
  6.     WHERE (object_owner, object_name) 
  7.      = (('OWNER', 'IDX_CUSTOMER_FIRST_NAME')) 
  8. ORDER BY sql_text; 

这个查询做了什么?它运行游标缓存中的所有SQL语句(V$SQL)并检查他们每一个是否在游标缓存(v$sql_plan)访问索引中存在任何执行计划元素。完成。

当然,如果上述查询没有返回任何结果,这并不意味着没有人使用你的索引。可能还有一个非常罕见的查询,一年只会发生一次,它被游标缓存清除了。

但是如果你将上述查询作为一个工作运行一段时间,你就可以得出这样的结论:如果这个查询不返回任何行,你的索引可能将不再需要了。

我能发现不需要的索引吗?

当然!运行一个类似的查询,列出没有引用V $ sql_plan表的所有引用:

  1. SELECT owner, index_name 
  2. FROM all_indexes 
  3. WHERE owner = 'OWNER' 
  4. AND (owner, index_name) NOT IN ( 
  5.   SELECT object_owner, object_name 
  6.   FROM v$sql_plan 
  7.   WHERE object_owner IS NOT NULL 
  8.   AND object_name IS NOT NULL 
  9. ORDER BY 1, 2 

同样,这并不是说你的索引将永远不会被使用,只是它们最近还没有被使用过。现在,我不会真的给你展示使用上述语句的查询,在PL/SQL循环中运行其结果和使用EXECUTE IMMEDIATE删除所有的索引,因为你可能在你的生产环境中尝试。但是,以防万一你想尝试,这里有一个提示BEGIN

  1. BEGIN 
  2.   FOR i IN (/* above query here */) LOOP 
  3.     EXECUTE IMMEDIATE  
  4.      'DR0P INDEX "' || i.owner || '"."' || i.index_name || '"'; 
  5.   END LOOP; 
  6. END; 

但正如我说的。不要真的这样做!

原文地址:https://www.cnblogs.com/syncnavigator/p/10198353.html