因为我看到可以指定像 sysdate + 1 这样的表达式,所以这里是我的问题:
是否可以在 oracle 中为物化视图指定刷新的确切时间?
是否有可能一切都从凌晨 2 点开始,而没有人使用我的应用程序中的数据库?
在大学期间,我们一直在想不要通过视图更新表,当我进入工作场所时,我们又被告知不要通过视图更新数据库。
在哪里/是否对执行此操作有显着的性能影响?或者这更像是高级开发人员/DBA 告诉初级人员不要这样做的情况,因为他们可能会无意中因不正确的连接而造成严重破坏。
编辑
我使用的是 MSSQL 2000-2008(取决于客户的具体情况)
我有一个大表(数千万到数亿条记录),出于性能原因,我们将其拆分为活动表和存档表,使用直接字段映射,并每晚运行存档过程。
在我们代码的几个地方,我们需要运行结合活动表和存档表的查询,几乎总是由一个或多个字段过滤(我们显然在两个表中都放置了索引)。为方便起见,有一个这样的视图是有意义的:
create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive
Run Code Online (Sandbox Code Playgroud)
但是如果我运行一个查询
select * from vMyTable_Combined where IndexedField = @val
Run Code Online (Sandbox Code Playgroud)
它将在过滤之前对Active 和 Store 中的所有内容进行联合@val,这会降低性能。
@val在创建联合之前,是否有任何巧妙的方法可以让联合的两个子查询查看每个过滤器?
或者,您可能会建议使用其他一些方法来实现我的目标,即一种简单有效的方法来获取由索引字段过滤的联合记录集?
编辑:这是执行计划(您可以在这里看到真实的表名):

