标签: view

多视图查询优化

我们有一个怪物视图,其中包含与许多(许多)表的联接,以便返回所需的数据。在某些情况下,为了获取一列信息,我们必须连接到 4 个表,只是为了获取我们需要的值(数据库结构不是很好,我们无法更改它)。

为了提高性能,我提取了某些组件并将它们构建到自己的视图中,以简化执行计划,并希望优化查询。

如果我编写一个将这些视图连接在一起的查询,我是否会失去每个视图的查询优化的好处?即,我最终会回到开始的地方,将视图组合成单个选择,还是因为它们彼此原子地起作用,所以它本身会表现得更好?

sql-server optimization sql-server-2000 view

2
推荐指数
1
解决办法
1505
查看次数

计算列与视图

我正在考虑最好的方法来做到这一点。如果我在 sql server 中有这样的表:
StudentPointsTable
StudentID
TestDate
Points

我还需要为学生计算平均值和标准差。我知道我可以创建一个视图,或者用这些计算列创建一个新表,或者将计算列添加到这个表中。

不确定是否还有其他选择,但在性能方面,最好的方法是什么?

index sql-server view computed-column

2
推荐指数
1
解决办法
3574
查看次数

在视图名称为变量的过程中查询视图

我的问题:我有一组视图,我想从中动态查询。我想将视图名称加载SELECT * from sys.all_views到游标中(让我们称之为view_cursor),然后在过程中执行以下操作:

-- loop starts
FETCH NEXT FROM view_cursor INTO @view_name;
SELECT * FROM @view_name;
-- fetch next
-- loop ends
Run Code Online (Sandbox Code Playgroud)

我已经在一个视图中尝试过这个,我将它作为参数传递给存储过程:

CREATE PROCEDURE [dbo].[query_Special_View](@view_name VARCHAR(100)) AS
DECLARE viewname VARCHAR(100);
DECLARE @counter INT = 0;
BEGIN

    PRINT @view_name
    EXECUTE('SELECT COUNT(Value) INTO' + @counter + 'FROM' + @view_name + '');

    PRINT @counter;
END
Run Code Online (Sandbox Code Playgroud)

然后,我想使用现有视图名称执行该过程:

EXEC    [dbo].[query_Special_View]
        @view_name = N'A_very_special_LOC_view' -- the view name as parameter
GO
Run Code Online (Sandbox Code Playgroud)

结果是:

消息 207,级别 16,状态 1,第 1 行 列名“值”无效。

但是,我尝试 …

sql-server stored-procedures ssms view sql-server-2016

2
推荐指数
1
解决办法
1339
查看次数

日期时间字段在视图中作为整数返回

今天我们遇到了一个奇怪的案例,一个执行“select * from table”的视图有几个日期时间字段作为整数返回。这在以前一直有效,直到最近。视图本身并没有强制这些列作为整数返回。

另一个奇怪的事情是重写视图以显式选择所有列会使数据作为日期时间返回。我在想这可能是某种糟糕的缓存计划,但我不确定。

数据错误回撤的罪魁祸首是什么?

view sql-server-2014

2
推荐指数
1
解决办法
230
查看次数

有效地从 am:n 表中返回两个聚合数组

我有一个表,用于表上的多对多关系users来表示用户之间的跟随关系:

CREATE TABLE users (
    id text PRIMARY KEY,
    username text NOT NULL
);

CREATE TABLE followers (
    userid text,
    followid text,
    PRIMARY KEY (userid, followid),
    CONSTRAINT followers_userid_fk   FOREIGN KEY (userid)   REFERENCES users (id),
    CONSTRAINT followers_followid_fk FOREIGN KEY (followid) REFERENCES users (id)
);

CREATE INDEX followers_followid_idx ON followers (followid);
Run Code Online (Sandbox Code Playgroud)

当我想使用与用户相关的数据创建 JSON 响应时,我有两种情况:

  • 通过 id 请求单个用户,
  • 通过 id 列表请求用户对象数组

用户数据对象应包含两个用户 ID 数组,一个是他们关注的用户,另一个是关注他们的用户。为了创建这两个字段,我使用了以下SELECT语句。

DECLARE follows RECORD;
SELECT  array (select followid FROM followers where userid = Puserid) AS following, …
Run Code Online (Sandbox Code Playgroud)

postgresql performance view many-to-many postgresql-10

2
推荐指数
1
解决办法
1120
查看次数

从视图生成 SQL 表 DDL

如何在一个脚本中从视图生成表结构?只需要数据类型,我正在寻找具有某种类型的动态 sql 的表创建脚本

(1) 可以删除主键/约束,

(2) 不在乎是否添加了 null/not null(但是如果有的话会很好)

我在下面提出了示例问题/答案,请随时对未包含在表中的其他数据类型进行代码审查、编辑/优化,特殊情况/问题/例外可能没有考虑在内。顺便说一下,是否有任何开源代码?

