标签: query-hints

无论ORDER BY如何,SELECT TOP都很慢

我在SQL Server中运行一个相当复杂的查询,运行视图,格式如下:

SELECT *
   FROM myview, foo, bar 
   WHERE shared=1 AND [joins and other stuff]
   ORDER BY sortcode;
Run Code Online (Sandbox Code Playgroud)

如上所示的查询计划显示了Sort在决赛之前的操作SELECT,这正是我所期望的.只有35个匹配的记录,查询在2秒内完成.

但是,如果我添加TOP 30,查询需要将近3分钟!使用SET ROWCOUNT同样慢.

查看查询计划,它现在似乎在连接和过滤器myview 之前对所有200多万条记录进行排序.

这个"排序"在查询计划中显示为索引上的sortcode索引扫描,主表上的聚簇索引查找以及它们之间的嵌套循环,所有这些都在连接和过滤器之前.

如何SORT 在之前 强制SQL Server TOP,就像TOP未指定时一样?

我不认为构造myview是问题,但为了以防万一,它是这样的:

CREATE VIEW myview AS
   SELECT columns..., sortcode, 0 as shared FROM mytable
   UNION ALL
   SELECT columns..., sortcode, 1 as shared FROM [anotherdb].dbo.mytable
Run Code Online (Sandbox Code Playgroud)

本地mytable有几千条记录,而mytable在同一MSSQL实例的另一个数据库中有几百条记录.两个表在各自的sortcode列上 …

t-sql sql-server sql-server-2005 query-hints sql-execution-plan

22
推荐指数
1
解决办法
1万
查看次数

如何在实体框架中控制参数嗅探和/或查询提示?

更新:我已经创建了一个建议,以便在EF的未来版本中实现提示控制.去这里投票吧.

我有一个问题,我的一个实体框架(EF)查询在Sql Server中执行需要很长时间,但是当我将生成的TSQL复制并粘贴到Sql Server Management Studio(SSMS)时,它运行得非常快.经过一些调查后,我发现我遇到了参数嗅探问题,正确的解决方法是插入许多查询提示之一(OPTIMIZE FOR,RECOMPILE等).如何将这些提示插入到我的EF查询中?

从不同角度出现的相关问题在这里,这里这里.

sql-server entity-framework query-hints parameter-sniffing

7
推荐指数
1
解决办法
4501
查看次数

我应该使用Query Hint Fast number_rows/FASTFIRSTROW吗?

我正在阅读有关查询提示的文档:http: //msdn.microsoft.com/en-us/library/ms181714(SQL.90).aspx

并注意到这一点:FAST number_rows指定优化查询以快速检索第一个number_rows.这是一个非负整数.返回第一个number_rows后,查询继续执行并生成其完整结果集.

所以,当我正在进行如下查询:

Select Name from Students where ID = 444
Run Code Online (Sandbox Code Playgroud)

我应该打扰这样的提示吗?假设SQL Server 2005,我应该什么时候?

- 编辑 -

在限制结果时也应该打扰一下:

Select top 10 * from Students OPTION (FAST 10)
Run Code Online (Sandbox Code Playgroud)

sql sql-server query-hints

6
推荐指数
2
解决办法
9804
查看次数

如何使用Linq to SQL的NOEXPAND提示?

我有一个索引视图,我需要指定noexpand提示,以便它合理地执行.不幸的是,从NOLOCK提示中修改Linq to SQL生成的T-SQL查询时,似乎没有简单的方法可以直接利用这些提示或存在?

我的想法是允许通过使用属性或通过dbml声明性地定制这些东西是有意义的.此外,由于Linq to SQL似乎只针对SQL Server,因此只有我们能够利用这些高级功能(如果它们存在)才有意义.无论实施如何,虽然我对解决这个问题的任何创造性方法感兴趣.

query-hints indexed-view linq-to-sql

6
推荐指数
1
解决办法
3127
查看次数

Oracle多插入语句

在我的应用程序中,我必须添加许多记录.我使用以下构造:

   INSERT /*+ append parallel(t1, 4) parallel(t2, 4) */ ALL
   INTO t1 (col1, col2, col3) VALUES ('val1_1', 'val1_2', 'val1_3')
   INTO t2 (col1, col2, col3) VALUES ('val2_1', 'val2_2', 'val2_3')
   INTO t2 (col1, col2, col3) VALUES ('val3_1', 'val3_2', 'val3_3')
   .
   .
   .
SELECT 1 FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

我也在使用APPEND和PARALLEL提示.请注意,我在两个不同的表中插入数据.似乎并行被忽略了(DBA告诉我).那我怎么知道它是否被使用?是否可以在此类构造中使用PARALLEL提示?有效吗?

oracle query-hints

6
推荐指数
1
解决办法
5721
查看次数

Oracle LEADING提示 - 为什么需要这样做?

突然间(但不幸的是我不知道"突然"是什么时候;我知道它在过去的某个时刻运行正常)我的一个查询开始花费7+秒而不是毫秒来执行.我有一个本地表和3个表通过数据库链接访问.3个远程表连接在一起,其中一个与我的本地表连接在一起.

