- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了下面的查询来从两个不同的表中检索不同的 RegNo。但下面的查询需要近 25 秒才能检索结果。 Inventory表中有超过150万条记录。
Select F.PKID, F.RegNo
From
(
Select E.PKID, E.RegNo
Row_Number() Over(Order By E.RegNo Asc) RowNo
From
(
Select C.PKID, C.RegNo
From
(
Select Pk_Id PKID, LTrim(RTrim(A.Reg_No)) RegNo,
Row_Number() Over(Partition By LTrim(RTrim(A.Reg_No))
Order By (Select Null)) RegRowNo
From dbo.KeyreferenceDetails A (NoLock)
Where A.KeyreferenceStatus = 'L'
And A.Reg_No Like @Value And IsNull(Reg_No, '') <> '' And Not Exists
(
Select 1 From dbo.INVENTORY B (NoLock)
Where A.Reg_No = B.Inv_H_Reg_No
)
) C
Where C.RegRowNo = 1 And IsNull(C.RegNo, '') <> '-'
Union
Select D.PKID, D.RegNo
From
(
Select Pk_ID PKID, LTrim(LTrim(Txt_RegNo)) RegNo,
Row_Number() Over(Partition By LTrim(LTrim(A.Txt_RegNo))
Order By (Select Null)) RegRowNo
From dbo.MobileMessageDetails A (Nolock)
Left Join dbo.PLACE P (Nolock) On P.Place_Shrt_Code = A.Txt_YarddCode
And P.[Status] = 'L'
Left Join dbo.INVENTORY B (Nolock) On A.Txt_RegNo = B.Inv_H_Reg_No
Where A.Txt_INOUT In('IN', 'MOBILE') And IsNull(A.Txt_RegNo, '') <> '' And B.Inv_H_Pk_Id Is Null
And A.[Status] = 'L' And Txt_RegNo Like @Value
) D
Where D.RegRowNo = 1 And IsNull(D.RegNo, '') <> '-'
) E
) F
Where F.RowNo > 0 And F.RowNo <= 20
查询计划:
可用索引:
KeyreferenceDetails 表:
Index Name ---------------+ Column Name ----------------- + Index Type
IX_KeyreferenceDetails_I | Reg_No | NONCLUSTERED
IX_KeyreferenceDetails_II | KeyreferenceStatus | NONCLUSTERED
库存表:
Index Name ---------------+ Column Name ----------------- + Index Type
IX_Inventory_I | Inv_H_Reg_No | NONCLUSTERED
MobileMessageDetails 表:
Index Name --------------- + Column Name ----------------- + Index Type
IX_MobileMessageDetails_I | Txt_RegNo | NONCLUSTERED
IX_MobileMessageDetails_II | Txt_INOUT | NONCLUSTERED
位置表:
Index Name ---------------+ Column Name ----------------- + Index Type
IX_Place_I | Place_Shrt_Code | NONCLUSTERED
IX_Place_I | Status | NONCLUSTERED
我已经为上面查询中使用的所有表创建了所需的索引。但查询成本较高。如何减少SQL Server中的查询运行时间?
统计输出:
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'INVENTORY'. Scan count 6, logical reads 382, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'KeyreferenceDetails'. Scan count 15, logical reads 9062, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Mobile_MessageDetails'. Scan count 1, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#TempItemsCount_____________________________________________________________________________________________________0000000118A9'. Scan count 0, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 20733 ms, elapsed time = 7844 ms.
Table 'INVENTORY'. Scan count 6, logical reads 382, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'KeyreferenceDetails'. Scan count 14, logical reads 9062, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Mobile_MessageDetails'. Scan count 1, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#VehicleRegDetails__________________________________________________________________________________________________0000000118AB'. Scan count 0, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 21139 ms, elapsed time = 8146 ms.
Table '#TABLE_SCHEMA_______________________________________________________________________________________________________0000000118AA'. Scan count 0, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
更新:
Insert Into #TempItemsCount(TotalCount)
Select Count(E.PKID)
From
(
Select E.PKID, E.RegNo
Row_Number() Over(Order By E.RegNo Asc) RowNo
From
(
Select C.PKID, C.RegNo
From
(
Select Pk_Id PKID, LTrim(RTrim(A.Reg_No)) RegNo,
Row_Number() Over(Partition By LTrim(RTrim(A.Reg_No))
Order By (Select Null)) RegRowNo
From dbo.KeyreferenceDetails A (NoLock)
Where A.KeyreferenceStatus = 'L'
And A.Reg_No Like @Value And IsNull(Reg_No, '') <> '' And Not Exists
(
Select 1 From dbo.INVENTORY B (NoLock)
Where A.Reg_No = B.Inv_H_Reg_No
)
) C
Where C.RegRowNo = 1 And IsNull(C.RegNo, '') <> '-'
Union
Select D.PKID, D.RegNo
From
(
Select Pk_ID PKID, LTrim(LTrim(Txt_RegNo)) RegNo,
Row_Number() Over(Partition By LTrim(LTrim(A.Txt_RegNo))
Order By (Select Null)) RegRowNo
From dbo.MobileMessageDetails A (Nolock)
Left Join dbo.PLACE P (Nolock) On P.Place_Shrt_Code = A.Txt_YarddCode
And P.[Status] = 'L'
Left Join dbo.INVENTORY B (Nolock) On A.Txt_RegNo = B.Inv_H_Reg_No
Where A.Txt_INOUT In('IN', 'MOBILE') And IsNull(A.Txt_RegNo, '') <> '' And B.Inv_H_Pk_Id Is Null
And A.[Status] = 'L' And Txt_RegNo Like @Value
) D
Where D.RegRowNo = 1 And IsNull(D.RegNo, '') <> '-'
) E
)
最佳答案
在没有模式和有限信息的情况下回答,因此不能保证这会解析,但下面是对其进行优化的尝试,以便您至少可以理解这些方法。
优化可以分为以下几点:
将复杂的查询分成单独的语句,这些语句更容易理解(对于人们和优化器来说)并且知道优化器会很好地处理。例如,优化第一个查询很容易,因为很明显 Reg_No
用于JOIN
以及 WHERE
条款。索引示例可能是:
创建非聚集索引index_name ON dbo.KeyreferenceDetails (Reg_No) INCLUDE (Pk_Id, KeyreferenceStatus) WHERE KeyreferenceStatus = 'L'
消除 ISNULL
中的函数( COALESCE
、 LTRIM
、 RTRIM
、 JOIN
等) , WHERE
, PARTITION BY
。例如,考虑一下:
WHERE ISNULL(A.Reg_No, '') <> ''
优化器将无法使用 Reg_No
上的索引因为你正在对其应用一个函数。相反,将其重写为:
WHERE A.Reg_No <> '' AND A.Reg_No IS NOT NULL
考虑使用UNION ALL
与 UNION
。对于 UNION
,查询引擎将对两个集合进行去重并仅返回唯一的。它必须在返回任何数据进行处理之前执行此操作。与UNION ALL
您有一个串联,可以简单地独立处理两个查询并将第二组查询附加到第一个查询的末尾。
而不是使用 IN
在 WHERE
子句,您可以使用 LEFT OUTER JOIN
并添加检查以查看连接表中的键列是否为 NULL,以确保没有从中返回任何记录,或者 EXISTS
,这通常会更有效地执行。
下面是将其中一些原则应用于查询的一种方法的示例:
IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp;
GO
SELECT PKID = Pk_Id,
RegNo = LTrim(RTrim(A.Reg_No)),
RegRowNo = Row_Number() Over(Partition By LTrim(RTrim(A.Reg_No)) Order By (Select Null))
INTO #temp
FROM dbo.KeyreferenceDetails A WITH(NOLOCK)
LEFT OUTER JOIN dbo.INVENTORY B WITH(NOLOCK) ON A.Reg_No = B.Inv_H_Reg_No
WHERE B.Inv_H_Reg_No IS NULL
AND A.KeyreferenceStatus = 'L'
And A.Reg_No Like @Value
And A.Reg_No IS NOT NULL
AND A.Reg_No <> '';
INSERT INTO #temp (PKID, RegNo, RegRowNo)
SELECT PKID = Pk_ID,
RegNo = LTrim(LTrim(A.Txt_RegNo)),
RegRowNo = Row_Number() Over(Partition By LTrim(LTrim(A.Txt_RegNo)) Order By (Select Null))
FROM dbo.MobileMessageDetails A WITH(NOLOCK)
LEFT OUTER JOIN dbo.PLACE P WITH(NOLOCK) ON P.Place_Shrt_Code = A.Txt_YarddCode AND P.[Status] = 'L'
LEFT OUTER JOIN dbo.INVENTORY B WITH(NOLOCK) ON A.Txt_RegNo = B.Inv_H_Reg_No
WHERE B.Inv_H_Pk_Id Is Null
AND A.Status = 'L'
AND A.Txt_RegNo Like @Value
And A.Txt_RegNo IS NOT NULL
AND A.Txt_RegNo <> ''
AND A.Txt_INOUT In ('IN', 'MOBILE');
IF OBJECT_ID('tempdb..#final') IS NOT NULL DROP TABLE #final;
GO
SELECT t.PKID,
t.RegNo,
RowNo = Row_Number() Over(Order By t.RegNo Asc)
INTO #final
FROM #temp t;
WHERE t.RegNo <> '-'
SELECT F.PKID, F.RegNo
FROM #final F
WHERE F.RowNo BETWEEN 1 AND 20
GO
DROP TABLE #temp, #final
由于其中很可能存在语法错误,因此当您查看此内容时,我建议一次运行每个部分并确保其正常工作,而不是立即执行整个脚本。希望这有帮助!
问候,
罗斯
关于sql - 如何减少SQL Server中的查询运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36091357/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!