cari
Rumahpangkalan datatutorial mysql第十二章SQLServer统计信息(2)非索引键上统计信息的影

前言: 索引 对性能方面总是扮演着一个重要的角色,实际上,查询优化器首先检查谓词上的 统计 信息 ,然后才决定用什么 索引 。一般情况下,默认会在创建 索引 时, 索引 列上均创建 统计 信息 。但是不代表在非 索引 键上的 统计 信息 对性能没有用。 如果

前言:

        索引对性能方面总是扮演着一个重要的角色,实际上,查询优化器首先检查谓词上的统计信息,然后才决定用什么索引。一般情况下,默认会在创建索引时,索引列上均创建统计信息。但是不代表在非索引键上的统计信息对性能没有用。

        如果表上的所有列都有索引,那么将会是数据库负担不起,同时也不是一个好想法,包括谓词中用到的所有列加索引同样也不是好方法。因为索引会带来负载。因为需要空间存放索引,且每个DML语句都会需要更新索引

        一般来说,建议在where或者ON子句中出现的列上添加索引,但是由于某些情况,很难在所有的谓词上都创建索引,此时创建统计信息会是一个最起码的改进。如果Auto_Create_StatisticsON,那么优化器会帮你做这一步。

 

准备工作:

默认情况下,Auto_Create_Statistics在数据库级别是设为ON的,但是为了下面需要这里先改成OFF

ALTER DATABASE AdventureWorks2012 SET AUTO_CREATE_STATISTICS OFF
GO
ALTER DATABASE AdventureWorks2012 SET AUTO_UPDATE_STATISTICS OFF
GO


 

 

然后创建一个新表用于本文使用:

SELECT  *
INTO    SalesOrdDemo
FROM    Sales.SalesOrderHeader
GO


 

步骤:

1、  对于新表,现在是没有统计信息在上面的,可以使下面语句来验证:

 

SELECT  object_id ,
        OBJECT_NAME(object_id) AS TableName ,
        name AS StatisticsName ,
        auto_created
FROM    sys.stats
WHERE   object_id = OBJECT_ID('SalesOrdDemo')
ORDER BY object_id DESC 
GO


 

 

因为没有统计信息,所以这个查询是没有数据的。

2、  现在在新表上创建一个聚集索引

 

 CREATE CLUSTERED INDEX idx_SalesOrdDemo_SalesOrderID ON SalesOrdDemo(SalesOrderID)
GO


 

 

3、  再次运行步骤一的脚本,可以看到已经有了数据,现在来执行下面的语句,并开启执行计划:

 

SELECT  s.salesorderid ,
        so.SalesOrderDetailID
FROM    salesordDemo AS s
        INNER JOIN Sales.SalesOrderDetail AS so ON s.salesorderid = so.SalesOrderID
WHERE   s.duedate = '2005-09-19 00:00:00.000'


 

4、  下面截图是步骤3中的执行计划,关注一下SalesOrdDemo表上有聚集索引扫描,这是合理的,因为没有WHERE子句在使用SalesOrderID列。而SalesOrderDetails表有非聚集索引扫描。还可以看到实际行数和估计行数有很大差异。

 

第十二章SQLServer统计信息(2)非索引键上统计信息的影

5、  现在是时候在新表的DueDate上创建统计信息,因为在查询中这个列并不包含在索引里面。

CREATE STATISTICS st_SaledOrdDemo_DueDate ON SalesOrdDemo(DueDate)
GO


 

6、  再次执行步骤3的脚本,不需要任何改动:

 

SELECT  s.salesorderid ,
        so.SalesOrderDetailID
FROM    salesordDemo AS s
        INNER JOIN Sales.SalesOrderDetail AS so ON s.salesorderid = so.SalesOrderID
WHERE   s.duedate = '2005-09-19 00:00:00.000'


 

 

7、  对比上面的执行计划,此时在SalesOrderDetails表上已经从非聚集索引扫描变成了聚集索引查找,且开销只有2%,更总要的是实际行数和预估行数相差无几:

 第十二章SQLServer统计信息(2)非索引键上统计信息的影

分析:

如果优化器可以获得谓词上列的统计信息,那么相会知道将要返回的行数,并且帮助优化器选择最佳的执行方式。

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
MySQL: Blob dan penyimpanan No-SQL yang lain, apakah perbezaannya?MySQL: Blob dan penyimpanan No-SQL yang lain, apakah perbezaannya?May 13, 2025 am 12:14 AM

Mysql'sblobissusuipableforstoringbinarydatawithinarelationaldatabase, sementara