本地表的where子句只需要几毫秒就可以自己执行,并且只返回一些(最多10个或100个)记录.3个远程表之间有数十万甚至数百万条记录,如果我加入它们,我会获得数十或数十万条记录.

我只加入远程表,以便我可以提取与本地表中每条记录相关的一些数据.

然而,似乎正在发生的事情是,Oracle首先将远程表连接在一起,然后将本地表连接到最后的那个混乱.这总是一个坏主意,特别是考虑到现在存在的数据集,所以我/*+ LEADING(local_tab remote_tab_1) */在查询中添加了一个提示,它现在以毫秒为单位返回.

我比较了解释计划,它们几乎相同,除了一个BUFFER SORT远程表上的单个.

我想知道什么可能导致Oracle以错误的方式处理这个问题?这是指数问题吗?我应该寻找什么?

sql oracle query-hints

5
推荐指数
1
解决办法
2万
查看次数

我们可以为JPA NamedQueries分配自定义查询提示

我们需要将查询号附加到应用程序执行的每个查询中.

EX:SELECT*FROM ... WHERE ... QUERYNO 123456 ;

OpenJPA支持查询提示,但仅针对特定实现的特定提示.

...
Query q = em.createQuery("select m from Magazine m where ... ");
q.setHint("openjpa.hint.OptimizeResultCount", new Integer(2));
q.setHint("openjpa.FetchPlan.ReadLockMode","WRITE");
List r = q.getResultList();
...
Run Code Online (Sandbox Code Playgroud)

但是根据JPA规范和openjpa" 忽略了无法由特定数据库处理的无效提示或提示.否则,无效提示将导致抛出ArgumentException." 因此,将"QUERYNO"指定为提示似乎没有任何影响.

如何创建自定义查询提示以在运行时指定?

...查询q = em.createQuery("从杂志m中选择m ......"); q.setHint(" com.me.CustomQueryNoHint ",new Integer(2234)); 列表r = q.getResultList(); ...

database db2 jpa openjpa query-hints

5
推荐指数
1
解决办法
3224
查看次数

使用top属性更快地查询

为什么SQL Server 2008 R2(版本10.50.2806.0)中的查询速度更快

    SELECT
        MAX(AtDate1),
        MIN(AtDate2)
    FROM
    (
        SELECT TOP 1000000000000
            at.Date1 AS AtDate1,
            at.Date2 AS AtDate2
        FROM
            dbo.tab1 a
        INNER JOIN
            dbo.tab2 at
        ON
            a.id = at.RootId
        AND CAST(GETDATE() AS DATE) BETWEEN at.Date1 AND at.Date2
        WHERE
            a.Number = 223889
    )B  
Run Code Online (Sandbox Code Playgroud)

然后

    SELECT
        MAX(AtDate1),
        MIN(AtDate2)
    FROM
    (
        SELECT 
            at.Date1 AS AtDate1,
            at.Date2 AS AtDate2
        FROM
            dbo.tab1 a
        INNER JOIN
            dbo.tab2 at
        ON
            a.id = at.RootId
        AND CAST(GETDATE() AS DATE) BETWEEN at.Date1 AND at.Date2
        WHERE
            a.Number = 223889
    )B  
Run Code Online (Sandbox Code Playgroud)

? …

sql sql-server query-hints sql-server-2008-r2

5
推荐指数
1
解决办法
264
查看次数

SQL Developer剥离内联提示

我正在使用SQL Developer 3.1.07.我使用内联提示向Oracle运行了一个查询,--+ hint但SQL Developer似乎在将提交提交到数据库之前删除了提示.多线提示/*+ hint */没有被剥夺.是否有选项可以在SQL Developer中保留内联提示/注释?

oracle hints query-hints oracle11g oracle-sqldeveloper

5
推荐指数
1
解决办法
1425
查看次数

在 SQL Server 中将查询提示 (OPTION) 置于视图中

我有一个使用多个连接的视图的 SQL 查询,该查询偶尔运行非常慢 - 比正常情况慢很多,使查询几乎无法使用。

我从视图中复制了查询并进行了试验并在https://dba.stackexchange.com/a/60180/52607找到了解决方案- 如果我添加

OPTION (MERGE JOIN, HASH JOIN)
Run Code Online (Sandbox Code Playgroud)

到查询结束时,它的运行速度提高了约 6 倍。

我现在尝试将 OPTION 调整为原始视图,但 SQL Server/SSMS 告诉我

Incorrect syntax near the keyword 'OPTION'.
Run Code Online (Sandbox Code Playgroud)

如何将此选项添加到视图中,以便视图的结果查询同样快?

(将选项添加到视图上的查询并没有导致任何加速。这看起来像这样:

select * from vMyView
where SomeDate >= CONVERT(Datetime, '2017.09.20')
OPTION (MERGE JOIN, HASH JOIN)
Run Code Online (Sandbox Code Playgroud)

我想我必须直接将此选项用于 vMyView - 如果可能的话。)

sql-server query-hints query-performance sql-view

5
推荐指数
1
解决办法
6423
查看次数