标签: view

如何获取mysql视图定义?

Show create view viewName不显示正确格式的文本。如何获得格式正确的 SQL?

例如,我创建了一个像 的视图create view v1 as select * from mysql.uer,但它返回如下:

CREATE ALGORITHM=UNDEFINED DEFINER=root@localhost SQL SECURITY DEFINER 
VIEW v1 AS 
    select 
        mysql.user.Host AS Host,
        mysql.user.User AS User,
        mysql.user.Password AS Password,
        mysql.user.Select_priv AS Select_priv,
        ... ..., 
        mysql.user.Grant_priv AS Grant_priv,
        mysql.user.References_priv AS References_priv,
        mysql.user.Index_priv AS Index_priv,
        mysql.user.Alter_priv AS Alter_priv
    from mysql.user
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到我的原始定义?

mysql view

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

为什么只能删除当前数据库中的一个 SQL Server 视图?

刚刚注意到这一点,并且很难想出一个技术原因。

可以使用三个部分名称删除表,但视图仅限于两个部分名称。

这背后的原因是什么?

sql-server view

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

av$ view 和它的 dba_ 等价物有什么区别?

v$视图与其dba_等价物之间的一般区别是什么?举个例子来说,v$tablespacedba_tablespaces

oracle metadata view

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

视图是否需要自己的外键约束?

免责声明:我是程序员,不是 DBA,所以请耐心等待...

我有一个视图,用于将 2 个实体映射在一起。我必须在几个不同的表之间进行连接才能得到:

CREATE OR REPLACE VIEW V_SCREENING_GROUP_SITES AS (
SELECT SG.SCREENING_GROUP_ID, V.SITE_ID
FROM SCREENING_GROUP SG, VISIT V, VISIT_DATE VD
WHERE VD.VISIT_ID = V.VISIT_ID 
AND V.SCREENING_GROUP_ID = SG.SCREENING_GROUP_ID);
Run Code Online (Sandbox Code Playgroud)

以上只是上下文,不要太担心。我需要知道的是如何使我的新 V_SCREENING_GROUP_SITES 视图(SCREENING_GROUP_ID 和 SITE_ID)中的字段作为 SCREENING_GROUP 和 SITE 表的外键。或者它甚至重要吗?

如果它是一张桌子,我会这样做:

ALTER TABLE V_SCREENING_GROUP_SITES
ADD CONSTRAINT FK_SCREENING_GROUP_ID
FOREIGN KEY (SCREENING_GROUP_ID)
REFERENCES SCREENING_GROUP.SCREENING_GROUP_ID;
...
Run Code Online (Sandbox Code Playgroud)

但由于这是一个显然行不通的观点。我找不到适用于设置 FK 的 ALTER VIEW 语法。我该怎么办?

(这是一个 MySQL 数据库)

mysql foreign-key view

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

从带有外部参数化“where”子句的视图中调用时,窗口函数会导致糟糕的执行计划

很久以前我遇到过这个问题,我找到了一个适合我的解决方法并忘记了它。

但是现在在 SO 上有这个问题,所以我愿意提出这个问题。

有一个视图以非常简单的方式(订单 + 订单行)连接几个表。

在没有where子句的情况下查询时,视图返回几百万行。
然而,从来没有人这样称呼它。通常的查询是

select * from that_nasty_view where order_number = 123456;
Run Code Online (Sandbox Code Playgroud)

这将返回 5m 中的大约 10 条记录。

一件重要的事情:视图包含一个窗口函数,rank(),它由始终查询视图所使用的字段精确分区:

rank() over (partition by order_number order by detail_line_number)
Run Code Online (Sandbox Code Playgroud)

现在,如果使用查询字符串中的文字参数查询此视图,完全如上所示,它会立即返回行。执行计划很好:

  • 使用索引对两个表进行索引查找order_number(返回 10 行)。
  • 在返回的微小结果上计算窗口。
  • 选择。

然而,当以参数化的方式调用视图时,事情变得很糟糕:

  • Index scan在所有表上忽略索引。返回 5m 行。
  • 巨大的加入。
  • 计算所有partitions 的窗口(大约 500k 个窗口)。
  • Filter 从 5m 中取出 10 行。
  • 选择

在涉及参数的所有情况下都会发生这种情况。它可以是 SSMS:

declare @order_number int = 123456;
select * from that_nasty_view where order_number = @order_number; …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 view window-functions

10
推荐指数
2
解决办法
1926
查看次数

Oracle:如何查询分层表?

背景

这是为了构建我们将用于报告的一些视图。

我有一个位置表,关键字段是 "location" 和 "parent"

这两个字段创建的结构在级别上是沿着公司名称 --> 校园名称 --> 建筑物名称 --> 楼层名称 --> 房间名称。在这种情况下,公司名称保持不变,校园名称保持不变。

