有没有办法让这个选择通过一次搜索检索相同的结果?

Jam*_*olt 8 sql-server t-sql sql-server-2014

通过修改查询或影响优化器的策略,是否可以通过单个搜索或扫描来检索与以下相同的数据?

与此类似的代码和架构目前位于 SQL Server 2014 上。

在此处输入图片说明

复制脚本。设置:

USE tempdb;
GO
IF OBJECT_ID('dbo.TestUpload', 'U') IS NOT NULL 
  DROP TABLE dbo.TestUpload; 


CREATE TABLE dbo.TestUpload(
    JobRunId bigint NOT NULL,
    ThingAName nvarchar(255) NOT NULL,
    ThingAType nvarchar(255) NOT NULL,
    ThingAGranularity nvarchar(255) NOT NULL,
    ThingBName nvarchar(255) NOT NULL,
    ThingBType nvarchar(255) NOT NULL,
    ThingBGranularity nvarchar(255) NOT NULL
);
CREATE CLUSTERED INDEX IX_JobRunId ON dbo.TestUpload (JobRunId);

GO

INSERT INTO dbo.TestUpload (JobRunId, ThingAName, ThingAType, ThingAGranularity, ThingBName, ThingBType, ThingBGranularity)
  VALUES (1, 'A', 'B', 'C', 'D', 'E', 'F');
GO 10

INSERT INTO dbo.TestUpload (JobRunId, ThingAName, ThingAType, ThingAGranularity, ThingBName, ThingBType, ThingBGranularity)
  VALUES (1, 'D', 'E', 'F', 'A', 'B', 'C');
GO 10
Run Code Online (Sandbox Code Playgroud)

询问:

DECLARE @JobRunID bigint = 1;

SELECT JobRunId,
  ThingAName AS Name, 
  ThingAType AS [Type], 
  ThingAGranularity AS Granularity
FROM dbo.TestUpload
WHERE JobRunId = @JobRunID
UNION
SELECT JobRunId,
  ThingBName AS Name, 
  ThingBType AS [Type], 
  ThingBGranularity AS Granularity
FROM dbo.TestUpload
WHERE JobRunId = @JobRunID;
Run Code Online (Sandbox Code Playgroud)

拆除:

IF OBJECT_ID('dbo.TestUpload', 'U') IS NOT NULL 
  DROP TABLE dbo.TestUpload;
Run Code Online (Sandbox Code Playgroud)

我认为这可能不是理想的建模。我试图从开发人员那里获得更多关于如何选择架构的信息,但很好奇是否有我忽略的 TSQL 技巧,因为更改查询比更改架构更容易。

ype*_*eᵀᴹ 6

我会尝试这个,但我不知道它是否会更有效率。您需要DISTINCT删除重复项,因此UNION ALL可能更合适,不需要两个不同的操作:

SELECT DISTINCT 
    JobRunId = @JobRunID, 
    d.*
FROM dbo.TestUpload
  CROSS APPLY 
    (   SELECT 
          ThingAName AS Name, 
          ThingAType AS [Type], 
          ThingAGranularity AS Granularity
      UNION                            -- or UNION ALL
        SELECT 
          ThingBName, 
          ThingBType, 
          ThingBGranularity
    ) AS d 
WHERE JobRunId = @JobRunID ;
Run Code Online (Sandbox Code Playgroud)

UNION ALL 计划:

UNION ALL 计划

UNION 计划:

联合计划