Maison base de données tutoriel mysql 关于动态抽样(DynamicSampling)

关于动态抽样(DynamicSampling)

Jun 07, 2016 pm 04:13 PM
à propos 动态 回答

本文将回答:什么是动态抽样?动态抽样有啥作用?以及不同级别的动态抽样的意思? 1、什么是动态采样? 动态抽样从 oracle 9i第2版引入。它使得优化器(CBO)在硬解析期间有能力抽样一个未分析的表 (any table that has been created and loaded but not ye


本文将回答:什么是动态抽样?动态抽样有啥作用?以及不同级别的动态抽样的意思?


1、什么是动态采样?
动态抽样从 oracle 9i第2版引入。它使得优化器(CBO)在硬解析期间有能力抽样一个未分析的表
(any table that has been created and loaded but not yet analyzed)的统计(决定表默认统计),并且可以验证优化器的”猜想“。
因其只在查询硬解析期间为优化器动态生成更好的统计,得名动态采样。


动态采样提供11个设置级别。注意:9i中其默认值为1 到了10g默认值为2


2、动态采样如何工作?
有两种使用方式:
△ 设置OPTIMIZER_DYNAMIC_SAMPLING参数,可以再实例和会话级别设置动态采样。
△ 使用DYNAMIC_SAMPLING hint


来看一下不使用动态采样的日子怎么过的
create table t
as
select owner, object_type
from all_objects
/




select count(*) from t;


COUNT(*)
------------------------
68076
Copier après la connexion

code1: 禁用动态采样观察默认基数


set autotrace traceonly explain
SQL> select /*+ dynamic_sampling(t 0) */ * from t;


Execution Plan
------------------------------
Plan hash value: 1601196873


--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 16010 | 437K| 55 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T | 16010 | 437K| 55 (0)| 00:00:01 |
--------------------------------------------------------------------------
Copier après la connexion



--注意0级别即为禁用动态采样,环境默认是开启动态采样的


执行计划显示基数:16010远低于上面查询的68076,明显不靠谱。


code2: 更加接近显示的基数
select * from t;


Execution Plan
------------------------------
Plan hash value: 1601196873


--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 77871 | 2129K| 56 (2)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T | 77871 | 2129K| 56 (2)| 00:00:01 |
--------------------------------------------------------------------------


Note
------------------------------------------
- dynamic sampling used for this statement




code3: 被高估的基数
SQL> delete from t;
68076 rows deleted.


SQL> commit;
Commit complete.


SQL> set autotrace traceonly explain
SQL> select /*+ dynamic_sampling(t 0) */ * from t;


Execution Plan
------------------------------
Plan hash value: 1601196873


--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 16010 | 437K| 55 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T | 16010 | 437K| 55 (0)| 00:00:01 |
--------------------------------------------------------------------------


SQL> select * from t;


Execution Plan
-----------------------------
Plan hash value: 1601196873


------------------------------------------------------------------------【本文来自鸿网互联 (http://www.68idc.cn)】--
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 28 | 55 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T | 1 | 28 | 5 (0)| 00:00:01 |
--------------------------------------------------------------------------


Note
---------------------------------------
- dynamic sampling used for this statement
Copier après la connexion



3、动态采样何时帮助优化器验证其猜测?
我们知道当使用DBMS_STATS收集了表信息后,优化器会得到以下统计:
1)表,行数,平均行宽等;
2)单独列,高低值,唯一值数量,直方图(可能)等;
3)单独索引,聚集因素,叶子块数量,索引高度等。


但注意这里面缺少了某些关键统计信息,例如表中不同列数据之间的关联!
假设你你有一个全球人口普查表!
一个属性是:出生月份MONTH_BORN_IN,另一个属性是:所属星座ZODIAC_SIGN。收集信息后,你问优化器出生在11月份的人数?
假设12个月人数正常分布,那么优化器很快给出答案是全量数据的1/12!再问一个:星座是双鱼座的人数呢?答案也是1/12!
迄今为止优化器对答如流!!!nice work!
但是第3个问题来了:出生在11月份并且星座是双鱼座的人数是多少呢?
明眼人转下脑子就知道答案是0(双鱼座2月19日-3月20日)!但是我们看优化器的答案:1/12/12!!! 多么异想天开的答案,思维定式!这样就会诞生差的执行计划,
也正是在此时我们的动态采样开始干预:


