首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在具有只读访问权限的Server上模拟视图的方法?

在具有只读访问权限的Server上模拟视图的方法?
EN

Stack Overflow用户
提问于 2009-11-19 21:53:02
回答 6查看 540关注 0票数 0

我正在尝试对只具有只读访问权限的进行大量查询。我的查询需要以与DB体系结构非常不同的结构处理数据。因为我只有读取访问权限,所以我无法创建视图,所以我正在寻找解决方案。我目前正在做的是使用复杂的查询来返回我需要的结果,但这是4-5表与子查询的连接。它速度缓慢,资源密集。我可以看到两个解决方案,但我很想听听我可能错过的任何事情:

  • 使用某种“代理”来缓存数据,并围绕数据创建视图。这需要某种方法来确定数据的污染程度。
  • 运行自己的SQL server,每隔X分钟从源SQL服务器镜像数据,然后在SQL server.

上加载视图。

还有其他想法吗?还是关于这些想法的建议?

谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-11-20 04:24:25

如果可以在该服务器上创建新数据库,则可以在新数据库中创建视图。视图可以使用三个部分的名称访问数据。例如从OtherDB.dbo.Table中选择*。

如果您可以访问另一个SQL服务器,则DBA可以创建一个“链接服务器”。然后,您可以创建使用四个部分名称访问数据的视图。例如从OtherServer.OtherDB.dbo.Table中选择*

在这两种情况下,数据总是“实时”的,因此不需要担心脏数据。

视图将为您带来更干净的代码和进行更改的单一位置,而且缓存的执行计划只会给性能带来几毫秒的好处。然而,不应该有很大的性能飞跃。您提到了缓存,但据我所知,服务器不会对普通的、非索引的视图进行任何特定的数据缓存,而对于即席查询则不会这样做。

如果您还没有这样做,您可能希望做一些实验,看看视图是否真的更快--复制一个数据库并在那里添加视图。

编辑:我今天做了一个类似的实验。我在Server1上存储了一个程序,它通过链接服务器从Server2获取数据。这是一个复杂的查询,将两个服务器上的许多表连接起来。我在Server2上创建了一个视图,该视图获取了该服务器所需的所有数据,并更新了proc (在Server1上),以便它使用该视图(通过链接服务器),然后将该视图加入到Server1上的一组表中。更新后的速度明显更快。原因似乎是Server1没有估计从Server2获得的行数,从而构建了一个糟糕的计划。它在使用视图时做了更好的估计。如果视图与它正在读取的数据位于同一个数据库中并不重要,它只需要在同一台服务器上(我只在实例上使用,所以我不知道实例将如何发挥作用)。

只有当您已经使用链接服务器获取数据时,这个特殊的场景才会发挥作用,因此它可能与最初的问题无关,但我认为这很有趣,因为我们正在讨论视图的性能。

票数 0
EN

Stack Overflow用户

发布于 2009-11-19 21:59:22

以下是给你的一些选择:

复制

设置复制以将数据移动到您自己的Server,并在那里创建您需要的任何视图。管理员必须设置这个。如果需要查看数据更改时的情况,请使用事务复制。如果没有,你可以拍快照。

在这里阅读更多信息:http://technet.microsoft.com/en-us/library/ms151198.aspx

基于同一实例的新数据库

在与您的ProductionDB相同的服务器上获得一个新的数据库MyDB,并为您提供写访问权。在那里创建你的视图。

视图创建可以如下所示:

代码语言:javascript
复制
USE MyDB
GO
CREATE VIEW DBO.MyView 
AS

SELECT Column1, Column2, Column3, Column4
FROM ProductionDB.dbo.TableName1 t1
    INNER JOIN ProductionDB.dbo.TableName2 t2
        ON t1.ColX = T2.ColX

GO

同一个实例,而不是相同的服务器+差异实例:我建议在Server的同一个实例上创建与MyDB相同的ProductionDB,而不是安装一个新实例。单台机器上的多个Server实例在资源方面比同一实例上的新DB要昂贵得多。

标准可重用视图

创建一组标准化视图,并要求管理员将它们放到只读服务器上,并在查询中重用这些视图。

票数 2
EN

Stack Overflow用户

发布于 2009-11-19 22:19:27

您也可以使用CTE,这可以作为一个视图。

如果拉杰·莫尔的第二条建议对你不起作用,我会同意的.

代码语言:javascript
复制
WITH myusers (userid, username, password)
AS
(
   -- this is where the definition of view would go.
select   userid, username, password from Users 

)


select * from myusers
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1766836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档