表 1 和 2:

create table dbo.Customer
(
     CustomerId int primary key,
     CustomerName varchar(255),
     ZipCode varchar(9)
)
create table dbo.CustomerTransaction
(
     CustomerTransactionId int primary key identity(1,1),
     CustomerId int,
     SalesAmount numeric (10,2),
     PurchaseDate datetime
)
Run Code Online (Sandbox Code Playgroud)

看法:

create view dbo.CustomerTransactionVw
as
select 
     ct.CustomerTransactionId,
     ct.SalesAmount,
     ct.PurchaseDate,
     cust.CustomerId,
     CustomerName,
     cust.ZipCode
from dbo.CustomerTransaction ct
inner join dbo.Customer cust
  on cust.CustomerId = ct.CustomerId
Run Code Online (Sandbox Code Playgroud)

预期的表创建脚本:

create table dbo.CustomerTransactionBigTable
(
     CustomerTransactionId int identity(1,1),
     CustomerId int,
     SalesAmount numeric (10,2), …
Run Code Online (Sandbox Code Playgroud)

sql-server view dmv sql-server-2016

2
推荐指数
1
解决办法
1730
查看次数

SQL Server 备份数据库命令是否也备份数据库中的视图?

我有一个备份作业(SQL Server 代理作业),它将遍历 SSMS 中的所有 SQL Server 数据库,调用 BACKUP DATABASE命令在不同的服务器上创建一个 .bak 文件。这台另一台服务器有自己的工作,遍历所有 .baks 并恢复它们(使用RESTORE DATABASE命令)。

编辑:运行RESTORE作业的服务器将 .baks 恢复到它自己的 SSMS 安装中

这些作业在 SQL 代理作业历史记录中报告成功,所以我想知道这些作业是否也应该备份和恢复数据库中的视图(因为它们似乎没有),或者这是否表明脚本是'很好用吗?

sql-server backup view restore

1
推荐指数
1
解决办法
883
查看次数

为什么向视图添加列会损坏表值函数?

我有一个 TVPmyTVP实现为select val.* from vw_MyView val. 前几天,我修改了vw_MyView,将: 替换
select Foo,Bar from DB
select Foo, Bash, Bar from DB

这有一个奇怪的副作用:调用select Bar from myTVP()返回一个名为Bar填充了内容的列Bash(尽管事实上BarBash甚至没有相同的类型)。

展示问题的匿名计划:https://www.brentozar.com/pastetheplan/?id=ryJLJmqdl

请注意,Object2Object1是相同的,但两个计划之间最左侧嵌套循环的输出列表完全不同。

笔记:

  • 使用中没有计划提示。未设置跟踪标志。
  • CheckDB 没有发现错误。
  • 使用选项(重新编译)并没有解决问题。
  • 在 TVP 上运行右键单击 alter 且不进行任何更改修复了该问题。
  • 在名称更改的 TVP 上运行右键单击 alter 修复了该问题,但新的 TVP 除名称外与之前的相同。
  • 使用SQL 2014标准版。

问题:

  1. 向视图添加新列以更改对该视图的其他引用所使用的视图列是否正常?
  2. 在什么情况下向视图添加列会导致这种行为?

sql-server view sql-server-2014 set-returning-functions

1
推荐指数
1
解决办法
387
查看次数

SQL Server:使用 case 语句提高 CTE 性能

我需要你的帮助,我需要一些指导来提高以下给定视图的性能。

我有一个用以下代码编写的视图:

with timeframes  as
(
select p.SEARCH_NUM, 
case   when p.FROM_DATE is not null then p.FROM_DATE
       when p.FROM_DATE is null and P.SEARCH_DAYS is not null and p.TO_DATE is not null then DATEADD(day,p.SEARCH_DAYS*-1,p.TO_DATE)
       when p.FROM_DATE is null and P.SEARCH_DAYS is not null and p.TO_DATE is null then DATEADD(day,p.SEARCH_DAYS*-1,GetDate()) 
       when p.FROM_DATE is null and P.SEARCH_DAYS is null and p.TO_DATE is not null and p.DURATION = 'Yearly' then DATEADD(year,-1,p.TO_DATE)
       when p.FROM_DATE is null and P.SEARCH_DAYS is null and p.TO_DATE is null and p.DURATION …
Run Code Online (Sandbox Code Playgroud)

performance cte execution-plan view sql-server-2012

1
推荐指数
1
解决办法
5206
查看次数

在一次执行中运行许多 CREATE VIEW 和 GRANT SELECT 语句

有没有办法通过在 SQL Server Management Studio 中按 F5 来运行多个 CREATE VIEW 命令和/或多个 GRANT SELECT 命令?如果是这样,我该怎么做?

sql-server ssms view

1
推荐指数
1
解决办法
2045
查看次数