我在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
我正在阅读有关查询提示的文档: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) 我有一个索引视图,我需要指定noexpand提示,以便它合理地执行.不幸的是,从NOLOCK提示中修改Linq to SQL生成的T-SQL查询时,似乎没有简单的方法可以直接利用这些提示或存在?
我的想法是允许通过使用属性或通过dbml声明性地定制这些东西是有意义的.此外,由于Linq to SQL似乎只针对SQL Server,因此只有我们能够利用这些高级功能(如果它们存在)才有意义.无论实施如何,虽然我对解决这个问题的任何创造性方法感兴趣.
在我的应用程序中,我必须添加许多记录.我使用以下构造:
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提示?有效吗?
突然间(但不幸的是我不知道"突然"是什么时候;我知道它在过去的某个时刻运行正常)我的一个查询开始花费7+秒而不是毫秒来执行.我有一个本地表和3个表通过数据库链接访问.3个远程表连接在一起,其中一个与我的本地表连接在一起.
本地表的where子句只需要几毫秒就可以自己执行,并且只返回一些(最多10个或100个)记录.3个远程表之间有数十万甚至数百万条记录,如果我加入它们,我会获得数十或数十万条记录.
我只加入远程表,以便我可以提取与本地表中每条记录相关的一些数据.
然而,似乎正在发生的事情是,Oracle首先将远程表连接在一起,然后将本地表连接到最后的那个混乱.这总是一个坏主意,特别是考虑到现在存在的数据集,所以我/*+ LEADING(local_tab remote_tab_1) */在查询中添加了一个提示,它现在以毫秒为单位返回.
我比较了解释计划,它们几乎相同,除了一个BUFFER SORT远程表上的单个.
我想知道什么可能导致Oracle以错误的方式处理这个问题?这是指数问题吗?我应该寻找什么?
我们需要将查询号附加到应用程序执行的每个查询中.
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(); ...
为什么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 Developer 3.1.07.我使用内联提示向Oracle运行了一个查询,--+ hint但SQL Developer似乎在将提交提交到数据库之前删除了提示.多线提示/*+ hint */没有被剥夺.是否有选项可以在SQL Developer中保留内联提示/注释?
我有一个使用多个连接的视图的 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 - 如果可能的话。)
query-hints ×10
sql-server ×5
oracle ×3
sql ×3
database ×1
db2 ×1
hints ×1
indexed-view ×1
jpa ×1
linq-to-sql ×1
openjpa ×1
oracle11g ×1
sql-view ×1
t-sql ×1