xml地图|网站地图|网站标签 [设为首页] [加入收藏]
如何在没有域的环境中搭建AlwaysOn,及索引视图与
分类:数据库

       对DBA而言,不需要域就可以搭建SQL Server AlwaysOn是Windows Server 2016中最令人兴奋的功能了,它不仅可以降低搭建的成本,而且还减少了部署和运维的工作量。

 

大致分为两种情况:ID连续和ID不连续。

      该特性可以使用户不必额外准备一台或者两台(为了避免单点故障)AD域服务器,从而降低了部署的成本;对DBA而言,可以把更多的精力放在数据库上,而不需要去了解AD域的知识,特别是对MySQL和Oracle转型过来的DBA而言,这绝对是一个非常贴心的特性,要知道windows AD 域的复杂度足够用几本书来阐述,尽管在windows server 2016之前部署和运维AlwaysOn时不需要了解和关注AD域的方方面面,但基本的知识也够得上研究一段时间了。

本文出处: 

1.ID连续的情况:

     下面我给大家介绍如何在Windows Server 2016中部署AlwaysON,整个过程分了两部分,内容较多,我准备以两篇博客来写

 

图片 1图片 2

      1.搭建故障转移集群;

  经常听Oracle的同学说起来物化视图,物化视图的作用之一就是可以实现查询重写,听起来有一种高大上的感觉,
  SQL Server也有类似于Oracle物化视图的功能,只不过叫做索引视图。
  说实话,还是物化视图听起来比较合适,与普通视图比,物化视图就是直接将数据存储起来了
  SQL Server中的索引视图也具有查询重写的功能,
  所谓的查询重写,就是如果符合条件的数据在索引视图上,并且查询列都包含在在索引视图上,此时可以直接通过查询索引视图来替代基于原始表的查询

select * from A where ID between 31 and 40

      2.搭建AlwaysOn;

 

View Code

图片 3

依旧惯例,先上代码做一个测试环境

2.ID不连续的情况:

一.搭建故障转移集群

--创建两张表,一张表头,一张明细,仅仅作为DEMO使用
CREATE TABLE HeadTable
(
    HeadId      INT PRIMARY KEY  ,
    HeadInfo    VARCHAR(50)      ,
    DataStatus  TINYINT          ,
    CreateDate  Datetime
)
GO

CREATE TABLE DetailTable
(
    HeadId      INT           ,
    DetailId    INT identity(1,1) PRIMARY KEY ,
    DatailInfo  VARCHAR(50)
)
GO

--写入数据
DECLARE @i int = 0
WHILE @i<200000
BEGIN
    INSERT INTO HeadTable values (@i,NEWID(),RAND()*10,GETDATE()-RAND()*100)
    INSERT INTO DetailTable(HeadId,DatailInfo) VALUES (@i,NEWID())
    SET @i=@i+1
END
GO

(1).两次对表查询,效率较低。

1.创建集群用户

 

图片 4图片 5

1.1.在每个节点上创建相同用户名和密码的用户,且把此用户加入到服务器本地管理员组;

 

select top 10 * from A where ID not in (select top 30 ID from A)

     说明:考虑到操作系统已自带了administrator,所以此步骤也可以忽略,但为了安全起见,建议还是自建一个集群专用的账户,专号专用,以便日后管理和安全。

索引视图创建

View Code

1.2.配置注册表

那么如何创建索引视图呢?语法上跟创建普通视图差别不大,但是不允许出现select *,表名上要加上Scheme,因为这里不是专门说索引视图的,细节就不多说了。

(2).外层查询没有对表A进行查询,效率提高。

     把LocalAccountTokenFilterPolicy的值设置为1,配置方法:

CREATE VIEW V_IndexViewTest WITH SCHEMABINDING
AS
    SELECT H.HeadId,H.CreateDate,H.DataStatus,D.DetailId,D.DatailInfo
    FROM dbo.HeadTable H INNER JOIN 
                dbo.DetailTable D ON H.HeadId = D.HeadId
    WHERE H.DataStatus = 0
GO

图片 6图片 7

     在powershell中执行如下命令:

索引视图要求创建的第一个列为唯一聚集索引,所以如下,创建一个唯一的聚集索引

select top 10 * from (select top 40 ID from A order by ID) as a order by a.ID desc 
new-itemproperty -path HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem -Name LocalAccountTokenFilterPolicy -Value 1

 图片 8

View Code

     配置成功后的截图:

  对于其他索引,可以跟在表上创建索引一样

(3).ROW_NUMBER()函数效率更高,SQL2005以上版本可用。

图片 9

  图片 10

图片 11图片 12

2.安装故障转移功能

 

1 select * from(select *,ROW_NUMBER() over(order by ID)as 'userID' from A) as a where a.userID between 31 and 40

   在所有的节点上安装故障转移功能:

 

View Code

   2.1.打开【服务器管理器】

查询重写

以上是自己做的笔记,学习过程中,好记性不如烂笔头,自己也记录下来,作为成长的一部分。

   2.2.点击右上角的【管理】,选择【添加角色和功能】

  上面说了,查询重写就是将基于原始表的查询语句,直接在索引视图上查询实现,那么就来看一下查询重写是什么样子的?
  下面来观察这么一个查询,SQL很明显地是基于原始表做的查询,跟普通查询并无二致,
  但是观察执行计划就会发现:
  这个执行计划走了一个索引查找,首先很清楚,HeadTable上的CreateDate是没有索引的,这里走的索引就是V_IndexViewTest上的CreatDate列上的索引
  也就是在索引视图上创建的第二个索引。

图片 13

  图片 14

本文由澳门新葡亰手机版发布于数据库,转载请注明出处:如何在没有域的环境中搭建AlwaysOn,及索引视图与

上一篇:7后导入之前数据库date出错的解决方法,学习笔记 下一篇:没有了
猜你喜欢
热门排行
精彩图文