标签: view

未优化单行的 Postgres CTE 查询

我试图从我的数据库中获取用户统计信息的加权总和,并且我一次只会查询一个或两个用户的表,所以我将它写为一个视图。

由于它是一个视图,我假装计算表中每一行的总和,然后我希望优化器能够意识到当我只要求一行并优化查询时。然而,我的查询计划非常庞大,并且在其最里面计算了 170 亿行,我认为最多应该有 1000 行。

这是查询:

CREATE OR REPLACE VIEW weighted_stats AS
WITH 
    clf AS (SELECT * FROM classifiers order by time_trained desc limit 1),
    weights AS (SELECT kv.key, kv.value from clf, each(clf.weights) AS kv),
    kvs AS (
        SELECT stats.player_id, kv.key, kv.value FROM
        stats, each(stats.hstore_column) AS kv),
SELECT
    stats.player_id,
    SUM(kvs.value :: numeric * weights.value :: numeric) AS stats
FROM
    kvs JOIN weights USING (key)
GROUP BY kvs.player_id;
Run Code Online (Sandbox Code Playgroud)

这是查询计划:

explain analyze select * from weighted_stats where player_id=76561197960269296

GroupAggregate  (cost=53645.35..299471.72 rows=1 …
Run Code Online (Sandbox Code Playgroud)

postgresql cte view

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

跨同一数据库内的多个架构选择权限

客户要求我实施一些用于报告目的的视图,这些视图将通过 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)

表/视图的所有者如下:

  • 瞳孔.Table1 - 所有者瞳孔
  • Provider.Table2 - 所有者提供者
  • Security.Table3 - 所有者安全
  • vTestPermissions - 所有者 dbo

当我从视图中选择时,出现错误:

对象“table3”、数据库“TEST”、架构“Security”的 SELECT 权限被拒绝

我曾尝试在SELECT有和没有GRANT模式和表选项的情况下授予权限,但这使用户可以使用基础表。

对此的任何帮助将不胜感激。

sql-server permissions sql-server-2008-r2 view owner

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

在视图和存储过程中查找和替换数据库名称

我有点窘迫。少数几个数据库中有 1,000 多个视图和存储过程,这些数据库被硬编码以追踪另一个数据库。

在我的示例中,SQL Server 中的数据库名称是HOST_1LOYALTY_1。意见和程序正试图在和声明之后HOST_PRODLOYALTY_PROD中。有什么办法,我可以做一个全局查找和各方面的意见和程序,以替换替换用?FROMJOINPROD1

必须有一种比右键单击每个脚本、在新窗口中创建更改脚本、更改文本并按 F5 更简单的方法。即使我可以创建所有必要的更改并立即运行它们,那也行。

stored-procedures view sql-server-2012

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

获取视图中使用的函数列表

假设我有一个这样的函数:

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 个分析函数,它结合了来自不同来源的数据,并且有多个基于不同区域类的视图。 )

postgresql view functions dependencies

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

在 Oracle 中编译视图

我目前正在 Oracle 中为我们的生产运行一个很长的脚本,但我们在数据中存在差异。

当我检查脚本正在使用的视图(我正在使用 Toad)时,我看到视图名称旁边有一个 X 标记,然后我看到了一个编译它的选项。

我想知道在视图中编译是否意味着什么?视图是否未更新从而导致数据出现差异?

oracle view

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

是否有用于查看查看访问计数的 DMV?

我在一次演示中看到过一次,当时有人展示了一个查询来计算视图在 SQL 服务器中查询的次数。我不记得它是来自 DMV 还是其他一些统计数据的组合,但我清楚地记得当他们运行一个从视图中选择的查询时,它会显示计数增加一。我记得关于演示文稿的另一个有趣的事实是从 CTE 中选择将计数增加了两个,因为 SQL Server 必须创建一个“临时视图”,然后从中进行选择。

有谁知道如何证明这一点?

sql-server view dmv

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

通过查询查看视图定义需要什么权限?

我对我们的数据库拥有完全的管理员权限,因此可以查询和查看视图定义。但是,我想在 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 的第二个条目被添加到配置表中。

只读用户权限

sql-server ssms view sql-server-2016

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

如何生成 NULL 字段的输出(从多个列+表组合)?

