MSSQL订阅库索引对齐

  需求如下图:

  

  在原来的架构中是每台web服务器都固定访问某一台数据库服务器,所以就造成了每台数据库订阅服务器上的索引不一致。现在的需求就是要把所有的订阅库上的索引调整为一致,为了就是实现高可用+负载均衡。原因是因为订阅库出现过硬盘故障,导致部分的应用无法访问了。

  思路比较简单粗暴

    1、把数据库中所有的索引信息提取出来

SELECT OBJECT_NAME(i.[object_id]) tblname
    , i.name Index_name
    , i.index_id
    , i.type_desc Index_Type
    , c.name ColName
    , ic.index_column_id index_column_id
    , ic.is_included_column is_included_column
    , i.is_unique
    , i.fill_factor
    , i.filter_definition
INTO DBName_Index_Align_192_168_10_2_V1
FROM sys.indexes i
    LEFT OUTER JOIN sys.index_columns ic ON i.index_id = ic.index_id AND ic.[object_id] = i.[object_id]
    LEFT OUTER JOIN sys.[columns] c ON c.[object_id] = i.[object_id] AND c.column_id = ic.column_id
ORDER BY OBJECT_NAME(i.[object_id])

    2、匹配所有的索引(这步比较耗时耗力,相当于重新把所有的库做了一次调优)

      2.1、先用192.168.10.2跟192.168.10.3做匹配,把两个库的索引调整成一致

      2.2、再用192.168.10.2跟192.168.10.4做匹配,把在192.168.10.2上的调整同时调整到192.168.10.3上。

      2.3、若是还有更多的订阅库,就一直使用192.168.10.2来作为匹配的对象,把在此数据库上做的调整同时更新更已经匹配过的订阅数据库上。

# 使用以下的代码来匹配SELECT *
FROM (
SELECT ia.tblname tblname, ia.Index_name, ia.ColName, ia.index_column_id, ia.Index_Type ,
       ia.is_included_column, ia.filter_definition ,
       ia2.tblname cmp_tblname, ia2.Index_name cmp_Index_name, ia2.ColName cmp_ColName, ia2.index_column_id cmp_index_column_id,ia2.Index_Type cmp_Index_Type,
       ia2.is_included_column cmp_is_included_column, ia2.filter_definition cmp_filter_definition
FROM DBName_Index_Align_192_168_10_2_V1 ia
    FULL JOIN DBName_Index_Align_192_168_10_3_V1 ia2 ON ia.tblname = ia2.tblname
                                        AND ia.Index_name = ia2.Index_name
                                        AND ia.ColName = ia2.ColName
                                        AND ia.index_column_id = ia2.index_column_id
                                        AND ia.is_included_column = ia2.is_included_column
) t
WHERE  ISNULL(t.tblname , t.cmp_tblname)  NOT IN (‘索引名称‘)
  AND ISNULL(t.Index_Type , t.cmp_Index_Type) <> ‘HEAP‘
ORDER BY ISNULL(t.tblname , t.cmp_tblname), ISNULL(t.Index_name , t.cmp_Index_name) , ISNULL(t.index_column_id , t.cmp_index_column_id)

  注:这种方法虽然实现比较初级的高可用和负载均衡,但存在以下弊端

    1、因为索引必须对齐,所以在部分的订阅库中也建立了一些可能永远都不会访问到的索引,这样会导致空间消耗和索引更新带来的消耗;

 

  以上,如有错谬,请不吝指正。

时间: 2024-11-03 03:43:16

MSSQL订阅库索引对齐的相关文章

Pandas Cookbook -- 06索引对齐

索引对齐 简书大神SeanCheney的译作,我作了些格式调整和文章目录结构的变化,更适合自己阅读,以后翻阅是更加方便自己查找吧 import pandas as pd import numpy as np 1 索引方法 college = pd.read_csv('data/college.csv') college.iloc[:5,:5] .dataframe tbody tr th:only-of-type { vertical-align: middle } .dataframe tbo

MSSQL站库分离情况的渗透思路

本文转自:http://bbs.blackbap.org/thread-6203-1-2.html 1. 服务器属内网环境,站库分离,通过web.config找到数据库服务库SA帐号密码,成功添加用户(192.168.0.206) .2. Web服务器(192.168.0.203) .数据库服务器(192.168.0.206)都存在symantec杀毒软件,不能转lcx.exe工具转发 .3. 测试过其它的转发工具,要么被查杀,要么无法用,使用reDuh工具只能转发当前IP的,而且速度极慢,受不

mySql---数据库索引原理及优化

一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 二.常见的查询算法及数据结构 为什么这里要讲查询算法和数据结构呢?因为之所以要建立索引,其实就是为了构建一种数据结构,可以在上面应用

SqlServer 可更新订阅中在订阅库并发获取最大单据号测试及解决法案!

说明: 很多交易的系统都需要单据号,而单据号按顺序并发获取又是一件头疼的事!~ 一般单据号格式为:前缀+日期+编号(如:KK20150501000001) 现在模拟测试,数据库中的单据号作为一张表处理. 数据库单据号表(Billnumber)存储每个账号及其最大的单据号总共一条记录 单据号是组合而成的字符串,后6位为序号. 获取单据号的存储过程: EXEC [dbo].[GetBillnumber_Test]@Account='Account',@Billnumber NVARCHAR(20)O

iOS(iPhone,iPad))开发(Objective-C)开发库常用库索引

http://www.code4app.com 这网站不错,收集各种 iOS App 开发可以用到的代码示例 http://www.cocoacontrols.com/ 英文版本的lib收集 http://www.objclibs.com/ 精品lib的收集网站 http://www.ityran.com/forum-61-1.html 泰然代码仓库 ---------------------- emoji ---------------------- http://www.easyapns.c

查看库索引情况

declare @db_id int declare @object_id int set @db_id = DB_ID(N'heb000') set @object_id = OBJECT_ID(N'heb000') select * from  sys.dm_db_index_physical_stats(@db_id,@object_id,null,null,'detailed') order by page_count desc select name from sysobjects w

iOS开发(Objective-C)常用库索引

code4app.com 这网站不错,收集各种 iOS App 开发可以用到的代码示例 cocoacontrols.com/ 英文版本的lib收集 objclibs.com/ 精品lib的收集网站 http://www.ityran.com/forum-61-1.html 泰然代码仓库 ---------------------- emoji ---------------------- http://www.easyapns.com/category/just-for-fun http://w

2016.9.6----数据库索引

Create Table mytable{ id int primary key, category_id int not null default 0, user_id int not null default 0, adddate int not null default 0 } 如果查询是常用类似以下的语句: SELECT * FROM mytable  WHERE category_id=1; 最直接的对应之道,是为category_id建立一个简单的索引 CREATE INDEX my

读取MSSQL数据库所有索引

select a.name as tabname ,h.name as idnamefrom sys.objects as a right join sys.indexes as h on a.object_id=h.object_id where a.type<>'s' go由于索引和系统列没有直接对应关系 所以不能直接查看列字段和字段长度