code4: 创建模拟数据
SQL > create table t
as select decode( mod(rownum,2), 0, 'N', 'Y' ) flag1,
decode( mod(rownum,2), 0, 'Y', 'N' ) flag2, a.*
from all_objects a
/
Table created.


SQL > create index t_idx on t(flag1,flag2);
Index created.


SQL > begin
dbms_stats.gather_table_stats
( user, 'T',
method_opt=>'for all indexed columns size 254' );
end;
/
PL/SQL procedure successfully completed.


SQL> select num_rows, num_rows/2,
num_rows/2/2 from user_tables
where table_name = 'T';


NUM_ROWS NUM_ROWS/2 NUM_ROWS/2/2
-------- ---------- ------------
68076 34038 17019


code5:验证一下上面的说法:
SQL> set autotrace traceonly explain
SQL> select * from t where flag1='N';


Execution Plan
------------------------------
Plan hash value: 1601196873


--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 33479 | 3432K| 292 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| T | 33479 | 3432K| 292 (1)| 00:00:04 |
--------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("FLAG1"='N')


SQL> select * from t where flag2='N';


Execution Plan
----------------------------
Plan hash value: 1601196873


---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 34597 | 3547K| 292 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| T | 34597 | 3547K| 292 (1)| 00:00:04 |
---------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------


1 - filter("FLAG2"='N')


--至此一切正常!so far, so good!


code5: here comes the problem
SQL> select * from t where flag1 = 'N' and flag2 = 'N';


Execution Plan
----------------------------
Plan hash value: 1601196873


--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 17014 | 1744K| 292 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| T | 17014 | 1744K| 292 (1)| 00:00:04 |
--------------------------------------------------------------------------


Predicate Information (identified by operation id):
----------------------------------------------------


1 - filter("FLAG1" = 'N' AND "FLAG2" = 'N')


--验证了我们前面说的优化器此时异想天开了


code7: 动态采样听令,开始介入
SQL> select /*+ dynamic_sampling(t 3) */ * from t where flag1 = 'N' and flag2 = 'N';


Execution Plan
-----------------------------
Plan hash value: 470836197


------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6 | 630 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 6 | 630 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | T_IDX | 6 | | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------


Predicate Information (identified by operation id):
----------------------------------------------------


2 - access("FLAG1"='N' AND "FLAG2"='N')
Copier après la connexion


code8: 我们打开SQL_TRACE会看到以下语句:
SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE
NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false')
NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),:"SYS_B_00"),
NVL(SUM(C2),:"SYS_B_01"), NVL(SUM(C3),:"SYS_B_02")
FROM
(SELECT /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("T") FULL("T")
NO_PARALLEL_INDEX("T") */ :"SYS_B_03" AS C1, CASE WHEN "T"."FLAG1"=
:"SYS_B_04" AND "T"."FLAG2"=:"SYS_B_05" THEN :"SYS_B_06" ELSE :"SYS_B_07"
END AS C2, CASE WHEN "T"."FLAG2"=:"SYS_B_08" AND "T"."FLAG1"=:"SYS_B_09"
THEN :"SYS_B_10" ELSE :"SYS_B_11" END AS C3 FROM "T" SAMPLE BLOCK
(:"SYS_B_12" , :"SYS_B_13") SEED (:"SYS_B_14") "T") SAMPLESUB
Copier après la connexion


可以看出来优化器在验证其猜想。。。


4、动态采样级别:
现在列出11个级别,详细请参考:http://docs.oracle.com/cd/B19306_01/server.102/b14211/stats.htm#i43032
1)Level 0: Do not use dynamic sampling.
0级:不使用动态采样。