位置的结构通常如下所示:

                                 +-----------+
                                 | Org. Name |
                                 +-----+-----+
                                       |
                                 +-----v-----+
           +--------------------+|Campus Name|+---+--+-------------+
           |                     +--+--------+    |                |
           |                        |             |                |
           |                        |             |                |
        +--+-----+           +------+-+        +--+----+       +---+---+
    +--+| BLDG-01|+--+       | BLDG-02|        |BLDG-03|       |Grounds|
    |   +--------+   |       +--------+        +-------+       +-------+
  +-+------+   +-----+--+
  |Floor-01|   |Basement+-------+
  +-+------+   +--------+       |
    |                           |
    |                           |
    | +----------+      +-------+--+
    +-+Room 1-001|      |Room B-002|
      +----------+      +----------+
Run Code Online (Sandbox Code Playgroud)

每个位置都链接回其父位置,最终是组织名称。目前,只有一个组织和一个校区。

目标

  • 我希望能够在“建筑物”级别查询任何给定位置下的所有位置。这样我就可以返回诸如在给定建筑物内的任何位置执行了多少工单之类的信息。 …

oracle query hierarchy view

10
推荐指数
2
解决办法
7335
查看次数

在数据库项目中使用带有 OPENQUERY 的链接服务器

我有一个运行数据库的 SQL Server 2008,我想放入 TFS。因此,我使用了导入数据库的 Visual Studio 2013 数据库项目。修复了一堆错误后,我只剩下一个错误:

在一个视图中,开发人员用于OPENQUERY访问链接服务器。因此,我导入了一个包含正确数据库的 DACPAC,并Add Database Reference使用以下参考选项将其添加到项目中。

数据库参考设置

初始脚本版本

这是原始视图创建的较短版本:

CREATE VIEW dbo.vwStatus
AS
SELECT     StatusID, StatusName
FROM       OPENQUERY(LinkedServer, 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1
Run Code Online (Sandbox Code Playgroud)

这导致以下错误:

错误 136 SQL71501:视图:[dbo].[vwStatus] 具有对对象 [LinkedServer] 的未解析引用。

第一次尝试

所以我尝试插入服务器名称变量

FROM       OPENQUERY($(LinkedServer), 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1
Run Code Online (Sandbox Code Playgroud)

这导致

错误 176 SQL46010:$(LinkedServer) 附近的语法不正确。

进一步的尝试

我稍微摆弄了一下并尝试了以下操作(启用和不启用带引号的标识符):

FROM       OPENQUERY("$(LinkedServer)", 'SELECT * FROM [DB].[dbo].tbStatus') AS 
FROM       OPENQUERY([$(LinkedServer)], 'SELECT * FROM [DB].[dbo].tbStatus') AS 
FROM       OPENQUERY([LinkedServer], 'SELECT * FROM [DB].[dbo].tbStatus') AS 
FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 visual-studio view linked-server ssdt

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

视图是否利用表索引

我有一个带有聚集索引和 2 个非聚集索引的表。现在,在我看来,我正在从我的表中选择所有内容

create view dbo.MyView
as 
Select * from MyTable
Run Code Online (Sandbox Code Playgroud)

现在,当我在查询中使用这个视图时,我可以假设这个视图将利用在表上创建的索引。(即与Select * from MyTable 的工作方式相同)?或者我应该使用索引视图

补充问题

如果视图可以利用表索引,那么使用SELECT * FROM MyView Where SomeColumn = @someValue可能会严重影响性能(如果视图有大量数据,那么它在没有索引时会表现得像堆)。如何克服这个问题?除了使用 NOEXPAND(因为我使用的是企业版)

index sql-server view materialized-view

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

如何检查/知道最高运行查询

我想收集数据库中运行次数最多的查询的统计信息。

为此,我需要知道如何跟踪查询,以便我可以创建视图或物化视图来缓存最高运行查询的结果,因为我有一个大数据库。

postgresql view materialized-view

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

视图上的 SELECT COUNT(*) 比同一视图上的 SELECT * 慢几个数量级

风景

CREATE VIEW [dbo].[vProductList]
WITH SCHEMABINDING
AS 

SELECT
     p.[Id]
    ,p.[Name]
    ,price.[Value] as CalculatedPrice
    ,orders.[Value] as OrdersWithThisProduct
FROM 
    products as p 
    INNER JOIN productMetadata as price ON p.Id = price.ProductId AND price.MetaId = 1
    INNER JOIN productMetadata as orders ON p.Id = orders.ProductId AND orders.MetaId = 2
Run Code Online (Sandbox Code Playgroud)

为简单起见,假设productMetadataProductId, MetaId, Value有~87m 行,products表中有大约 400k 行。

针对此视图的一般查询完美地工作:

SELECT * FROM vProductList WHERE CalculatedPrice > 500
Run Code Online (Sandbox Code Playgroud)

查询结果在 2-4 秒内(通过 vpn 和远程,所以我很擅长)。

将上述更改为计数同样快:

SELECT COUNT(*) from vProductList WHERE …
Run Code Online (Sandbox Code Playgroud)

performance view azure-sql-database query-performance

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