好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQLServer中关于基数估计计算预估行数的一些方法探讨

关于SQL Server 2014中的基数估计,官方文档Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator里有大量细节介绍,但是全部是英文,估计也没有几个人仔细阅读。那么SQL Server 2014中基数估计的预估行数到底是怎么计算的呢? 有哪一些规律呢?我们下面通过一些例子来初略了解一下,下面测试案例仅供参考,如有不足或肤浅的地方,敬请指教!

下面实验测试的环境主要为SQL Server 2014 SP2 (Standard Edition (64-bit)) 具体版本号为12.0.5000.0 ,如有在其它版本测试,后面会做具体说明。如下所示,我们先创建一个测试表并插入一些测试数据后,方便后面的测试工作。

IF EXISTS(SELECT 1 FROM sys.objects WHERE type='U' AND name='TEST_ESTIMATED_ROW')
BEGIN
 DROP TABLE TEST_ESTIMATED_ROW;
END
IF NOT EXISTS(SELECT 1 FROM sys.objects WHERE type='U' AND name='TEST_ESTIMATED_ROW')
BEGIN
  CREATE TABLE TEST_ESTIMATED_ROW
  (
   ID  INT,
   NAME VARCHAR(24)
  )
END
GO
DECLARE @Index INT =1;
WHILE @Index <= 100
BEGIN
 INSERT INTO TEST_ESTIMATED_ROW
 VALUES(10, 'id is 10');
 SET @Index+=1;
END
GO
DECLARE @Index INT =1;
WHILE @Index <= 200
BEGIN
 INSERT INTO TEST_ESTIMATED_ROW
 VALUES(20, 'id is 20');
 SET @Index+=1;
END
GO
DECLARE @Index INT =1;
WHILE @Index <= 300
BEGIN
 INSERT INTO TEST_ESTIMATED_ROW
 VALUES(30, 'id is 30');
 SET @Index+=1;
END
GO
DECLARE @Index INT =1;
WHILE @Index <= 400
BEGIN
 INSERT INTO TEST_ESTIMATED_ROW
 VALUES(40, 'id is 40');
 SET @Index+=1;
END
GO
DECLARE @Index INT =1;
WHILE @Index <= 500
BEGIN
 INSERT INTO TEST_ESTIMATED_ROW
 VALUES(50, 'id is 50');
 SET @Index+=1;
END
GO
CREATE INDEX IX_TEST_ESTIMATED_ROW_N1 ON TEST_ESTIMATED_ROW(ID);
GO 

查看更多关于SQLServer中关于基数估计计算预估行数的一些方法探讨的详细内容...

  阅读:58次