我试图从我的数据库中获取用户统计信息的加权总和,并且我一次只会查询一个或两个用户的表,所以我将它写为一个视图。
由于它是一个视图,我假装计算表中每一行的总和,然后我希望优化器能够意识到当我只要求一行并优化查询时。然而,我的查询计划非常庞大,并且在其最里面计算了 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) 客户要求我实施一些用于报告目的的视图,这些视图将通过 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模式和表选项的情况下授予权限,但这使用户可以使用基础表。
对此的任何帮助将不胜感激。
我有点窘迫。少数几个数据库中有 1,000 多个视图和存储过程,这些数据库被硬编码以追踪另一个数据库。
在我的示例中,SQL Server 中的数据库名称是HOST_1和LOYALTY_1。意见和程序正试图在和声明之后HOST_PROD和LOYALTY_PROD中。有什么办法,我可以做一个全局查找和各方面的意见和程序,以替换替换用?FROMJOINPROD1
必须有一种比右键单击每个脚本、在新窗口中创建更改脚本、更改文本并按 F5 更简单的方法。即使我可以创建所有必要的更改并立即运行它们,那也行。
假设我有一个这样的函数:
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 的第二个条目被添加到配置表中。
我管理一个应用程序,该应用程序有多个用户通过 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) 假设我有一张桌子:
-- 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 列从INT到NVARCHAR(假设它是必须的):
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
我正在努力说服查询计划按照我认为应该的方式行事。在查询索引视图时添加 TOP 子句会导致次优计划,我希望在排序方面得到一些帮助。
环境
设置:
首先,我创建了一个视图来回报每个人的高声誉:
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) view ×10
sql-server ×6
postgresql ×2
cte ×1
dependencies ×1
dmv ×1
functions ×1
oracle ×1
owner ×1
performance ×1
permissions ×1
ssms ×1
unpivot ×1