sql-server - 我可以在 SQL Server 中使用索引视图来仅获取非重复记录吗
问题描述
我们有一个包含数百万条记录的巨大表。我们只想根据该表中的某个键获取第一条记录。当我尝试使用自加入时,会导致临时数据库空间问题。从性能的角度来看,我正在考虑使用索引视图。但我不能在索引视图中使用左连接或 CTE。
有什么方法可以使用索引视图仅获取非重复记录?
解决方案
该方案是索引视图包含连接到源表上第一行的“键”的不同值。
准备示例数据
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
推荐阅读
- java - 扫描仪未读取下一行并退出循环
- python - 替换 NaN 值的函数
- html - HTML - 图像上的文本(带链接)
- python - 如何有效地将数据名列的行传递给字典
- android - 制作仅覆盖自定义视图一部分的波纹
- python - Python错误:类中未定义函数
- google-kubernetes-engine - 使用私有 IP 在 GKE 中的 KONG 入口
- android - 在 ConnectionService.onCreateIncomingConnection 中调用 TelecomManager.addNewIncomingCall 时如何接收传入的 Bundle 'extras'?
- amazon-web-services - Cloudfront + ELB 可以更改我的请求的查询字符串吗?
- javascript - 选择了 json 值的选择列表项