首页 > 解决方案 > 我可以在 SQL Server 中使用索引视图来仅获取非重复记录吗

问题描述

我们有一个包含数百万条记录的巨大表。我们只想根据该表中的某个键获取第一条记录。当我尝试使用自加入时,会导致临时数据库空间问题。从性能的角度来看,我正在考虑使用索引视图。但我不能在索引视图中使用左连接或 CTE。

有什么方法可以使用索引视图仅获取非重复记录?

标签: sql-serverduplicatesindexed-view

解决方案


该方案是索引视图包含连接到源表上第一行的“键”的不同值。

准备示例数据

SET NOCOUNT ON;
CREATE TABLE dbo.t (
  product_name nvarchar(20), 
  vendor_name nvarchar(20)
)
GO
INSERT INTO dbo.t (product_name, vendor_name) VALUES 
('SQL Server', 'Microsoft'),
('Oracle', 'Oracle'),
('DB2', 'IBM'),
('Oracle', 'Oracle'),
('Oracle', 'Oracle'),
('DB2', 'IBM'),
('DB2', 'IBM'),
('DB2', 'IBM');

创建索引视图

IF OBJECT_ID ('dbo.v_t', 'view') IS NOT NULL  
    DROP VIEW dbo.v_t
GO
CREATE VIEW dbo.v_t
WITH SCHEMABINDING
AS
    SELECT COUNT_BIG(*) prod_count, vendor_name
    FROM dbo.t
    GROUP BY vendor_name
GO
CREATE UNIQUE CLUSTERED INDEX IX1_v_t
    ON dbo.v_t (vendor_name);  
GO  

查询

SELECT t.* 
FROM dbo.v_t v
CROSS APPLY(SELECT TOP 1 * 
            FROM dbo.t t 
            WHERE v.vendor_name = t.vendor_name 
            ORDER BY t.product_name) t

结果

product_name         vendor_name
-------------------- --------------------
DB2                  IBM
SQL Server           Microsoft
Oracle               Oracle

推荐阅读