2)Level 1: Sample all tables that have not been analyzed if the following criteria are met: (1) there is at least 1 unanalyzed table in the query; (2) this unanalyzed table is joined to another table or appears in a subquery or non-mergeable view; (3) this unanalyzed table has no indexes; (4) this unanalyzed table has more blocks than the number of blocks that would be used for dynamic sampling of this table. The number of blocks sampled is the default number of dynamic sampling blocks (32).
1级:满足以下条件则采样所有没被分析的表:
(1)查询中至少有一个未分析表;
(2)这个未分析表被关联另外一个表或者出现在子查询或非merge视图中;
(3)这个未分析表有索引;
(4)这个未分析表有多余动态采样默认的数据块数(默认是32块)。


3)Level 2: Apply dynamic sampling to all unanalyzed tables. The number of blocks sampled is two times the default number of dynamic sampling blocks.
2级:对所有未分析表进行动态采样。采样数据块数量是默认数量的2倍。


4)Level 3: Apply dynamic sampling to all tables that meet Level 2 criteria, plus all tables for which standard selectivity estimation used a guess for some predicate that is a potential dynamic sampling predicate. The number of blocks sampled is the default number of dynamic sampling blocks. For unanalyzed tables, the number of blocks sampled is two times the default number of dynamic sampling blocks.
3级:在2级基础上加上那些使用了猜想选择消除表,采样数据块数量等于默认数量。对于未分析表,采样数量2倍于默认数量。




5)Level 4: Apply dynamic sampling to all tables that meet Level 3 criteria, plus all tables that have single-table predicates that reference 2 or more columns. The number of blocks sampled is the default number of dynamic sampling blocks. For unanalyzed tables, the number of blocks sampled is two times the default number of dynamic sampling blocks.
4级:在3级基础上加上那些有单表谓词关联2个或多个列,采样数据块数量等于默认数量。对于未分析表,采样数量2倍于默认数量。




6)Levels 5, 6, 7, 8, and 9: Apply dynamic sampling to all tables that meet the previous level criteria using 2, 4, 8, 32, or 128 times the default number of dynamic sampling blocks respectively.
5,6,7,8,9级在4级基础上分别使用2,4,8,32,128倍于默认动态采样数据块数量。


7)Level 10: Apply dynamic sampling to all tables that meet the Level 9 criteria using all blocks in the table.
10级:在9级基础上对表中所有数据块进行采样。


5、什么时候适合采用动态采样?


这是一个狡猾的问题,没有一定使用经验,还真不好意思说。
通常:
1)我们使用3和4级进行动态采样。
2)如果我们SQL的解析时间很快但是执行时间巨慢,可以考虑使用动态采样。典型的就是数据仓库系统。
3)OLTP系统中都是一个SQL重复执行,解析和执行都在瞬息之间,所以不建议使用高级别的动态采样。这会给SQL带来硬解析消耗。
这个时候可以考虑SQL Profile,你可以理解为“静态采样”。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel Java
1663
14
Tutoriel PHP
1266
29
Tutoriel C#
1239
24
Correctif : le taux de rafraîchissement dynamique de Windows 11 ne fonctionne pas Correctif : le taux de rafraîchissement dynamique de Windows 11 ne fonctionne pas Apr 13, 2023 pm 08:52 PM

Vous pouvez mesurer le taux de rafraîchissement d'un écran en comptant le nombre de fois où l'image est mise à jour par seconde. DRR est une nouvelle fonctionnalité incluse dans Windows 11 qui vous aide à économiser la batterie tout en offrant un affichage plus fluide, mais il n'est pas surprenant qu'elle ne fonctionne pas correctement. Les écrans avec des taux de rafraîchissement plus élevés devraient devenir plus courants à mesure que de plus en plus de fabricants annoncent leur intention d'arrêter de produire des moniteurs à 60 Hz. Cela se traduira par un défilement plus fluide et un meilleur jeu, mais cela se fera au prix d’une durée de vie réduite de la batterie. Cependant, la fonctionnalité de taux de rafraîchissement dynamique dans cette itération du système d’exploitation est un ajout astucieux qui peut avoir un impact important sur votre expérience globale. Poursuivez votre lecture pendant que nous discutons de ce qu'il faut faire si le taux de rafraîchissement dynamique de Windows 11 ne fonctionne pas

