Могу ли я использовать индексированное представление в SQL Server для извлечения только не повторяющихся записей - PullRequest
0 голосов
/ 12 ноября 2018

У нас огромная таблица с миллионами записей. Мы хотим получить только первую запись на основе некоторого ключа в этой таблице. Когда я пытался использовать self-join, это приводило к проблеме с временным пространством в БД. С точки зрения производительности, я думал об использовании индексированного представления. Но я не могу использовать левое соединение или CTE в индексированном представлении.

Есть ли какой-нибудь способ выбрать только неповторяющиеся записи, используя индексированные представления?

1 Ответ

0 голосов
/ 12 ноября 2018

Сценарий состоит в том, что индексированное представление содержит различные значения «ключа», которые присоединяются к первой строке в исходной таблице.

Подготовить пример данных

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...