MySQL Tambah Pengguna: Sintaks, Pilihan, dan Amalan Terbaik KeselamatanMySQL Tambah Pengguna: Sintaks, Pilihan, dan Amalan Terbaik KeselamatanMay 13, 2025 am 12:12 AM

Toaddauserinmysql, gunakan: createuser'username '@' host'identifiedby'password '; here'showtodoitsecurely: 1) choosethehostcareflelytocon trolaccess.2) SetResourcelImitSwithOptionsLikeMax_queries_per_hour.3) USESTRONG, UNIQUEPASSWORDS.4) Enforcessl/TLSConnectionswith

MySQL: Bagaimana untuk mengelakkan jenis data rentetan kesilapan biasa?MySQL: Bagaimana untuk mengelakkan jenis data rentetan kesilapan biasa?May 13, 2025 am 12:09 AM

Toavoidcommonmistakeswithstringdatatypesinmysql, fahamistringtypenuances, choosetherighttype, danManageencodingandcollationsettingsefectively.1) usecharfarfixed-lengthstrings, varcharforvariable-length, andtext/blobforlargerdata.2)

MySQL: Jenis data rentetan dan enum?MySQL: Jenis data rentetan dan enum?May 13, 2025 am 12:05 AM

Mysqloffersechar, varchar, teks, anddenumforstringdata.usecharforfixed-lengthstrings, varcharerforvariable-length, teks forlarger text, andenumforenforcingdataantegritywithaetofvalues.

Blob Mysql: Cara mengoptimumkan permintaan gumpalanBlob Mysql: Cara mengoptimumkan permintaan gumpalanMay 13, 2025 am 12:03 AM

Mengoptimumkan permintaan mysqlblob boleh dilakukan melalui strategi berikut: 1. Mengurangkan kekerapan pertanyaan gumpalan, gunakan permintaan bebas atau pemuatan kelewatan; 2. Pilih jenis gumpalan yang sesuai (seperti TinyBlob); 3. Pisahkan data gumpalan ke dalam jadual berasingan; 4. Mampat data gumpalan di lapisan aplikasi; 5. Indeks metadata gumpalan. Kaedah ini dapat meningkatkan prestasi dengan berkesan dengan menggabungkan pemantauan, caching dan data sharding dalam aplikasi sebenar.

Menambah Pengguna ke MySQL: Tutorial LengkapMenambah Pengguna ke MySQL: Tutorial LengkapMay 12, 2025 am 12:14 AM

Menguasai kaedah menambah pengguna MySQL adalah penting untuk pentadbir pangkalan data dan pemaju kerana ia memastikan keselamatan dan kawalan akses pangkalan data. 1) Buat pengguna baru menggunakan perintah CreateUser, 2) Berikan kebenaran melalui perintah geran, 3) Gunakan flushprivileges untuk memastikan kebenaran berkuatkuasa, 4) kerap mengaudit dan membersihkan akaun pengguna untuk mengekalkan prestasi dan keselamatan.

Menguasai Jenis Data String MySQL: Varchar vs Text vs. CharMenguasai Jenis Data String MySQL: Varchar vs Text vs. CharMay 12, 2025 am 12:12 AM

ChooseCHARforfixed-lengthdata,VARCHARforvariable-lengthdata,andTEXTforlargetextfields.1)CHARisefficientforconsistent-lengthdatalikecodes.2)VARCHARsuitsvariable-lengthdatalikenames,balancingflexibilityandperformance.3)TEXTisidealforlargetextslikeartic

MySQL: Jenis Data String dan Pengindeksan: Amalan TerbaikMySQL: Jenis Data String dan Pengindeksan: Amalan TerbaikMay 12, 2025 am 12:11 AM

Amalan terbaik untuk mengendalikan jenis data rentetan dan indeks dalam MySQL termasuk: 1) Memilih jenis rentetan yang sesuai, seperti char untuk panjang tetap, varchar untuk panjang berubah, dan teks untuk teks besar; 2) berhati-hati dalam pengindeksan, elakkan daripada mengindeks, dan buat indeks untuk pertanyaan umum; 3) Gunakan indeks awalan dan indeks teks penuh untuk mengoptimumkan carian rentetan panjang; 4) Secara kerap memantau dan mengoptimumkan indeks untuk memastikan indeks kecil dan cekap. Melalui kaedah ini, kita dapat mengimbangi membaca dan menulis prestasi dan meningkatkan kecekapan pangkalan data.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
Nordhold: Sistem Fusion, dijelaskan
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).