- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数据库触发器,而不是运行一个存储过程。
因此,每次将新数据插入表中时,都会运行此触发器。
这是存储过程查询:
已编辑:新查询
declare @transaction_type int
set @transaction_type = (select TransTyp from inserted)
declare @transaction_ctr bigint
set @transaction_ctr = (select TransCtr from inserted)
declare @transaction_no nvarchar(15)
set @transaction_no = (select TransNum from inserted)
declare @transaction_date datetime
set @transaction_date = (select TransDt from inserted)
declare @customer_code nvarchar(10)
set @customer_code = (select CustCode from inserted)
declare @contact nvarchar(15)
set @contact = (select CellNum from inserted)
declare @transaction_info nvarchar(130)
set @transaction_info = (select TransInfo from inserted)
declare @date_received datetime
set @date_received = (select DtRcv from inserted)
declare @is_active int
set @is_active= (select IsActive
from BigESentData.dbo.tbl_sentRegistration
where CellNum = @contact)
declare @value nvarchar(130)
declare @pos int
declare @len int
if @is_active= 0 OR @is_active is null
begin
delete from BigESentData.dbo.tbl_sentTransaction where TransCtr = @transaction_ctr
end
else
begin
--exec parseSentData @transType
/** Inventory */
if @transaction_type = 3
begin
if not exists(select TransCtr from BigEMerchandiser.dbo.tbl_Inventory_H where TransCtr = @transaction_ctr)
begin
insert into BigEMerchandiser.dbo.tbl_Inventory_H
Values(@transaction_ctr,@customer_code, @date_received, @contact)
set @pos = 0
set @len = 0
while charindex('-', @transaction_info, @pos + 1) > 0
begin
set @len = charindex('|', @transaction_info, @pos + 1) - @pos
set @value = substring(@transaction_info, @pos, @len)
insert into BigEMerchandiser.dbo.tbl_Inventory_D(TransCtr, Material, Qty, ExpDt)
select @transaction_ctr,
ltrim(rtrim(left(@value, charindex('-', @value) - 1))) as Material,
replace(substring(@value,charindex('-',@value),len(@value) - charindex('-', reverse(@value)) - charindex('-', @value) + 1),'-', '') as Qty,
reverse(left(reverse(@value),charindex('-', reverse(@value)) - 1))as ExpDt
set @pos = charindex('|', @transaction_info, @pos + @len) + 1
end
end
end
/** Delivery */
if @transaction_type = 2
begin
if not exists(select TransCtr from BigEMerchandiser.dbo.tbl_Delivery_H where TransCtr = @transaction_ctr)
begin
insert into BigEMerchandiser.dbo.tbl_Delivery_H
Values(@transaction_ctr, @transaction_no, @transaction_date, @customer_code, @date_received, @contact)
set @pos = 0
set @len = 0
while charindex('-', @transaction_info, @pos + 1) > 0
begin
set @len = charindex('|', @transaction_info, @pos + 1) - @pos
set @value = substring(@transaction_info, @pos, @len)
insert into BigEMerchandiser.dbo.tbl_Delivery_D(TransCtr, Material, Qty, ExpDt)
select @transaction_ctr,
ltrim(rtrim(left(@value, charindex('-', @value) - 1))) as Material,
replace(substring(@value,charindex('-',@value),len(@value) - charindex('-', reverse(@value)) - charindex('-', @value) + 1),'-', '') as Qty,
reverse(left(reverse(@value),charindex('-', reverse(@value)) - 1))as ExpDt
set @pos = charindex('|', @transaction_info, @pos + @len) + 1
end
end
end
/** ABIS */
if @transaction_type = 1
begin
if not exists(select TransCtr from BigEMerchandiser.dbo.tbl_Abis_H where TransCtr = @transaction_ctr)
begin
insert into BigEMerchandiser.dbo.tbl_Abis_H
Values(@transaction_ctr, @transaction_no, @customer_code, @date_received, @contact)
set @pos = 0
set @len = 0
while charindex('-', @transaction_info, @pos + 1) > 0
begin
set @len = charindex('|', @transaction_info, @pos + 1) - @pos
set @value = substring(@transaction_info, @pos, @len)
insert into BigEMerchandiser.dbo.tbl_Abis_D(TransCtr, Material, Qty, ExpDt)
select @transaction_ctr,
ltrim(rtrim(left(@value, charindex('-', @value) - 1))) as Material,
replace(substring(@value,charindex('-',@value),len(@value) - charindex('-', reverse(@value)) - charindex('-', @value) + 1),'-', '') as Qty,
reverse(left(reverse(@value),charindex('-', reverse(@value)) - 1))as ExpDt
set @pos = charindex('|', @transaction_info, @pos + @len) + 1
end
end
end
/** end of transaction */
end
让我告诉你一个它是如何运行的故事。数据来自 Android 应用程序。这是一款专为超市商家设计的应用程序。该应用程序将数据转换为 SMS 并将数据发送到 SQL 数据库。
现在,如果从应用程序发送的数据插入到数据库中,则会触发触发器,并运行上面的存储过程。
存储过程按以下顺序运行:
检查tbl_sentdata中所有不在tbltransactionheader中的记录,如果不在tbltransactionheader中,则将其插入那里。
检查tblsentdata中未进入tbltransactiondetail的所有记录,解析分隔数据,并将每条记录插入一行。
<tblsentdata - 来自应用程序的数据
tbltransactionheader - header 表
tbltransactiondetail - 明细表
这是来自应用程序的原始数据:
现在,正如您在屏幕截图中看到的,来自应用程序的数据已被分隔。所以我需要一一解析。(在上面的查询中,解析是从注释“/* Loop delimited data */”开始的)
现在,如果我手动运行存储过程,对于 TransTyp 3(inventory) 来说,需要很长时间。
根据我的猜测,上面的查询会一一检查 tblsentdata 中的所有数据。因此,如果我有 100、000 条记录,即使数据已经在事务表中,它每次都会检查它。
这是我的问题:
我的假设正确吗?如果触发器触发,则查询运行。然后发送另一条短信,触发器再次运行,即使第一个查询尚未完成。然后发送另一条短信,触发器再次运行。
上面的查询是执行此操作的最佳方法吗?有什么方法可以更快吗?我无法承担运行此查询所需的大量时间。
希望你能启发我,我是 SQL 查询的新手。或者至少指导我去哪里寻找。
希望我能很好地解释自己。我将不胜感激任何帮助和建议。谢谢。
更新:2018 年 11 月 4 日
感谢PSK。在他的帮助下,我能够解决我的问题并最大限度地减少查询中的 while 循环。我刚刚删除了存储过程。我直接从触发器运行查询,并且只选择插入的数据。
请参阅上面编辑后的查询。
谢谢大家。
最佳答案
您应该避免在查询中使用WHILE
,它会严重减慢您的查询速度。对于您的情况,您可以轻松避免 while 循环,这将提高查询的性能。
例如
现有代码
WHILE @headerCount > 0
BEGIN
SET @transCtr = (SELECT TOP 1 TransCtr FROM BigESentData.dbo.tbl_sentTransaction WHERE TransCtr NOT IN (SELECT TransCtr FROM BigEMerchandiser.dbo.tbl_Inventory_H) and TransTyp = 3)
IF NOT EXISTS(SELECT TransCtr FROM BigEMerchandiser.dbo.tbl_Inventory_H where TransCtr = @transCtr)
BEGIN
INSERT INTO BigEMerchandiser.dbo.tbl_Inventory_H
SELECT TOP 1 TransCtr, CustCode, DtRcv, CellNum
FROM BigESentData.dbo.tbl_sentTransaction where TransCtr = @transCtr
END
SET @headerCount = @headerCount - 1
END
修改(无 while)
INSERT INTO BigEMerchandiser.dbo.tbl_Inventory_H
SELECT TOP 1 TransCtr, CustCode, DtRcv, CellNum
FROM BigESentData.dbo.tbl_sentTransaction A
WHERE EXISTS
(
SELECT 1 FROM
BigESentData.dbo.tbl_sentTransaction T WHERE TransCtr NOT IN
(SELECT TransCtr FROM BigEMerchandiser.dbo.tbl_Inventory_H) and TransTyp = 3)
AND T.TransCtr = A.TransCtr
)
使用类似的方法,您可以实现第二个 while 循环。
关于sql-server - MS SQL - 查询运行时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49746392/
我已经使用 MS Word 和一大堆表单字段创建了一个应用程序表单,并且我有一个 Access db,可以从这个 Word 文档中导入我需要的所有数据,这要归功于: http://msdn.micro
我试图找到一种将 Outlook 插件发布到办公商店的方法。但我发现我们只能发布 Office 应用程序,而不能发布 Office 商店的加载项。因此我想知道 Office 应用程序和 Office
我在 MS Reporting Services 服务器上部署了一份报告,工作正常。我可以使用 Microsoft 的报表查看器组件从 ASPX 页面毫无问题地 Access 它、设置报表参数等。效果
让我们再试一次。我发布这个是为了回答 2 个问题 MS Project 2007 是否需要 SharePoint(我希望没有)? 做 你喜欢 MS Project 开发团队 - 它是有用的还是 疼痛?
我正在执行这些星期六上午的任务之一,试图理解为什么为什么要在计算机注册表中搜索某些信息会花费大量时间,甚至迫使我停止该过程。使用这些注册表清理程序之一,我发现该代码花了数十分钟遍历如下行: HKEY_
从多年前开始,我就没有使用Access。 它能很好地解决什么样的问题,甚至比真正的RDBMS支持的Web应用程序更好? 它仍在积极开发吗?还是MS已经死了? 最大的局限性是什么? 更新: 应该使用什么
我们计划重新设计一个相当庞大的 MS Access 应用程序。有没有办法在同一应用程序上同时工作,或者是否可以合并同一文件的两个单独实例(不是数据,而是表单和代码)。现在 Access 包含数据,但在
我写了一些SQL命令来更正表中的字段。由于它是如此之小(也许我有点自大),我什至没有运行过一次,只是将其放入了更新包中供其他用户使用。 Dim SQL As String Dim rs As DAO.
它是Office自带的,是一个“中规中矩”的数据库,到今天这里有800多个问题,但我从来没有关注过它。 我失去了一些有趣的东西? 我说的是 MS-Access 作为用于快速原型(prototype)制
我有一个MS-Access数据库,该数据库已通过使用“用于Access的Microsoft SQL Server迁移助手2008”(aka SSMA)转换为使用SQL表并创建了链接表(因此,MS-Ac
我有一个 Excel 文件,其中包含从 Access 数据库(主数据库)导出的任务。然后,此 Excel 文件用作 MS Project 的导入文件。随后,MS Project 用于实际跟踪和报告,并
我正在尝试获取有关如何将 MS Project 2010 连接到 MS Project Server 2010 的教程或分步说明。 我已经在我的服务器上安装了 Server 2008 R2(64 位)
有没有办法像选择查询一样在查询中引用表单的组合框/文本框? 我通常在选择查询的条件中使用类似这样的东西: like forms!frmMain.qTitleofSomething&* (acces
我想创建一个表,其中包含 DOUBLE 实数类型的列。我可以在表设计 View 中找到数据类型 Number,但是没有 Double 或 single,Float.. 如何实现..? 我还需要 SQL
我环顾四周,发现了一些关于如何从字段的“描述”框中获取描述的 VBA 代码,但没有找到如何在表单属性中使用它的方法。 我希望出现一个 ControlTip,其中包含从数据库中的描述中带来的该字段的描述
我有一个难题。我已经开发了一个 Access 应用程序,我正准备分发它。我刚刚拆分了数据库。 (我知道,有人说我应该从一开始就把它分开开发……我没有)我也刚刚加密了后端数据库。在前端,我已链接到后端并
我制作了一个 MS Access 2013 数据库来跟踪有关交易网站的所有通信。与此问题相关的表和列是具有列 ID(编号)和链接(超链接)的广告,以及具有列广告的注释,其中包含广告 ID。链接字段包含
我与我不拥有且无法更改的数据库建立了 ODBC 连接。我要做的是使相关记录合并为一条记录。关系是一对多。 我有一个学生管理系统,想要导出一个提供自动标注服务(由调用收费)的调用列表。如果有多个学生住在
我在 Access 的表单中设置了一个文本框。该表单链接到一个表格。但是它自己的文本框是未绑定(bind)的,它用于简单地收集用户输入。但是,我无法编辑它所查看的值。 文本框未锁定。文本框可以在 VB
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
我是一名优秀的程序员,十分优秀!