我管理一个应用程序,该应用程序有多个用户通过 Web 前端将数据输入到 MSSQL 数据库中。每个单独的“记录”在多个表中可以有大约 100 个数据库列(有时在同一个表中有多个行)。编写 SQL 查询将在每个“记录”中输出 1 行,其中包含我们用于报告目的所需的所有列,这是相对简单的,例如:

Assessor  Date    Length  Colour  Weight
Steve     2/4/17  23.4    NULL    45
John      4/4/17  NULL    Blue    NULL
Brenda    4/4/17  NULL    NULL    NULL
Run Code Online (Sandbox Code Playgroud)

我想生成一个简单的输出,列出未记录数据的所有内容,即保持 NULL 的字段。例如:

Assessor  Date    Field
Steve     2/4/17  Colour
John      4/4/17  Length
John      4/4/17  Weight
Brenda    4/4/17  Length
Brenda    4/4/17  Length
Brenda    4/4/17  Colour
Brenda    4/4/17  Weight
Run Code Online (Sandbox Code Playgroud)

目前我已经尝试了以下方面的内容:

 select 
  assessor
  ,date
  ,Field    =  'Length'
 from
 dbo.table1
 where [Length] is NULL
UNION ALL
 select 
  assessor
  ,date
  ,Field    =  'Colour'
 from …
Run Code Online (Sandbox Code Playgroud)

sql-server view unpivot

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

如何通过视图获取 SEEK 访问转换后的 ID

假设我有一张桌子:

-- just for test purposes
CREATE TABLE SomeTable (
    ID INT IDENTITY(1,1) NOT NULL CONSTRAINT PK__SomeTable__ID PRIMARY KEY CLUSTERED
    ,SomeColumn1 NVARCHAR(50) NULL
    ,SomeColumn2 DATETIME NULL
    );

-- populate table with some rows
INSERT INTO SomeTable DEFAULT VALUES;
GO 1000
Run Code Online (Sandbox Code Playgroud)

因为第三方应用程序有一个视图将表的 ID 列从INTNVARCHAR(假设它是必须的):

CREATE VIEW ThirdPartyView AS
SELECT
    ID = CAST(ID as NVARCHAR(10))
    ,C1 = SomeColumn1
    ,C2 = SomeColumn2
FROM SomeTable;
Run Code Online (Sandbox Code Playgroud)

然后当我通过 ID 访问一行时,我得到一个 INDEX SCAN:

SELECT *
FROM ThirdPartyView
WHERE ID = N'1'
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我明白为什么。

我该怎么做才能在查询之外获得 …

performance sql-server execution-plan view type-conversion query-performance

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

SQL Server 索引视图和 TOP

我正在努力说服查询计划按照我认为应该的方式行事。在查询索引视图时添加 TOP 子句会导致次优计划,我希望在排序方面得到一些帮助。

环境

  • SQL Server 2019
  • StackOverflow2013 数据库(50GB 版本),Compat Mode 150(问题不是这个版本特有的)

设置:

首先,我创建了一个视图来回报每个人的高声誉:

CREATE VIEW vwHighReputation
WITH SCHEMABINDING
AS
SELECT  [Id],
        [DisplayName],
        [Reputation]
FROM    [dbo].[Users]
WHERE   [Reputation] > 10000
Run Code Online (Sandbox Code Playgroud)

接下来,由于我将按显示名称进行搜索,因此我在视图上创建了几个索引:

CREATE UNIQUE CLUSTERED INDEX IX_Users_Id ON [dbo].[vwHighReputation]([Id])
GO
CREATE NONCLUSTERED INDEX IX_Users_DisplayName ON [dbo].[vwHighReputation]([DisplayName]) INCLUDE (Reputation)
GO
Run Code Online (Sandbox Code Playgroud)

如果我通过视图查询,我可以看到我的非聚集索引正在被使用:

SELECT  *
FROM    [dbo].[vwHighReputation]
WHERE   [DisplayName] LIKE 'J%'
Run Code Online (Sandbox Code Playgroud)

计划:(https://www.brentozar.com/pastetheplan/?id=Sy2EoJaiv

到现在为止还挺好。我什至可以使用我的视图作为带有 OUTER APPLY 的更复杂查询的一部分,并且我仍然只对索引进行了 63 次读取(这显然是一个人为的示例,但有助于说明我将要解决的问题) ):

SELECT  [U].[Id],
        [A].[Reputation],
        [A].[DisplayName]
FROM    [dbo].[Users] AS [U]
        OUTER APPLY (
                        SELECT  * …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan view query-performance

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