SQL 查询比平时花费更多时间

Posted

技术标签:

【中文标题】SQL 查询比平时花费更多时间【英文标题】:SQL query is taking more time than usual 【发布时间】:2019-10-10 12:17:22 【问题描述】:

我的查询需要 2 个小时才能从数据库中获取 250 万行。我也检查了执行计划。索引也工作正常。

这是查询:

SELECT 
    GeneralJournalAccountEntry.RecId as [Transaction #],
    GENERALJOURNALACCOUNTENTRY.LEDGERACCOUNT AS [LEDGER WITH DIMENSIONS],
    DIMENSIONATTRIBUTE.NAME AS [DIMENSION TYPE],
    DIMENSIONATTRIBUTELEVELVALUE.DISPLAYVALUE as [DIMENSION VALUE]
FROM 
    DIMENSIONATTRIBUTE
INNER JOIN 
    DIMENSIONATTRIBUTEVALUE ON DIMENSIONATTRIBUTE.RECID = DIMENSIONATTRIBUTEVALUE.DIMENSIONATTRIBUTE
INNER JOIN 
    DIMENSIONATTRIBUTELEVELVALUE ON DIMENSIONATTRIBUTEVALUE.RECID = DIMENSIONATTRIBUTELEVELVALUE.DIMENSIONATTRIBUTEVALUE
INNER JOIN 
    DIMENSIONATTRIBUTEVALUEGROUPCOMBINATION ON DIMENSIONATTRIBUTELEVELVALUE.DIMENSIONATTRIBUTEVALUEGROUP = DIMENSIONATTRIBUTEVALUEGROUPCOMBINATION.DIMENSIONATTRIBUTEVALUEGROUP
INNER JOIN 
    GENERALJOURNALACCOUNTENTRY ON DIMENSIONATTRIBUTEVALUEGROUPCOMBINATION.DIMENSIONATTRIBUTEVALUECOMBINATION = GENERALJOURNALACCOUNTENTRY.LEDGERDIMENSION
INNER JOIN 
    GENERALJOURNALENTRY ON GENERALJOURNALENTRY.PARTITION = GENERALJOURNALACCOUNTENTRY.PARTITION AND GENERALJOURNALENTRY.RECID = GENERALJOURNALACCOUNTENTRY.GENERALJOURNALENTRY
WHERE
    DIMENSIONATTRIBUTE.NAME <> 'MainAccount'

【问题讨论】:

先阅读***.com/help/how-to-ask,然后至少与我们分享执行计划 这是 EAV 型号吗? 另外,请使用国际通用的度量 - 比如数千、数百万、数十亿...... WHERE DIMENSIONATTRIBUTE.NAME &lt;&gt; 'MainAccount' 不能使用索引,至少效率不高。 Why is my query suddenly slower than it was yesterday 【参考方案1】:

试试这个可能对你有帮助

如果查询从未完成,您必须获得估计的执行计划,而不是实际的。由于它只有一行,因此您可能拥有最慢的计算机:

使用 WITH (NOLOCK)

【讨论】:

WITH (NOLOCK) 是做什么的? @SalmanA 我认为它似乎:当您使用 NOLOCK 查询提示时,您是在告诉存储引擎您想要访问数据,无论数据是否被另一个进程锁定。跨度> NOLOCK 等同于 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED,除非您完全了解您所得到的,否则这通常是一个非常糟糕的主意。可能由此产生的脏读意味着您可以获得一个根据 ACID 从未存在过的值。

以上是关于SQL 查询比平时花费更多时间的主要内容,如果未能解决你的问题,请参考以下文章

从 AWS S3 复制到 Snowflake 需要比平时更多的时间

带有 SQL 注入保护的简单查询比没有的要花费更长的时间

如果 SQL 查询花费更多时间并且 CONN_MAX_AGE 的剩余年龄更短,会发生啥情况?

sql查询需要时间,因为我正在查看三个表

SELECT * 真的比只选择需要的列花费更多的时间吗?

使用执行计划进行 Sql 调优