奇怪的是,活动表实际上使用了正确的索引(加上 RID 查找?)但存档表正在执行表扫描!
问题/问题:获取错误: [Err] 1615 - Prepared statement needs to be re-prepared
我有一个存储过程,其中包含一个准备好的语句和一个视图
DROP PROCEDURE IF EXISTS `sampleProc`;
DELIMITER ;;
CREATE DEFINER = `root`@`localhost` PROCEDURE `sampleProc`()
BEGIN
SET @select = "SELECT * FROM `viewSample` ";
PREPARE stmt FROM @select ;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt ;
END ;;
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
以下调用有时会出错 CALL sampleProc();
可能的解决方法/解决方案
看来最好的解决方案是增加 table_definition_cache 的值,但似乎不起作用,因为它已经从 1400(默认)增加到 16384。 table_open_cache 也增加到 32162
Variable_name Value
table_definition_cache 16384
table_open_cache 32162
table_open_cache_instances 4
Run Code Online (Sandbox Code Playgroud) 当使用mysqldump备份MySQL中,我得到了下面的错误。
mysqldump --all-databases --routines >> all.sql
mysqldump: Couldn't execute 'show table status like 'hdkien'': SELECT command denied to user 'tungbt'@'192.168.12.197' for column 'id' in table 'hdcn_hd' (1143)
Run Code Online (Sandbox Code Playgroud)
hdkien 是一种观点
CREATE ALGORITHM=UNDEFINED DEFINER=`tungbt`@`192.168.12.197` SQL SECURITY DEFINER VIEW `hdcn`.`hdkien` AS (...striped...)
Run Code Online (Sandbox Code Playgroud)
用户tungbt@192.168.12.197已经有权在表上进行选择hdcn_hd,我可以hdkien毫无问题地从视图中进行选择。
mysql> select * from hdkien limit 1;
+------+-----------+
| id | shd |
+------+-----------+
| 876 | ADFADFA1 |
+------+-----------+
Run Code Online (Sandbox Code Playgroud)
更多信息:
mysql-community-server-5.5.37-4.el6.x86_64为什么我在运行时出现错误,我该mysqldump如何解决?
更新 1 …
我有一个数据仓库,里面有很多用 SSMS 视图设计器内置的视图。查看语法,FROM我无法理解这些子句,因为ON语句没有紧跟在相关的JOIN <table>. 通常RIGHT连接查询的主表并在FROM. 所以我有这样的情况:
SELECT *
FROM tableC
LEFT JOIN TableB
RIGHT JOIN TableA
ON TableA.ID = TableB.ID
ON TableB.TypeID = TableC.TypeID
WHERE ....
Run Code Online (Sandbox Code Playgroud)
将各种JOINandON子句的顺序更改为我手写的内容会以意想不到的方式改变结果。似乎大多数 SQL 美化者都对这种丑陋的语法感到窒息,而 SSMS 则不然。我一直无法找到押韵、原因或文档来帮助解开正在发生的事情。
请提供任何建议或链接以找出和修复视图设计器查询?
(编辑:请参阅结尾以获得更简单的示例)
我在一个名为“cases”(135k 行,29 列)的表中搜索。此表中的某些行具有父子关系类型(不同类型),这意味着对于这些记录,必须混合使用父/子字段来过滤和显示。
我已经确定了四种不同的父子关系并为它们创建了视图:
这些视图的结果不重叠,共同覆盖了表格的 100%。
当我选择所有这些的联合并分别过滤每个视图时,查询需要大约 9 毫秒。选择所有视图的联合并过滤其结果大约需要 500 毫秒。
我还在没有视图的情况下对此进行了测试,内联了它们包含的查询,但没有产生可衡量的改进。
这是快速查询(解释):
SELECT c.*
FROM caselist_no_specials c
JOIN case_clients cacl ON cacl.case_id = c.main_id
WHERE cacl.client_id = 12046
UNION ALL
SELECT c.*
FROM caselist_disputes_with_ipr c
JOIN case_clients cacl ON cacl.case_id = c.main_id
WHERE cacl.client_id = 12046
UNION ALL
SELECT c.*
FROM caselist_mark_children c
JOIN case_clients cacl ON cacl.case_id = c.main_id
WHERE cacl.client_id …Run Code Online (Sandbox Code Playgroud) 我的任务是为客户创建一个视图。具体来说,它必须在一个视图中。但是,我不确定如何在视图中进行一些数学运算。我不知道这是否可能。但话又说回来,我的心很虚弱。
我使用的是 SQL Server 2008R2,因此高级OVER()功能不起作用。
假设一个人有 400 美元可以花。他们可以花更多的钱,但前 400 美元是免费的。报告的一列将显示该人在某事上花费的金额,另一列将显示该人需要自掏腰包支付的总金额。
因此,对于此人的报告中的第一条记录,一列将显示他们已花费的金额,例如 50 美元,然后第二列将显示 0 美元。在幕后,他们还有 350 美元可以花。
下一个记录是该人花费 300 美元。第二列仍将显示 0 美元,而在幕后,最初的 400 美元现在是 50 美元。
该人的第三项记录显示他们花了 75 美元,但他们从最初的 400 美元中只剩下 50 美元。第二列现在应该有 25 美元的价值。他们已经用尽了最初的 400 美元,现在正在花自己的钱。
第四条记录显示他们花了 40 美元,所以现在第二列将显示 65 美元。等等...
我已经简要阅读了 CTE 和表值函数等,但是是否可以将它们以任意组合使用以提供上述所需的行为?
以下是结构和所需结果的一些示例代码
CREATE TABLE Payroll (
PersonID int,
PlanCode varchar(10),
Deduction int NULL
)
GO
INSERT INTO Payroll (PersonID, PlanCode, Deduction)
VALUES (1, 'Medical', 200)
,(1, 'Dental', 250)
,(1, …Run Code Online (Sandbox Code Playgroud) 我们有一个针对单项查询优化的视图(200 毫秒无并行性):
select *
from OptimizedForSingleObjectIdView e2i
where ObjectId = 3374700
Run Code Online (Sandbox Code Playgroud)
它也适用于一小组静态 ID(~5)。
select *
from OptimizedForSingleObjectIdView e2i
where ObjectId in (3374700, 3374710, 3374720, 3374730, 3374740);
Run Code Online (Sandbox Code Playgroud)
但是,如果对象来自外部源,那么它会生成一个缓慢的计划。执行计划显示视图部分的执行分支忽略了 ObjectId 上的谓词,而在原始情况下,它使用它们来执行索引查找。
select v.*
from
(
select top 1 ObjectId from Objects
where ObjectId % 10 = 0
order by ObjectId
) o
join OptimizedForSingleObjectIdView v -- (also tried inner loop join)
on v.ObjectId = o.ObjectId;
Run Code Online (Sandbox Code Playgroud)
我们不希望投资于“双重”优化非奇异情况的视图。相反,我们“寻求”的解决方案是对每个对象重复调用一次视图,而无需求助于 SP。
大多数情况下,以下解决方案会逐行调用视图。但是这次不是,甚至不是只有 1 个对象:
select v.*
from
(
select top 1 ObjectId
from Objects …Run Code Online (Sandbox Code Playgroud) 我正在通过复制的 SQL Server 数据库访问和创建来自供应商的报告。他们做了一些我一直试图解决的绝对疯狂的事情,但这个问题占据了上风。
他们有一个包含许多标准列的表。但是这个表还有一个叫做“数据”的列。该列是传统的“文本”数据类型,它包含一个巨大的(数百个)键/值对列表。每对由 CRLF 分隔,键和值由等号分隔。例子:
select myTable.[data] from myTable where tblKey = 123
Run Code Online (Sandbox Code Playgroud)
结果:
Key 1=Value 1
Key 2=Value 2
Key 3=Value 3
...
Key 500=Value 500
Run Code Online (Sandbox Code Playgroud)
我正在尝试确定将该列分解为可用数据表的最有效方法。最终目标是能够以将表键以及指定键/值作为列/字段返回的方式查询表:
tblKey | [Key 1] | [Key 3] | [Key 243]
-------|---------|---------|-----------
123 Value 1 Value 3 Value 243
124 Value 1 Value 3 Value 243
125 Value 1 Value 3 Value 243
Run Code Online (Sandbox Code Playgroud)
有没有办法将该列塑造成一个视图?我无法想象一个函数会特别有效,但我确信我可以使用 string_split 或类似的东西来解析事情。有没有人以前遇到过这种暴行并找到了一种将其操纵成可用数据的好方法?
编辑以添加dbfiddle示例数据。
数据是从供应商的来源复制的,因此我无法创建新表。我可以创建视图、过程和函数。这就是我正在寻找一种体面的方式来完成的建议。
view ×10
sql-server ×5
mysql ×2
t-sql ×2
union ×2
backup ×1
cross-apply ×1
dynamic-sql ×1
index ×1
join ×1
mysql-5.6 ×1
mysqldump ×1
oracle ×1
performance ×1
postgresql ×1
ssms ×1
syntax ×1