小编Man*_*ion的帖子

使用 ORDER BY 从不同表中选择 TOP 1 时如何设置索引视图

我正在努力在以下场景中设置索引视图,以便在没有两个聚集索引扫描的情况下执行以下查询。每当我为此查询创建索引视图然后使用它时,它似乎忽略了我放在它上面的任何索引:

    -- +++ THE QUERY THAT I WANT TO IMPROVE PERFORMANCE-WISE +++

    SELECT TOP 1 *
    FROM    dbo.TB_test1 t1
            INNER JOIN dbo.TB_test2 t2 ON t1.PK_ID1 = t2.FK_ID1
    ORDER BY t1.somethingelse1
           ,t2.somethingelse2;


    GO
Run Code Online (Sandbox Code Playgroud)

表设置如下:

  • 两张桌子
  • 它们通过上面的查询通过内部连接连接起来
  • 并通过上面的查询从第一个表中的一列和第二个表中的一列排序;仅选择 TOP 1
  • (在下面的脚本中也有一些行来生成测试数据,以防万一它有助于重现问题)

    -- +++ TABLE SETUP +++
    
    CREATE TABLE [dbo].[TB_test1]
        (
         [PK_ID1] [INT] IDENTITY(1, 1)  NOT NULL
        ,[something1] VARCHAR(40) NOT NULL
        ,[somethingelse1] BIGINT NOT NULL
            CONSTRAINT [PK_TB_test1] PRIMARY KEY CLUSTERED ( [PK_ID1] ASC )
        );
    
    GO
    
    create TABLE [dbo].[TB_test2]
        (
         [PK_ID2] [INT] IDENTITY(1, …
    Run Code Online (Sandbox Code Playgroud)

index sql-server-2008 sql-server materialized-view index-tuning

11
推荐指数
1
解决办法
1245
查看次数

是否存在最长公共子串问题的 SQL Server 实现?

是否存在最长公共子串问题的 SQL Server 实现?在 SQL Server 中检查列的所有行的解决方案?我见过将两个字符串作为输入的解决方案,但没有查看表中列的所有行的 SQL Server 解决方案。

我确实尝试了一些东西,但老实说,我认为目前有一个解决方案超出了我的脑海,因此欢迎提出任何建议。

这里没有“现实世界”问题,我只是在研究编程问题以及如何使用 SQL Server 解决这些问题。

performance sql-server substring query-performance

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

删除“登录表”中的许多记录后,服务器登录触发器失败 -SQL 错误 2801

我们定义了一个服务器登录触发器,用于记录每次登录,并在表中记录诸如 windows/sql 用户名、客户端和时间等信息。

该表没有聚集索引,但它有一个“PK_ID”列,它是 bigint 和自动增量。

上周,我们从“登录表”中总共 9000 万条记录中删除了大约 8000 万条记录(带有delete from......,我们没有truncate该表)。

但从那以后我们看到登录触发器失败的多种情况

由于触发器执行,登录 'SQL\xy' 登录失败。
将数据库上下文更改为“master”。
(Microsoft SQL Server,错误:17892)

我们确实重新启动了整个 Windows 服务器几次,之后错误消失了几个小时,但似乎时不时地回来。请注意,这仅在我们删除了这么多记录后才开始出现。

我们发现在用户无法登录之前,我们收到以下错误:

消息 2801,级别 16,状态 1,: 
对象“my_proc”的定义自编译以来已更改。

之后,我们得到了如上所述的错误 17892。

有谁知道可能是什么问题?

触发器定义

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    CREATE TRIGGER [Tr_My_Logon]
     ON ALL SERVER  WITH EXECUTE AS 'xy'
     FOR LOGON
     AS
     BEGIN
        BEGIN TRY
            INSERT INTO mydatabase.myschema.myLogonHistoryTable
                SELECT GETDATE(),
                      ORIGINAL_LOGIN(),
                      EVENTDATA().value('(/EVENT_INSTANCE/LoginType)[1]', 'varchar(500)'),
                      @@SPID,
                      program_name(),
                      HOST_NAME(),
                      EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(500)')
       END TRY

       BEGIN CATCH
           PRINT ERROR_MESSAGE() …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server-2008 sql-server

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

如何对不同的表使用相同的存储过程并避免使用动态sql

我有很多包含一些常见列(相同名称和数据类型)的表。在这些列上,我需要执行相同的操作,我想通过存储过程来执行此操作。但是,我目前可以使其工作的唯一方法是使用动态 sql,我宁愿避免这种情况。

有没有什么方法可以在不使用动态sql的情况下对不同的表(其中表名作为参数传递)使用存储过程?

sql-server stored-procedures dynamic-sql

0
推荐指数
1
解决办法
4046
查看次数