Comment masquer l'îlot dynamique et l'indicateur rouge dans l'enregistrement d'écran de l'iPhone Comment masquer l'îlot dynamique et l'indicateur rouge dans l'enregistrement d'écran de l'iPhone Apr 13, 2023 am 09:13 AM

Sur iPhone, la fonction d'enregistrement d'écran d'Apple enregistre une vidéo de ce que vous faites sur l'écran, ce qui est utile si vous souhaitez capturer un jeu, guider quelqu'un à travers un didacticiel dans une application, démontrer un bug ou toute autre chose. Sur les anciens iPhones dotés d'une encoche en haut de l'écran, l'encoche n'est pas visible lors de l'enregistrement d'écran, comme elle devrait l'être. Mais sur les iPhones plus récents avec la découpe ‌Dynamic Island‌, tels que le ‌iPhone 14 Pro‌ et l'‌iPhone 14 Pro‌ Max, l'animation ‌Dynamic Island‌ affiche l'indicateur d'enregistrement rouge, ce qui rend la découpe visible dans les vidéos capturées. cela pourrait

Convertir le disque fixe VirtualBox en disque dynamique et vice versa Convertir le disque fixe VirtualBox en disque dynamique et vice versa Mar 25, 2024 am 09:36 AM

Lors de la création d'une machine virtuelle, il vous sera demandé de sélectionner un type de disque, vous pouvez sélectionner un disque fixe ou un disque dynamique. Et si vous choisissez des disques fixes et réalisez plus tard que vous avez besoin de disques dynamiques, ou vice versa, vous pouvez convertir l'un en l'autre ? Dans cet article, nous verrons comment convertir un disque fixe VirtualBox en disque dynamique et vice versa. Un disque dynamique est un disque dur virtuel qui a initialement une petite taille et qui augmente à mesure que vous stockez des données dans la machine virtuelle. Les disques dynamiques sont très efficaces pour économiser de l'espace de stockage, car ils n'occupent que l'espace de stockage de l'hôte nécessaire. Cependant, à mesure que la capacité du disque augmente, les performances de votre ordinateur peuvent être légèrement affectées. Les disques fixes et les disques dynamiques sont couramment utilisés dans les machines virtuelles

Comment convertir un disque dynamique en disque de base sous Windows 11 Comment convertir un disque dynamique en disque de base sous Windows 11 Sep 23, 2023 pm 11:33 PM

Si vous souhaitez convertir un disque dynamique en disque de base sous Windows 11, vous devez d'abord créer une sauvegarde car le processus effacera toutes les données qu'il contient. Pourquoi devriez-vous convertir un disque dynamique en disque de base sous Windows 11 ? Selon Microsoft, les disques dynamiques sont obsolètes depuis Windows et leur utilisation n'est plus recommandée. De plus, Windows Home Edition ne prend pas en charge les disques dynamiques, vous ne pourrez donc pas accéder à ces lecteurs logiques. Si vous souhaitez combiner plus de disques dans un volume plus grand, il est recommandé d'utiliser des disques de base ou des espaces de stockage. Dans cet article, nous allons vous montrer comment convertir un disque dynamique en disque de base sous Windows 11. Comment convertir un disque dynamique en disque de base sous Windows 11 ? au début

Comment obtenir des vignettes dynamiques sur le bureau et le menu Démarrer sous Windows 11 Comment obtenir des vignettes dynamiques sur le bureau et le menu Démarrer sous Windows 11 Apr 14, 2023 pm 05:07 PM

