我遇到了一些SELECT DISTINCT TOP N查询,这些查询似乎被 SQL Server 查询优化器优化得很差。让我们从一个简单的例子开始:具有两个交替值的百万行表。我将使用GetNums函数来生成数据:
DROP TABLE IF EXISTS X_2_DISTINCT_VALUES;
CREATE TABLE X_2_DISTINCT_VALUES (PK INT IDENTITY (1, 1), VAL INT NOT NULL);
INSERT INTO X_2_DISTINCT_VALUES WITH (TABLOCK) (VAL)
SELECT N % 2
FROM dbo.GetNums(1000000);
UPDATE STATISTICS X_2_DISTINCT_VALUES WITH FULLSCAN;
Run Code Online (Sandbox Code Playgroud)
对于以下查询:
SELECT DISTINCT TOP 2 VAL
FROM X_2_DISTINCT_VALUES
OPTION (MAXDOP 1);
Run Code Online (Sandbox Code Playgroud)
SQL Server 可以通过扫描表的第一个数据页找到两个不同的值,但它会扫描所有数据。为什么 SQL Server 不进行扫描,直到找到所需数量的不同值?
对于这个问题,请使用以下测试数据,其中包含 1000 万行,并在块中生成 10 个不同的值:
DROP TABLE IF EXISTS X_10_DISTINCT_HEAP;
CREATE TABLE X_10_DISTINCT_HEAP (VAL VARCHAR(10) NOT …Run Code Online (Sandbox Code Playgroud)