我使用的是 SQL Server 2014 标准版。我正在开发一个供应链 DW,我目前正在构建一个登陆模式,该模式将用于登陆来自源系统的数据,然后将该数据移动到暂存模式以开始 ETL 过程。在将那几天的数据移入 Staging 后,我正在截断登录表。我在触发器中使用 Hashbytes,它将向每个记录添加一个哈希值,以便在向上游移动时进行比较。
CREATE TRIGGER trgr_hashval_mara ON land.mara
FOR UPDATE, INSERT AS
UPDATE land.mara
SET HashVal = (SELECT hashbytes('md5', (SELECT material, MaterialDesc FOR xml raw)));
Run Code Online (Sandbox Code Playgroud)
我可以整天创建这些,但我无法使用如下的常规语法删除它们。执行 DROP 语句会产生错误。
DROP TRIGGER trgr_hashval_mara;
Run Code Online (Sandbox Code Playgroud)
"Can't find trigger or you don't have permission to drop trigger."
但是,以下语句返回了我创建的触发器列表。
select * from ibscm01.sys.triggers
Run Code Online (Sandbox Code Playgroud)
我似乎也无法在 DB 树中找到它们。我看到了 Database Triggers 子项,但没有显示项目/触发器。我正在使用 Toad for SQL server 6.7,它应该是当前版本。还使用带有 AD 的 Windows 身份验证,并且我具有 dbo 权限。
谢谢,帕特
部分出于好奇,我想知道是否可以使用索引(物化)视图来加速对某个基表的计数查询。
查询类似于
SELECT COUNT(*)
FROM BaseTable
WHERE Slot = ?;
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个视图
CREATE VIEW IndexedView
WITH SCHEMABINDING AS
SELECT bt.Slot, COUNT_BIG(*) AS COUNT
FROM dbo.BaseTable bt
GROUP BY bt.Slot;
Run Code Online (Sandbox Code Playgroud)
有聚集索引
CREATE UNIQUE CLUSTERED INDEX IX_Main
ON IndexedView (Slot);
Run Code Online (Sandbox Code Playgroud)
这有效,我现在可以将原始查询编写为
SELECT COUNT
FROM IndexedView
WHERE Slot = ?
Run Code Online (Sandbox Code Playgroud)
并更快地获得所需的结果。
唉,这对我来说没什么用,因为我的查询通常不是手工制作的。我真的需要通过使用索引视图作为某种索引来使原始查询变得更快BaseTable- 我想我在某处读到这可能在某些情况下发生,但根据我的测试,而不是在这个测试中。
所以我的问题是:
编辑:关于重复的问题 - 我对 GROUP BY 和索引视图的聚合方面更感兴趣。答案帮助我找到了我犯的一个愚蠢的错误,现在它也对我有用。
JOYOUS ADDENDUM:现在我让它工作了,我成功地测试了它甚至可以在查询包含左联接的情况下工作,而在这些情况下,左联接实际上可以被优化掉(即 on-clause 涵盖了一个唯一索引在连接表中)。
这真的很棒,因为这意味着即使在带有左连接的查询的情况下,也可以以这样一种方式设计模式,即快速获取所有内容或特定分组的总行数。
SQL Server 中所有非系统数据库的数据库(如master、model、tempdb)是否都有一个术语?
我和我的团队有一个问题,我们需要能够识别阻塞其他进程并杀死它们的进程。有大量脚本可免费用于执行这些操作。我们尝试了各种方法并仔细检查了代码。(如果您是发布了这些查询之一的人,谢谢!)
在我进一步讨论之前,让我告诉您这是针对我们无法修改的供应商应用程序。供应商也不愿意花时间找出进程被阻塞的原因。此时我们唯一的选择是终止长时间运行的进程(如供应商支持所建议的那样)。在终止这些进程之前,我们确实检查了正在运行的查询,但在 99.9% 的情况下,它显示为FETCH API_CURSOR00000000000A7E1F,这告诉我们什么都没有。
到目前为止,这一直是一个手动过程。现在,我们希望自动杀死这些长时间运行的阻塞进程,而不是有人手动杀死它们。
我们想在将它投入生产之前测试这个脚本。我们需要一些帮助来创建一个有意创建阻塞进程的脚本。我们已经尝试在 TEST 环境中使用此应用程序,但不幸的是,我们没有成功复制阻塞进程。
提前感谢你的帮助!
我发现在我公司的某个 SQL 服务器的实例上,sa 实际上是所有会话使用的唯一登录名。SPID# 扩展到 130。您认为这有什么影响?尽管当然安全,但有什么缺点吗?很欣赏你在这方面的投入。谢谢。
考虑 Microsoft SQL Server 2012 中的以下代码:
INSERT INTO [dbo].Production
SELECT [field1]
,[field2]
,cast([datefield] as datetime)
FROM [RAW].Staging
Run Code Online (Sandbox Code Playgroud)
临时表加载了来自 CSV 文件的数据。因此,在某些情况下,我们最终会得到空字段,而不是 NULL 字段。因此,日期字段在插入生产表时会转换为 1900-01-01 日期。
我想知道在上面的插入代码中是否有什么我可以做的,以确保当来自临时表的字段为 NULL 或为空时,日期字段设置为 NULL。
我正在尝试在 2016 年执行一个名为 sp_execute_external_script 的新存储过程。我首先需要按如下方式启用外部脚本:
sp_configure 'external scripts enabled', 1;
Run Code Online (Sandbox Code Playgroud)
执行此操作后,我看到此消息:
Configuration option 'external scripts enabled' changed from 1 to 1. Run the RECONFIGURE statement to install.
Run Code Online (Sandbox Code Playgroud)
然后我执行RECONFIGURE并看到一条消息说,"Command(s) completed successfully"。
然后我尝试执行以下操作,以查看 R 是否正常工作:
exec sp_execute_external_script @language =N'R',
@script=N'OutputDataSet<-InputDataSet',
@input_data_1 =N'select 1 as hello'
with result sets (([hello] int not null));
go
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我看到以下错误:
Msg 39023, Level 16, State 1, Procedure sp_execute_external_script, Line 1 [Batch Start Line 3]
'sp_execute_external_script' is disabled on this instance of SQL Server. Use …Run Code Online (Sandbox Code Playgroud) 我发现我最近花了很多时间检查由索引调整顾问或其他一些自动化过程生成的建议索引列表。
回到那天(大约 2005 年),我发现这些建议相当糟糕,因为它们似乎针对一个特定的查询,而且通常只是一个覆盖索引,该索引包含表中的每一列,无论这些列是否已经是索引.
随着时间的推移,我觉得指数调优顾问有了很大的进步,但我仍然有一种内在的不信任感,仍然想花时间对每一个进行审查。
我尽量不悲观,但是当供应商(Microsoft)建议添加多个重叠覆盖索引以提高性能时,这很困难,尤其是当我们为存储空间付费时。我也不想不必要地浪费自己的时间。我宁愿修复写得不好的查询。
我今天遇到了一个奇怪的现象。我运行以下查询以查找除 BROKER_RECEIVE_WAITFOR 以外的等待的所有请求
select * from sys.dm_exec_requests where session_id > 55
and wait_type not like ('BROKER_RECEIVE_WAITFOR')
Run Code Online (Sandbox Code Playgroud)
查询运行良好,但没有列出任何没有等待的请求,即 wait_type 为NULL(此时有相当多的正在运行的查询没有任何等待)。
为什么会发生这种情况,是不是应该列出所有具有 wait_type 的记录,而不是像“BROKER_RECEIVE_WAITFOR”这样的记录,包括空值?
我正在运行 SQL Server 2008R2 SP3。
我有一个包含 OrderId 的表订单(WarehouseId 和 OrderId 是复合主键)。
WarehouseId | OrderId | ItemId | OrderDate
-------------------------------------------
1 | 1 | 1 | 2016-08-01
1 | 2 | 2 | 2016-08-02
1 | 3 | 5 | 2016-08-10
2 | 1 | 1 | 2016-08-05
3 | 1 | 6 | 2016-08-06
Run Code Online (Sandbox Code Playgroud)
(表格已简化,仅显示必填字段)
如何有效地选择特定仓库的最后一个订单?我目前这样做:
SELECT TOP 1 * FROM tblOrder WHERE WarehouseId = 1 ORDER BY OrderId DESC
Run Code Online (Sandbox Code Playgroud)
我担心的是,当我有一个特定仓库的一百万(或更多)订单时,通过排序和选择第一条记录,它会太慢(我认为?)。从我目前得到的建议来看,这不是一项昂贵的操作,因此应该没问题。那正确吗?
或者,有没有更有效的方法来选择最后一个订单记录?