标签: hints

存储过程的固定查询计划

我正在探索计划指南主题。听起来很简单,就我们通过文档中的示例而言。

问题是我找不到任何工作示例(我也没有设法自己弄清楚)来为存储过程或过程中的语句设置固定计划。

我已经阅读了很多博客文章,但它们都只是从 microsoft docs 复制/粘贴示例。

有人更有创意/经验丰富吗?

sql-server hints execution-plan

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

使用 FOR SYSTEM_TIME 子句时历史表的查询/表提示

可能是一个非常简单的问题,但是FOR SYSTEM_TIME在查询时态表时使用语句时,有没有办法为历史表指定查询/表提示?我怀疑不是,但我想在放弃这个之前仔细检查一下。

这是一个dbfiddle,它显示了我所知道的为查询指定提示的不同方式的基本细分,我能弄清楚如何传递与历史表交互的查询和/或表提示的唯一方法是转换查询到UNION ALLlive 和 history 表之间,而不是使用FOR SYSTEM_TIME子句。

在使用该FOR SYSTEM_TIME子句时尝试指定历史表提示时,出现以下错误:

Msg 308 Level 16 State 1 Line X
Index '<<HISTORY TABLE INDEX NAME>>' on table '<<LIVE TABLE NAME>>' (specified in the FROM clause) does not exist.
Run Code Online (Sandbox Code Playgroud)

在使用该FOR SYSTEM_TIME子句时尝试指定指向历史记录表的查询提示时,出现以下错误:

Msg 8723 Level 16 State 1 Line X
Cannot execute query. Object '<<HISTORY TABLE>>' is specified in the TABLE HINT clause, but is not used in the query or does …
Run Code Online (Sandbox Code Playgroud)

sql-server query hints temporal-tables

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

为什么 SQL 不使用索引视图?

我有以下版本的 SQL Server:

Microsoft SQL Server 2014 (SP3) (KB4022619) - Windows NT 6.3 上的 12.0.6024.0 (X64) 企业版(64 位)(内部版本 9600:)(管理程序)

我创建了以下视图

CREATE VIEW [dbo].[vwGroupsOfficesDependencies]
WITH SCHEMABINDING 
AS
SELECT        GC.IdGroup, COUNT_BIG(*) AS countBig, OD.IdOffice
FROM            dbo.Group AS GC INNER JOIN
                         dbo.GroupDependencies AS GD ON GC.IdGroup = GD.IdGroup INNER JOIN
                         dbo.OfficeDependencies AS OD ON OD.IdDependency = GD.IdDependency INNER JOIN
                         dbo.Dependencies AS D ON D.IdDependency = GD.IdDependency
WHERE        (D.Active = 1)
GROUP BY GC.IdGroup, OD.IdOffice
Run Code Online (Sandbox Code Playgroud)

然后我创建了聚集索引

