问题标签 [query-hints]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server-2005 - SQL 2005:NOLOCK 提示显着增加了读取。怎么回事?
我有一个存储过程,当 NOLOCK 提示添加到查询时,它会执行更多读取操作。我很困惑 - 请问有人知道为什么吗?
详细信息:查询是:
它进行了 40,000 次读取,但行数不到 2,000 行。我确定大多数这些读取是由 3 个 TEXT 列引起的。(如果我省略了这些,它会下降到 59 次读取!)但是当我删除 WITH (NOLOCK) 时,它会从 40,000 次读取到 13,000 次。我重复了几次,因为我认为我一定搞砸了,但这两种方式都非常一致。
sql - 我应该使用查询提示快速 number_rows / FASTFIRSTROW 吗?
我正在阅读有关查询提示的文档:http: //msdn.microsoft.com/en-us/library/ms181714 (SQL.90).aspx
并注意到这一点: FAST number_rows 指定查询已针对快速检索第一个 number_rows 进行了优化。这是一个非负整数。返回第一个 number_rows 后,查询继续执行并生成完整的结果集。
所以当我做这样的查询时:
我应该打扰这样的提示吗?假设 SQL Server 2005,我应该什么时候?
- 编辑 -
在限制结果时也应该打扰:
sql - Oracle LEADING 提示——为什么需要这样做?
突然(但不幸的是,我不知道“突然”是什么时候;我知道它在过去的某个时候运行良好)我的一个查询开始需要 7 多秒而不是毫秒来执行。我有 1 个本地表和 3 个通过 DB 链接访问的表。3 个远程表连接在一起,其中一个与我的本地表连接。
本地表的 where 子句只需要几毫秒即可自行执行,并且只返回几条(最多 10 或 100 条)记录。3 个远程表之间有数十万甚至数百万条记录,如果我适当地加入它们,我会得到数万或数十万条记录。
我只加入远程表,以便我可以提取与本地表中每条记录相关的几条数据。
然而,似乎正在发生的事情是,Oracle 首先将远程表连接在一起,然后将我的本地表连接到最后。这总是一个坏主意,特别是考虑到现在存在的数据集,所以我/*+ LEADING(local_tab remote_tab_1) */
在我的查询中添加了一个提示,它现在以毫秒为单位返回。
我比较了解释计划,它们几乎相同,除了一个BUFFER SORT
远程表上的一个。
我想知道什么可能导致 Oracle 以错误的方式处理这个问题?是索引问题吗?我应该寻找什么?
sql - 如何在查询提示中为单个表的不同连接选择不同的提示?
假设我有以下查询:
我有关于 Ax 和 Bx 以及 By 和 Cy 和 Dz 的索引
Az 上没有索引
如何给这个查询一个提示,在 Ax 上使用 INDEX 提示,但在 Az 上使用 USE_HASH 提示?似乎提示只采用表名,而不是特定的连接,因此当使用具有多个连接的单个表时,我只能为所有连接指定一个策略。
或者,假设我在上述查询中使用了 LEADING 或 ORDERED 提示。这两个提示也只需要一个表名,那么我怎样才能确保 Ax = Bx 连接发生在 Az = Dz 之前呢?我意识到在这种情况下我可以首先列出 D,但想象 D 随后连接到 E,并且 DE 连接是我在整个查询中想要的最后一个连接。
第三种配置——假设我希望 Ax 连接成为整个查询的第一个,并且我希望 Az 连接成为最后一个。如何使用提示从 A 进行单个联接,然后是 BC 联接,最后是 AD 联接?
sql-server-2008 - 确定索引是否已用作提示
在 SQL Server 中,可以选择使用查询提示。例如
我正在摆脱未使用的索引,并且想知道如何确定索引是否用作查询提示。有人对我如何做到这一点有建议吗?
干杯,乔
linq-to-sql - 如何在 Linq to SQL 中使用 NOEXPAND 提示?
我有一个索引视图,我需要为其指定 noexpand 提示以使其合理执行。不幸的是,正如从 NOLOCK 提示修改 Linq to SQL 生成的 T-SQL 查询所看到的那样,似乎没有简单的方法可以直接利用这些提示,或者是否存在?
我的想法是允许通过使用属性或通过 dbml 以声明方式自定义这些东西是有意义的。此外,由于 Linq to SQL 似乎只针对 SQL Server 工作,因此我们也能够利用这些高级功能(如果它们存在)才有意义。尽管我对解决此问题的任何创造性方法感兴趣,但无论实施如何。
sql-server-2008 - SQL Server 2008:将 VIEW 与其他 VIEW 连接:预先计算而不求助于临时表
为了在我的数据库中执行转换,我经常使用一组链式视图。在视图中将是公用表表达式。例如,我将有以下内容:
在 TransformationStep4 附近的某个地方,随着查询计划变得更加复杂,视图将变得更慢。这是预期的,可以的。
但是,当我想将 TransformationStep4 的一部分连接到自身时,查询将大大减慢,因为优化器会尝试一直返回到源表并查找某种索引。通常这是可以的,但有时我只想存储我的临时结果并加入,因为(作为故事中的设计人员)我知道结果表会很小,加入会快得多反对它的“预取”。
有没有办法让我编写一个查询提示,它会影响查询计划,从而预取子查询然后加入反对?否则我将不得不求助于存储过程中的临时表,但如果可以的话,我想避免它。
感谢您的任何建议,以及当您认为我的设计很糟糕时:-)
database - 我们可以将自定义查询提示分配给 JPA NamedQueries
我们需要将查询编号附加到我们的应用程序执行的每个查询中。
例如:SELECT * FROM ... WHERE ... QUERYNO 123456;
OpenJPA 支持查询提示,但仅针对特定实现的特定提示。
但是根据 JPA 规范和 openjpa “无效提示或特定数据库无法处理的提示将被忽略。否则,无效提示将导致 ArgumentException 被抛出。” 所以指定“QUERYNO”作为提示似乎没有影响。
如何创建自定义查询提示以在运行时指定?
... Query q = em.createQuery("select m from Magazine m where ..."); q.setHint(" com.me.CustomQueryNoHint ", new Integer(2234)); 列表 r = q.getResultList(); ...
sql - 为什么“在适用于 UPDATE 或 DELETE 语句的目标表的 FROM 子句中”忽略 NOLOCK?
我对 BOL 短语感到困惑:
“不能为插入、更新或删除操作修改的表指定 READUNCOMMITTED 和 NOLOCK。SQL Server 查询优化器忽略 FROM 子句中适用于 UPDATE 或 DELETE 语句的目标表的 READUNCOMMITTED 和 NOLOCK 提示”[1]
例如,如果我写
它运行时没有错误(或警告),可能相当于
它也可以在没有错误或警告的情况下运行。
是否等效?
该表是相同的,但在 FROM 中,它在逻辑上是源表而不是目标表,我可以重写 1)与另一个(物理)表不同的源表:
为什么要在另一个表上忽略 NOLOCK?
或者,如果它是错误的,那么
如何编写具有“适用于 UPDATE 或 DELETE 语句的目标表的 FROM 子句中的 NOLOCK 提示”的 UPDATE 问题,因为即使在 1)和 2)中,物理表是相同的但在逻辑上源(在 SELECT 中)表和目标(在 UPDATE 中)表是不同的。
如何编写一个 UPDATE 语句来证明 WITH(NOLOCK) 被忽略?
为什么要完全忽略它?它被忽略了吗?
或者,如果这是一个错误的问题,那么
为什么语法允许保证被忽略的提示?
再一次,要么不可能(或者是吗?)写出像文档中那样写的声明,或者我不理解“忽略”的含义(忽略它是什么意思?或根本没有它?) ...
UPDATE2:
答案表明 NOLOCK 在 UPDATE 语句的 FROM 子句中未被(更新)忽略,BOL 文档 [1] 断言。
好吧,这个问题的本质:
你能给我任何例子(上下文),在 UPDATE 语句的 FROM 子句中忽略 NOLOCK 是有意义的吗?
[ 1 ]
表提示 (Transact-SQL)
SQL Server 2008 R2
http://msdn.microsoft.com/en-us/library/ms187373.aspx
sql-server - 存储过程和 OPTIMIZE FOR UNKNOWN
我已经阅读了 SQL Server 2008 OPTIMIZE FOR UNKNOWN 查询提示。我明白它是如何工作的。
但是,我有一个关于何时何地使用它的问题。它不能在 UDF 中指定。它可以在存储过程中指定。但是,此MSDN 博客文章指出以下内容:
4.将查询移动到存储过程中可以将其放入单独的过程上下文中,并且可以是使优化器看到该值的好方法(注意:这在 SQL 2000 中也适用)
在我看来,这似乎是说传递给存储过程的任何参数都将被“嗅探”,从而帮助 SQL Server 编译最佳执行计划。这意味着将重新访问/重新编译缓存的计划(不确定该机制)。然而,这令人困惑,因为它否定了 OPTIMIZE FOR UNKNOWN 的全部需求。
关于查询提示的 MSDN 文章没有涵盖我的问题。
有人可以为我回答这个问题,理想情况下,可以用指向微软的东西来解决这个问题。谢谢。