这个说法正确吗?
在幕后 SQL Server 实际上将视图中的数据存储为物理表,如果视图背后的任何数据发生更改,则必须更新该物理表
我做了一些搜索,但找不到任何关于视图如何在 SQL Server 中工作的资源。我一直认为除非您使用索引/物化视图,否则视图不会占用任何额外的数据空间。
谢谢
我正在从 SQL Server 的视图中进行选择。如果我右键单击它并选择“选择前 n 行”,它会运行并显示 30 列。如果我在 ALTER 模式下打开视图(右键单击,脚本视图为等...),突出显示代码并运行它,我会得到 50 列。我应该得到 50 列,因为我刚刚添加了 20 个新列到提供视图的表中,并且在视图中我使用了“SELECT * FROM...”语句。
我已经刷新了 Views 文件夹,但这没有帮助。
任何人都知道为什么会出现差异,以及如何纠正它?
我有这个查询:
SELECT
-
FROM -.dbo.tb1
WHERE
-IN
(
SELECT
CASE
WHEN EXISTS
(
SELECT *
FROM -.dbo.tb2U1 WITH (NOLOCK)
WHERE col1 = '8614'
)
THEN
(
SELECT TOP (1)
CASE WHEN ISNULL(col2,0) IN (1,2,3,6,8)
THEN '2'
ELSE '1'
END AS col3
FROM -.dbo.tb1U1 WITH (NOLOCK)
LEFT join -.dbo.tb3U2 WITH (NOLOCK)
ON U1.-= U2.-
WHERE
-= '8614'
ORDER by
-DESC
)
ELSE '3'
END
);
Run Code Online (Sandbox Code Playgroud)
当我运行它时-,它没问题。它返回我想要的东西:
SELECT
-
FROM -.dbo.tb1
WHERE
-IN
(
SELECT
CASE
WHEN EXISTS
(
SELECT …Run Code Online (Sandbox Code Playgroud) 我正在对这个缓慢的存储过程进行故障排除,在检查实际执行计划时,我注意到一个可能缺少索引的警告。仔细看看,它反对其中一个观点,而不是实际的表格。这怎么可能?
当然,物理表正在使用,但实际视图不是!
视图是这样的:
CREATE VIEW [ws].[MyVIEWTable]
WITH SCHEMABINDING
AS
SELECT col1, col2
FROM [dbo].[MyTable]
Run Code Online (Sandbox Code Playgroud)
为什么 SQL Server 引擎使用视图来检索数据而不是实际的物理表,在这种情况下是dbo.MyTable?
我需要编写一个必须执行以下操作的 SQL 文件:
创建一个名为“选择”的角色
授予对当前数据库的连接/使用权限
授予选择/执行所有模式的所有视图(或至少在当前)
我尝试了大量的 GRANT...ON...TO 组合,但我无法弄清楚。
附加信息:这些脚本由 ANT 执行,数据库和模式名称 (search_path) 已经设置。所以我不能烧录像“production_db”或“qa_db”这样的名字。
目标是创建单个 PostgreSQL 角色,以便客户端可以绕过 Tomcat (Hibernate) 并直接在 Postgres 服务器上运行选择/搜索。该角色必须能够从视图中进行选择,而不能从其他视图中进行选择。
更新:接受的答案让我找到了一个解决方案,我将所有视图提取到一个单独的架构中,并仅授予对该架构的访问权限。
我的问题的简化版本如下:
我有三个表记录、输入和输出。
记录
Id
DTS
1
2015-01-01 00:00
...
输入
Id
RecordId
InputId
Value
1
1
1
100
...
...
N
1
1
105
输出
Id
RecordId
OutputId
Value
1
1
1
200
...
...
M
1
1
10
这样做是为了避免由于表中列数的限制而限制输入或输出的总数。我正在寻找针对类似于以下内容的查询的最佳(最快)方法:
DTS
Input1
...
InputN
Output1
...
OutputM
2015-01-01 00:00
100
...
105
200
...
10
...
我最初的计划是基于旋转必要的输入和输出并适当地加入它们来创建一个视图。数据只需要只读并且本质上是静态的,所以我想防止它为每个查询扩展。我读到我可以向视图添加索引以“具体化”它,但是如果视图使用 PIVOT,则无法做到这一点。
有没有人对我如何做到这一点有任何建议?或者,如果我以错误的方式处理这个问题,我很乐意接受建议。
我试图在 Postgres 9.0 的 PostGIS 中填充一个视图,在这个视图中我希望它包含一个基于 2 个字符串位置的子字符串。请参阅下面的我的代码。
CREATE OR REPLACE VIEW vw_actions AS
SELECT ls.f_table_schema, ls.f_table_name,
(SELECT substr(ls.attribute_actions_text,
strpos(ls.attribute_actions_text, 'name="')+6,
strpos(ls.attribute_actions_text, '"/>') -
strpos(ls.attribute_actions_text, 'name="'))) AS actions
FROM layer_styles ls;
Run Code Online (Sandbox Code Playgroud)
结果是它在使用 strpos 时不喜欢负数。我可以让它前进 6 个字符以从返回的子字符串中删除 'name="' 但不能删除 '"/>'。
它返回以下内容:
View SHED Database"/>
Run Code Online (Sandbox Code Playgroud)
我希望它返回的地方:
View SHED Database
Run Code Online (Sandbox Code Playgroud)
任何建议将不胜感激。
补充:我发现如果我使用 9.1,我可以使用 strposrev 并且我认为以下代码会起作用:
CREATE OR REPLACE VIEW vw_actions AS
SELECT ls.f_table_schema, ls.f_table_name,
(SELECT substr(ls.attribute_actions_text::text,
strpos(ls.attribute_actions_text::text, 'name="'::text)+6,
strposrev(ls.attribute_actions_text::text, '"/>'::text)+3 -
strpos(ls.attribute_actions_text::text, 'name="'::text))) AS actions
FROM layer_styles ls;
Run Code Online (Sandbox Code Playgroud) 首先让我声明我是 C# 开发人员,而不是 SQL Server DBA,所以请原谅我对 SQL Server 数据库查询执行计划的无知。
我想知道的是对于使用主键和外键从两个或多个表中提取结果以引用它们的存储过程,是否更好的做法是:
我问是因为在 C# 世界中,我们会将关注点分开,因此一个对象或函数将负责连接(在本例中为视图),另一个对象或函数将负责过滤(在本例中为存储过程) )。
在 C# 中,关注点分离通常被认为比性能更重要,直到证明性能已成为代码的严重问题。但是我不知道SQL世界里的东西堆起来了!
performance sql-server stored-procedures execution-plan view query-performance
我有两个非常简单的表,以及在bigint字段上加入它们的视图:
CREATE TABLE foo.ao (
id serial NOT NULL,
ao_id bigint NOT NULL,
ao_plz text,
ao_community text,
ao_street text,
ao_ms_id text,
ao_status text DEFAULT 'Standard'::character varying,
ao_has_eear boolean,
ao_last_update timestamp without time zone,
CONSTRAINT ao_pkey PRIMARY KEY (id),
CONSTRAINT ao_id_unique UNIQUE (ao_id)
);
CREATE TABLE foo.ms (
id serial NOT NULL,
ms_nis_number text NOT NULL,
ms_plz text,
ms_community text,
ms_street text,
ms_status text DEFAULT 'Standard'::character varying,
ms_coord_x integer,
ms_coord_y integer,
ms_ao_id bigint,
CONSTRAINT ms_pkey PRIMARY KEY (id),
CONSTRAINT …Run Code Online (Sandbox Code Playgroud) postgresql performance view postgresql-9.3 postgresql-performance
我对 ERP 应用程序进行编程、管理和支持。我更常见的任务之一是了解数据的来源,找到应用程序中特定报告字段与其数据输入字段之间的链接。为此,我必须手动检查一个或多个视图的 DDL SQL 以了解表列,以便将一个视图的表列与另一个视图的表列进行匹配。此手动任务可能需要检查四个或五个抽象层。
是否有一种更快的方法来检查元数据以查找如何从其基表列计算视图列?有没有办法检查 Oracle 的执行计划以查看重写的查询,跳过对中间视图的手动检查?
view ×10
sql-server ×5
performance ×4
postgresql ×3
disk-space ×1
dml ×1
oracle ×1
permissions ×1
pivot ×1