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)
我怎样才能得到我的原始定义?
刚刚注意到这一点,并且很难想出一个技术原因。
可以使用三个部分名称删除表,但视图仅限于两个部分名称。
这背后的原因是什么?
v$视图与其dba_等价物之间的一般区别是什么?举个例子来说,v$tablespace和dba_tablespaces。
免责声明:我是程序员,不是 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 数据库)
很久以前我遇到过这个问题,我找到了一个适合我的解决方法并忘记了它。
但是现在在 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) 这是为了构建我们将用于报告的一些视图。
我有一个位置表,关键字段是 "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)
每个位置都链接回其父位置,最终是组织名称。目前,只有一个组织和一个校区。
我有一个运行数据库的 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) 我有一个带有聚集索引和 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(因为我使用的是企业版)
我想收集数据库中运行次数最多的查询的统计信息。
为此,我需要知道如何跟踪查询,以便我可以创建视图或物化视图来缓存最高运行查询的结果,因为我有一个大数据库。
风景
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)
为简单起见,假设productMetadata列ProductId, 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) view ×10
mysql ×2
oracle ×2
sql-server ×2
foreign-key ×1
hierarchy ×1
index ×1
metadata ×1
performance ×1
postgresql ×1
query ×1
ssdt ×1