Imaginez que vous recherchez quelque chose sur votre système mais que vous ne savez pas quelle application ouvrir ou sélectionner. C'est là que la fonctionnalité Live Tiles entre en jeu. Une vignette dynamique pour toute application prise en charge peut être ajoutée au menu Démarrer du bureau ou du système Windows, ses vignettes changeant fréquemment. Les LiveTiles donnent vie aux widgets d'application d'une manière très agréable. Pas seulement pour son apparence, mais aussi pour sa commodité. Supposons que vous utilisiez l'application WhatsApp ou Facebook sur votre système, ne serait-il pas pratique que le nombre de notifications soit affiché sur l'icône de l'application ? Ceci est possible si une telle application prise en charge est ajoutée en tant que vignette dynamique. Voyons comment le faire sous Windows

Comment désactiver l'affichage dynamique des dossiers et fichiers pour empêcher un accès rapide sous Windows 10 et 11 ? Comment désactiver l'affichage dynamique des dossiers et fichiers pour empêcher un accès rapide sous Windows 10 et 11 ? May 06, 2023 pm 04:58 PM

Microsoft a introduit l'accès rapide dans Windows 10 et a conservé la fonctionnalité dans le système d'exploitation Windows 11 récemment publié. L'accès rapide remplace le système de favoris dans l'explorateur de fichiers. L'une des principales différences entre les deux fonctionnalités est que Quick Access ajoute un composant dynamique à sa liste. Certains dossiers apparaissent de manière permanente, tandis que d'autres apparaissent en fonction de leur utilisation. Les dossiers fixes sont affichés avec une icône en forme d'épingle, tandis que les dossiers dynamiques n'ont pas une telle icône. Vous pouvez voir une comparaison entre Mes favoris et Accès rapide ici pour plus de détails. L'accès rapide est plus puissant que les favoris, mais les listes de dossiers dynamiques y ajoutent un élément de fouillis. Les fichiers inutiles ou qui ne doivent pas être mis en surbrillance dans l'Explorateur de fichiers peuvent être affichés

Comment utiliser le verrouillage dynamique sur Windows 11 Comment utiliser le verrouillage dynamique sur Windows 11 Apr 13, 2023 pm 08:31 PM

Qu’est-ce que le verrouillage dynamique sur Windows 11 ? Dynamic Lock est une fonctionnalité de Windows 11 qui verrouille votre ordinateur lorsqu'un appareil Bluetooth connecté (votre téléphone ou portable) devient hors de portée. La fonction Dynamic Lock verrouille automatiquement votre PC même si vous oubliez d'utiliser le raccourci Windows Key + L en vous éloignant. Dynamic Lock fonctionne avec n'importe quel appareil connecté via Bluetooth, mais il est préférable d'utiliser un appareil doté d'une batterie et d'une autonomie suffisantes, comme votre téléphone. Une fois que votre appareil devient inaccessible pendant 30 secondes, Windows verrouille automatiquement l'écran. Associer un appareil Bluetooth avec Windows 11 Pour que tout fonctionne correctement, vous devez d'abord

Comment créer un carrousel d'images dynamique en utilisant HTML, CSS et jQuery Comment créer un carrousel d'images dynamique en utilisant HTML, CSS et jQuery Oct 25, 2023 am 10:09 AM

Comment utiliser HTML, CSS et jQuery pour créer un carrousel d'images dynamiques Dans la conception et le développement de sites Web, le carrousel d'images est une fonction fréquemment utilisée pour afficher plusieurs images ou bannières publicitaires. Grâce à la combinaison de HTML, CSS et jQuery, nous pouvons obtenir un effet carrousel d'images dynamique, ajoutant de la vitalité et de l'attrait au site Web. Cet article explique comment utiliser HTML, CSS et jQuery pour créer un carrousel d'images dynamique simple et fournit des exemples de code spécifiques. Étape 1 : Configurer la jonction HTML

See all articles