我使用SQL Server 2008 R2并知道Indexed View不能有自我加入。
我有一个树表有ID和ParentID列,我需要在这个表上创建索引视图自每个记录与父记录之间的连接。我可以在这个视图中模拟自连接吗?
编辑
我的表结构是:
SAM.Detail (DetailID Int, ParentDetailID Int, Quantity Int, ...)
Run Code Online (Sandbox Code Playgroud)
我的查询是:
Select A.DetailID,
A.Quantity - SUM(B.Quantity) as RemainQuantity,
COUNT_BIG(*) as CountBig
From SAM.Detail A
inner join SAM.Detail B ON B.ParentDetailID = A.DetailID
Group By A.DetailID, A.Quantity
Run Code Online (Sandbox Code Playgroud) sql-server-2008 sql-server sql-server-2008-r2 view materialized-view
我希望提高 SQL Server 2008 中视图的性能。这个视图存在于一个报告数据库中,非技术人员广泛使用该数据库来基本上对一个人的所有这些属性进行非规范化。
这是一个非常复杂的长期运行视图。我们有超过 1900 万人,每一列都有很多逻辑。例如,有一个关于一个人是否已故的指标,它依赖于三个 CTE(公共表表达式)和一个 case 语句。
基本上,这是一场噩梦。
我需要想办法提高性能。无法将其更改为表格 - 数据必须准确无误。将其更改为索引视图是正确的 - 它使用来自多个数据库的数据。我无法真正修改列结构,因为它会破坏许多现有报告。
工具箱中是否有可能有帮助的工具?我想知道存储过程或函数是否有帮助。也许是一个带有计算列的表?我将能够每晚提取此人的识别信息并将其存储到表格中,但绝大多数列依赖于实时数据。
performance sql-server-2008 database-design sql-server view query-performance
MYSQL 视图占用物理空间吗?或者换句话说,MYSQL 数据库是否仅限于一定数量的视图?
我的问题:
我正在尝试与一个表中的数据子集进行比较,并且我有两种方法可以部分工作,并且确定必须有一种更正确的方法来做到这一点。
这里的想法是一个包含关于同一系统随时间推移的数据集的表格,我想比较它们,特别是看看何时有介绍或缺席。请允许我用一个简单的测试表来演示:
mysql> select * from gocore;
+-----+------------+------+----------+----------+
| uid | server | tag | software | revision |
+-----+------------+------+----------+----------+
| 1 | enterprise | old | apache | 2.2.25 |
| 2 | enterprise | new | apache | 2.4.6 |
| 3 | enterprise | new | tomcat | 7.0.42 |
| 4 | enterprise | old | geronimo | 2.1.7 |
+-----+------------+------+----------+----------+
Run Code Online (Sandbox Code Playgroud)
在这个例子中有两个数据集——标签“旧”数据集和标签“新”数据集。每个都反映了在某个时间点采集的数据样本。对于服务器“企业”,我们有一个随时间变化的软件包(apache)、一个引入的软件包(tomcat)和一个消失的软件包(geronimo)。
我的目标:一个可以让我总结“旧”和“新”之间状态的查询:
+------------+----------+----------+----------+
| server | software | revision | revision |
+------------+----------+----------+----------+ …Run Code Online (Sandbox Code Playgroud) 由于 MSDN 没有说太多,如果我执行以下查询会发生什么?
update claims set status='Awaiting Auth.'
where status = 'Approved'
Run Code Online (Sandbox Code Playgroud)
我可以使用ClaimStatusName链接表的列dimClaimStatus来更新通过外键引用的主表吗?
视图本身查询多个表,主表是tabData,我也想用上面的查询更新。我想改变fiClaimStatus在tabData从FK该手段 Approved在引用表dimClaimStatus来Awaiting Auth.。它是这样工作的吗?
tabData 中的每一行只能有一个视图行。
这是视图:
CREATE VIEW [dbo].[Claims]
AS
SELECT mu.MarketUnitName AS MarketUnit,
c.CountryName AS Country,
gsp.GSPName AS GSP,
gsp.WCMSKeyNumber AS GspNumber,
sl.SLName AS SL,
sl.WCMSKeyNumber AS SlNumber,
m.ModelName AS Model,
m.SalesName AS [Model-Salesname],
s.ClaimStatusName AS [Status],
d.Work_Order AS [Work Order],
d.SSN_Number AS IMEI,
.... more columns ....
idData, -- …Run Code Online (Sandbox Code Playgroud) 客户要求我实施一些用于报告目的的视图,这些视图将通过 PowerBI、Excel 和 SSRS 访问。指定的用户将只能访问该视图,并且该用户必须不能使用任何基础表。
我遇到的问题是视图中的 SQL 涉及 3 个不同的模式(都在同一个数据库中):
观点是:
CREATE VIEW dbo.vTestPermissions
AS
SELECT a.Column1,
b.Column1,
c.Column1
FROM Pupil.Table1 a
JOIN Provider.Table2 b ON a.Column1 = b.Column1
JOIN Security.Table3 c ON a.Column1 = c.Column1
Run Code Online (Sandbox Code Playgroud)
表/视图的所有者如下:
当我从视图中选择时,出现错误:
对象“table3”、数据库“TEST”、架构“Security”的 SELECT 权限被拒绝
我曾尝试在SELECT有和没有GRANT模式和表选项的情况下授予权限,但这使用户可以使用基础表。
对此的任何帮助将不胜感激。
假设我有一个这样的函数:
create function house_analysis(ingeo geometry)
returns table(count_all numeric, count_important numeric) as
$$
select count(*), count(*) filter (where h.import_flag)
from house_table h where st_intersects(ingeo, h.geom)
$$ language sql stable;
Run Code Online (Sandbox Code Playgroud)
我定义了一个这样的视图:
create or replace view postzone_analysis as (
select p.zipcode, ha.count_all, ha.count_important
from postzone_table p, house_analysis(p.geom) ha
);
Run Code Online (Sandbox Code Playgroud)
问题是:
如何pg_catalog.*使用我的视图(postzone_analysis或其视图)查询系统目录 ( ) 以oid获取其中使用的函数的列表?他们的pg_proc.oid价值观很好。
我知道数据库会跟踪,因为我无法删除该函数,但在pg_depend.
数据库是 PostgreSQL 9.5。
(现实生活中的情况要复杂得多 - 它被缩小为最低可行的例子。视图调用就像 6 个分析函数,它结合了来自不同来源的数据,并且有多个基于不同区域类的视图。 )
我目前正在 Oracle 中为我们的生产运行一个很长的脚本,但我们在数据中存在差异。
当我检查脚本正在使用的视图(我正在使用 Toad)时,我看到视图名称旁边有一个 X 标记,然后我看到了一个编译它的选项。
我想知道在视图中编译是否意味着什么?视图是否未更新从而导致数据出现差异?
我在一次演示中看到过一次,当时有人展示了一个查询来计算视图在 SQL 服务器中查询的次数。我不记得它是来自 DMV 还是其他一些统计数据的组合,但我清楚地记得当他们运行一个从视图中选择的查询时,它会显示计数增加一。我记得关于演示文稿的另一个有趣的事实是从 CTE 中选择将计数增加了两个,因为 SQL Server 必须创建一个“临时视图”,然后从中进行选择。
有谁知道如何证明这一点?
我对我们的数据库拥有完全的管理员权限,因此可以查询和查看视图定义。但是,我想在 JDBC Jenkins 作业魔术中使用只读用户查询视图。问题:与我的管理员用户不同,只读用户看不到视图的代码/定义。
当我担任管理员时,此查询为我提供了所有视图所需的所有视图定义和元数据:
SELECT name AS VIEW_NAME,
definition,
create_date,
modify_date
FROM [my_database].[sys].[all_views]
JOIN [my_database].[sys].[sql_modules]
ON [my_database].[sys].[all_views].object_id = [my_database].[sys].[sql_modules].object_id
Run Code Online (Sandbox Code Playgroud)
结果,当以管理员身份执行查询时,我得到如下条目:
name | definition | create_date | modify_date
sample_view | SELECT * FROM bla | 01.01.2017 | 02.01.2017
Run Code Online (Sandbox Code Playgroud)
然而,当我用我的只读用户做这件事时,我得到了
name | definition | create_date | modify_date
sample_view | null | 01.01.2017 | 02.01.2017
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到我对只读用户的权限配置。尽管我已授予他必要的权限,但用户在结果集中看不到视图定义。
更奇怪的是,在允许用户执行 SELECT 和 VIEW 定义语句并保存配置之后,SELECT 和 VIEW DEFINITION 的第二个条目被添加到配置表中。
view ×10
sql-server ×6
mysql ×2
dependencies ×1
dmv ×1
functions ×1
join ×1
oracle ×1
owner ×1
performance ×1
permissions ×1
postgresql ×1
ssms ×1
storage ×1
t-sql ×1
update ×1