CREATE UNIQUE CLUSTERED INDEX [IX_vwGroupsOfficesDependencies_IdOficeIdGroup] ON [dbo].[vwGroupsOfficesDependencies]
( …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization hints materialized-view sql-server-2014

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

查询存储计划强制失败,NO_PLAN 取决于过滤器运算符在计划中的位置

我有一个查询,我在查询存储中强制执行一个计划(该计划是为此查询编译的 SQL Server)如果我在强制执行该计划后立即运行该查询,NO_PLAN尽管数据库没有发生任何更改,但我会得到last_force_failure_reason_desc。我可以成功地对同一查询强制执行不同的计划

这个问题可以用下图来说明:

创建我们的测试数据库

USE [master]
CREATE DATABASE NO_PLAN
ALTER DATABASE [NO_PLAN] SET QUERY_STORE = ON
ALTER DATABASE [NO_PLAN] SET QUERY_STORE (OPERATION_MODE = READ_WRITE, QUERY_CAPTURE_MODE = ALL)
GO

USE NO_PLAN
GO
IF EXISTS (SELECT 1 FROM sys.tables WHERE name = 'MyTableA') DROP TABLE MyTableA
IF EXISTS (SELECT 1 FROM sys.tables WHERE name = 'MyTableB') DROP TABLE MyTableB

/* create  our tables */
CREATE TABLE [dbo].[MyTableA](
    [Column1] VARCHAR(50) NULL ,
    [Column2] VARCHAR(255) NULL ,
    [Column3] INT NULL , …
Run Code Online (Sandbox Code Playgroud)

sql-server hints execution-plan sql-server-2016 query-store

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

SQL Server 2008R2 - 为什么我的索引没有被使用

我有一个按以下方式定义的表:

CREATE TABLE [dbo].[MyTable]
(
   [MyTable_ID] [int] IDENTITY(1,1) NOT NULL,
   [COLUMN_WITH_DATA] [varchar](128) NOT NULL,
   [COLUMN_A] [varchar](128) NULL,
   [COLUMN_B] [varchar](128) NULL,
   [COLUMN_C] [bit] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

和这样创建的索引:

CREATE INDEX [MyTable_Index_ABC] ON [dbo].[MyTable]
(
    [COLUMN_A],
    [COLUMN_B], 
    [COLUMN_C]
) 
ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我运行以下查询:

SELECT TOP 1 [MyTable].*
    FROM [MyTable](UPDLOCK)
    WHERE
        [MyTable].[COLUMN_A] IS NULL
    AND [MyTable].[COLUMN_B] IS NULL
    AND [MyTable].[COLUMN_C] = 0
Run Code Online (Sandbox Code Playgroud)

这背后的目标是获取第一个尚未使用的记录的 COLUMN_WITH_DATA 值,然后使用非空值更新其 COLUMN_A 和 COLUMN_B,以将其标记为已使用。

我在 MyTable 中有几百万条记录,其中大约一半都有:COULMN_A 和 COLIMN_B 不是 NULL(表明数据已经被消耗)。

在这种情况下,查询运行非常缓慢,执行计划显示索引:

MyTable_Index_ABC
Run Code Online (Sandbox Code Playgroud)

除非我使用查询提示,否则不使用,在这种情况下查询运行得更快。另一方面,如果我更新所有尚未消耗的行,那就是:

COLUMN_A IS NULL AND COLUMN_B IS NULL …
Run Code Online (Sandbox Code Playgroud)

index null hints sql-server-2008-r2

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

我们可以在第一次执行 PL/pgSQL 函数时执行最佳计划而不是通用计划吗?

我有一个非常繁忙的功能,我需要以最佳方式优化。此函数只是一个嵌套的 select 语句,遗留应用程序每秒请求数次。

索引已就位,但我注意到它仅在第一次执行函数后使用。我认为问题在于 Postgres 创建了一个通用的执行计划,因为它在大多数情况下是高度排他的,但有时可能没有那么好。

当我EXPLAIN ANALYZE在第一次执行后进行测试时,查询运行得非常快,但应用程序会话仅调用该函数一次,然后终止。我需要第一次执行使用实际的优化计划。任何人都可以帮忙吗?

我们尝试弄乱管理连接池的连接器驱动程序来发出一个DISCARD TEMP而不是DISCARD ALL,因此它可以保持会话的缓存计划并且性能达到顶峰,但我不想在生产环境中这样做.

我们使用的是在 CentOS 6 上运行的 Postgres 9.4。我试过作为 SQL 函数运行,但没有帮助,它实际上作为 plpgsql 函数更快。下面是函数代码:

CREATE OR REPLACE FUNCTION public.ap_keepalive_geteqpid_veiid(
    IN tcbserie bigint,
    IN protocolo integer)
  RETURNS TABLE(eqpid integer, veiid integer, tcbid integer, veiplaca character varying, veiproprietariocliid integer, tcbtppid integer, tcbversao character, veirpmparametro double precision, tcbconfiguracao bigint, tcbevtconfig integer, veibitsalertas integer, sluid integer, harid integer) AS
$BODY$
BEGIN
    RETURN QUERY
    SELECT  teqp.eqpID, 
            teqp.eqpveiID AS veiID, 
            tcb.tcbID, 
            tvei.veiPlaca, 
            tvei.veiProprietariocliID, …
Run Code Online (Sandbox Code Playgroud)

postgresql performance hints plpgsql postgresql-9.4 postgresql-performance

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

在保证不会更改的表上使用 NOLOCK 提示是否完全安全?

  1. 如果我有一个数据保证永远不会更改的表,那么将 NOLOCK 提示添加到针对该表的 SELECT 查询中是否完全安全?
  2. 如果我有一个表,其中某些行将被更新,但我只选择保证不会更改的行,这是否也是使用 NOLOCK 提示的完全安全的方案?

performance sql-server optimization hints sql-server-2016 query-performance

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

使用局部变量时散列连接提示返回错误

下面的查询使用 StackOverflow2010 示例数据库:

DECLARE @Id INT = 18471

SELECT c.UserId FROM dbo.Comments AS c
INNER HASH JOIN dbo.Users AS u
ON c.UserId = u.Id
AND c.UserId = @Id
Run Code Online (Sandbox Code Playgroud)

使用散列连接提示,它返回以下错误:

由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询

当我添加时它有效 OPTION(RECOMPILE)用字符串文字或替换变量。

什么可能导致这个问题?

sql-server hints execution-plan parameter sql-server-2019

5
推荐指数
0
解决办法
167
查看次数

这三个版本的 TSQL 片段有什么区别?

版本1

DECLARE @key INTEGER = 33, @val INTEGER = 44;
BEGIN TRANSACTION;
INSERT dbo.t([key], val)
  SELECT @key, @val
  WHERE NOT EXISTS
  (
    SELECT 1 FROM dbo.t WITH (UPDLOCK, SERIALIZABLE)
      WHERE [key] = @key
  );
IF @@ROWCOUNT = 0
BEGIN
  UPDATE dbo.t SET val = @val WHERE [key] = @key;
END
COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

版本2

DECLARE @key INTEGER = 33, @val INTEGER = 44;
BEGIN TRANSACTION;
INSERT dbo.t WITH (UPDLOCK, SERIALIZABLE) ([key], val)
  SELECT @key, @val
  WHERE NOT EXISTS
  (
    SELECT 1 …
Run Code Online (Sandbox Code Playgroud)

sql-server hints upsert design-pattern

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

将表提示 INDEX 和 FORCESEEK 与两个不在 PK 上的连接相结合

请参阅下面的第一个查询。
不能将表提示索引和 forceseek 与两个连接组合在一起,并且连接不在 PK 上。
如何使第一个查询编译?

有趣
- 如果只有一个连接或另一个可以组合索引和 forceseek 提示
- 如果索引是 PK 那么可以组合 2 个连接并有两个提示

-- compiler fails 
-- Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.  
Select Count(Distinct([docSVsys].[sID])) 
From [docSVsys] with (nolock) 
Left Join [docSVtext] with (nolock, Index(IX_docSVtext_value_sID), forceseek ) 
       On [docSVtext].[sID] = [docSVsys].[sID]
Left Join [docMVtext] with (nolock, Index(ix_docMVtext_value_sID), forceseek) 
       On [docMVtext].[sID] = [docSVsys].[sID]
where …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server hints

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