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

时间:2009-11-19 21:53:02

标签: c# sql sql-server

我正在尝试对我只读取访问权限的Microsoft SQL Server进行大量查询。我的查询需要处理与数据库体系结构完全不同的数据。由于我只有读访问权限,因此无法创建视图,因此我正在寻找解决方案。 我目前正在做的是使用复杂的查询来返回我需要的结果,但这是与子查询的4-5个表连接。它非常缓慢且资源密集。 我可以看到两种解决方案,但我很想知道我可能错过的任何内容:

  • 使用某种缓存数据的“代理”,并围绕它创建视图。这需要某种方法来确定数据的肮脏程度。 (有这样的东西吗?)
  • 运行我自己的SQL服务器,每隔X分钟镜像一次来自源SQL服务器的数据,然后在我的SQL服务器上加载视图。

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

谢谢!

6 个答案:

答案 0 :(得分:2)

以下是一些选项:

<强>复制

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

在此处阅读更多内容:http://technet.microsoft.com/en-us/library/ms151198.aspx

同一实例上的新数据库

在与 ProductionDB 相同的服务器上获取新数据库 MyDB ,并为您提供WRITE访问权限。在那里创建你的观点。

您的视图创建可能如下所示:

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 + Difference实例:我建议在与SQL Server相同的SQL Server实例上创建MyDB,而不是安装新的实例。单个计算机上的多个SQL Server实例在资源方面比同一实例上的新数据库要贵得多。

标准可重用视图

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

答案 1 :(得分:1)

您也可以使用CTE,它可以像一个视图。

如果Raj More的#2建议不适合你,我会继续这样做......

WITH myusers (userid, username, password)
AS
(
   -- this is where the definition of view would go.
select   userid, username, password from Users 

)


select * from myusers

答案 2 :(得分:0)

您可以要求DBA为像“Contractors”这样的人创建架构,并允许您仅在该架构内创建对象。

答案 3 :(得分:0)

我会查看Management studio中的查询计划,看看你是否可以告诉它为什么表现不佳。也许你需要重写你的查询。如果有帮助,您也可以使用表级变量作为临时表来存储中间结果。只要确保你没有在其中存储大量记录。您可以批量运行多个语句,如下所示:

DECLARE @tempTable TABLE
(
    col1 int,
    col2 varchar(250)
)

INSERT INTO @tempTable (col1, col2)
SELECT a, b
FROM SomeTable
WHERE a < 100 ... /* some complex query */

SELECT *
FROM OtherTable o
INNER JOIN @tempTable T
ON o.col1 = T.col1
WHERE ... 

答案 4 :(得分:0)

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

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

中选择*

在任何一种情况下,数据总是“实时”,因此无需担心脏数据。

视图将为您带来更清晰的代码和单个位置以进行更改,并且缓存的执行计划可以获得几毫秒的性能优势。但是,不应该有很好的性能飞跃。你提到了缓存,但据我所知,服务器不会为普通的非索引视图执行任何特定的数据缓存,而这些视图也不会用于即席查询。

如果您还没有这样做,您可能希望进行实验以查看视图是否实际更快 - 制作数据库的副本并在那里添加视图。

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

如果您已经使用链接服务器来获取数据,那么这种特殊情况才会发挥作用,因此它可能与原始问题无关,但我认为这很有趣,因为我们正在讨论视图的性能。

答案 5 :(得分:0)

通过使用视图,您的查询效果不会更好。您需要调整这些查询,并且可能需要在这些表上创建一些索引,以支持您的查询。

如果您无法访问数据库,那么为了创建这些索引,您可以将数据“缓存”到您创建的新数据库中,并在这个新数据库中调整查询。当然,您必须实现一些同步,以使缓存的数据保持最新。

这样您就不会立即看到对原始数据库所做的更改(会有延迟),但是如果您愿意,您可以更快地执行查询,甚至可以创建这些视图。 / p>