Meta tags:
description= Comment utiliser les expressions rationnelles dans Microsoft SQL Server 2025.;
Headings (most frequently used words):
de, les, des, correspondances, pour, expressions, rationnelles, sql, server, 2025, la, chaînes, validation, dans, tvf, analyse, performance, impact, cpu, et, données, estimation, cardinalité, requête, avant, fonctions, regex, fonction, regexp_like, valide, regexp_replace, transformer, regexp_substr, extrait, sous, regexp_count, quantifie, occurrences, regexp_instr, localise, regexp_matches, détaille, toutes, regexp_split_to_table, découpe, syntaxe, re2, exemples, concrets, utilisation, stratégies, optimisation, réduire, restrictions, quatre, flags, contrôlent, le, comportement, adresses, email, numéros, téléphone, français, codes, postaux, siret, nettoyage, transformation, masquage, sensibles, options, influence, complexité, expression, rationnelle, sur, performances, sargabilité, une, simple, pré, filtrer, avec, prédicats, rapides, persister, résultats, validations, fréquentes, règles, conception, patterns, mesurer, tag, cloud, categories,
Text of the page (most frequently used words):
les (130), sql (60), pour (59), des (58), une (58), select (56), contact (54), from (51), server (50), #regexp_like (47), email (46), avec (45), est (38), dans (38), cpu (35), where (33), regex (33), table (31), chaîne (31), sur (29), index (24), time (22), lastname (21), estimation (19), lignes (19), par (19), like (18), pas (18), 2025 (18), cardinalité (18), regexp_substr (18), posts (17), contactid (17), expressions (17), rationnelles (17), regexp_replace (17), requête (16), title (16), scan (16), chaînes (16), fonctions (16), pattern (15), caractères (15), exécution (15), regexp_count (15), flags (15), motif (15), données (14), qui (14), count (14), reads (14), set (13), que (13), plus (13), cela (13), non (12), option (12), casse (12), expression (12), rationnelle (12), retourne (12), sous (12), position (12), colonne (11), mais (11), varchar (11), clustered (11), performances (11), validation (11), correspondances (11), regexp_split_to_table (11), regexp_instr (11), secondes (10), 170 (10), ligne (10), sont (10), regexp_matches (10), end (9), else (9), then (9), when (9), case (9), alter (9), parallélisme (9), requêtes (9), temps (9), minutes (9), consomme (9), simple (9), use (9), pachadatatraining (9), correspondance (9), not (9), nvarchar (9), chiffres (9), compatibilité (9), occurrence (9), comme (8), execution (8), niveau (8), performance (8), cas (8), fera (8), database (8), donc (8), base (8), null (8), 17142200 (8), recherche (8), aux (8), groupes (8), string_expression (8), pattern_expression (8), utiliser (7), quantificateurs (7), elapsed (7), times (7), fonction (7), collation (7), compatibility_level (7), exemple (7), valide (7), correspond (7), utilisation (7), declare (7), français (7), phone (7), occurrences (7), syntaxe (7), tvf (7), paramètre (7), statistiques (6), impact (6), classes (6), patterns (6), consommation (6), utilise (6), hint (6), assume_fixed_min_selectivity_for_regexp (6), insensible (6), plan (6), début (6), elle (6), nombre (6), invalid (6), logical (6), name (6), défaut (6), mot (6), re2 (6), firstname (6), entier (6), statistics (5), analyse (5), avant (5), sans (5), réduire (5), filtrer (5), comportement (5), nous (5), top (5), deux (5), sargabilité (5), complexité (5), adresses (5), moins (5), ces (5), true (5), type (5), correspondant (5), masquage (5), espaces (5), fin (5), limite (5), cette (5), start (5), extrait (5), scalaire (5), tous (4), plutôt (4), possible (4), colonnes (4), résultat (4), order (4), coeurs (4), permet (4), traiter (4), première (4), mots (4), voyons (4), code (4), sensible (4), seek (4), multi (4), ici (4), autres (4), environ (4), 319 (4), même (4), validationemail (4), valid (4), options (4), tablecardinality (4), 3097 (4), estimatedtotalsubtreecost (4), physicalop (4), parallel (4), logicalop (4), estimatedrowsread (4), estimaterows (4), estimatedexecutionmode (4), 3088 (4), estimateio (4), 42827 (4), estimatecpu (4), 261 (4), avgrowsize (4), relop (4), compter (4), memory (4), estimateur (4), erreur (4), physical (4), read (4), ahead (4), texteoriginal (4), extraction (4), contenu (4), transformation (4), siret (4), uniquement (4), téléphone (4), patternemail (4), mode (4), capture (4), 000 (4), répétitions (4), perl (4), ordinal (4), toutes (4), concat (4), localise (4), lob (4), remplacement (4), check (4), complexes (4), administration (4), transactions (4), rudi (3), bruchez (3), expertise (3), exécuter (3), ancres (3), éviter (3), greedy (3), règles (3), clients (3), cast (3), add (3), gmail (3), com (3), rapide (3), pré (3), essayons (3), entre (3), maxdop (3), peut (3), maximum (3), titres (3), serveur (3), utf (3), lastnameutf8 (3), int (3), être (3), optimiseur (3), car (3), flag (3), sargable (3), montre (3), commençant (3), elles (3), donne (3), permettent (3), vous (3), bien (3), retournées (3), opérateur (3), estimer (3), worktable (3), mldr (3), contient (3), emails (3), xxxx (3), numerocarte (3), numéros (3), documents (3), texte (3), articles (3), inactif (3), contrôlent (3), word (3), références (3), nom (3), supporte (3), minimum (3), apply (3), cross (3), value (3), découpe (3), détails (3), extraire (3), détaille (3), group (3), types (3), max (3), compte (3), tandis (3), ressources (3), restrictions (3), tables (3), always (3), architecture (3), clr (3), docs (3), maintenance (3), transaction (3), alwayson (3), diagnostic (3), journaux (3), votre (2), mesurer (2), lisibilité (2), explicites (2), trop (2), recherches (2), conception (2), emailvalide (2), create (2), persistée (2), persister (2), résultats (2), validations (2), fréquentes (2), and (2), abord (2), bon (2), toute (2), prédicats (2), rapides (2), stratégies (2), optimisation (2), voit (2), vraiment (2), charge (2), bound (2), avons (2), mon (2), physiques (2), threads (2), logiques (2), vais (2), fois (2), contenant (2), exactement (2), binaire (2), collate (2), essayé (2), tout (2), sql_latin1_general_cp1_ci_as (2), était (2), assure (2), nécessaire (2), faire (2), malgré (2), également (2), single (2), indique (2), été (2), caractère (2), cherche (2), abc (2), certaines (2), ont (2), peuvent (2), complexe (2), manière (2), doute (2), trois (2), influence (2), notre (2), erreurs (2), assume_fixed_max_selectivity_for_regexp (2), nodeid (2), batch (2), row (2), corriger (2), propose (2), iqp (2), fonctionnalités (2), disponibles (2), query (2), fait (2), pourcentage (2), fixe (2), 542 (2), 800 (2), 142 (2), 200 (2), identique (2), plans (2), faux (2), très (2), loin (2), 467 (2), toujours (2), indexscan (2), 100 (2), 250 (2), moteur (2), depuis (2), problème (2), modèle (2), comment (2), lent (2), fonctionnalité (2), degré (2), aussi (2), stackoverflow2013 (2), comparaisons (2), basiques (2), paiements (2), cartemasquee (2), carte (2), bancaire (2), sensibles (2), codepostal (2), update (2), nettoyage (2), patternsiret (2), reference (2), invalide (2), zipcode (2), patterncp (2), postal (2), codes (2), postaux (2), patterntelfr (2), sum (2), rapport (2), exemples (2), concrets (2), plusieurs (2), insensibilité (2), spécifié (2), line (2), limites (2), valeur (2), description (2), quatre (2), match (2), arrière (2), zéro (2), posix (2), offrent (2), raccourcis (2), alphabétiques (2), upper (2), lower (2), newline (2), métacaractères (2), ancre (2), spéciaux (2), nécessitent (2), tag (2), découper (2), python (2), java (2), javascript (2), retournée (2), divise (2), selon (2), délimiteur (2), match_id (2), match_value (2), chaque (2), entrée (2), json (2), noms (2), trouver (2), domaine (2), return_option (2), contrôle (2), verse (2), montantht (2), jusqu (2), quantifie (2), sys (2), text (2), address (2), groupe (2), positif (2), nième (2), définit (2), remplace (2), string_replacement (2), capacités (2), support (2), complète (2), transformer (2), constraint (2), garantit (2), fonctionner (2), configuration (2), échoue (2), octets (2), booléen (2), teste (2), lookbehind (2), supportent (2), procédures (2), stockées (2), bibliothèque (2), modifier (2), vérifier (2), leurs (2), positions (2), azure (2), microsoft (2), taille (2), scalaires (2), assemblies (2), patindex (2), contraintes (2), shrink (2), mémoire (2), journal (2), installation (2), optimiser (2), compteurs (2), analyser (2), auto (2), sauvegardes (2), tempdb (2), pourquoi (2), droits, réservés, 2026, besoin, services, contactez, moi, parlons, projet, off, grandetable, activation, évaluer, activer, préférer, génériques, backtracking, quand, partielles, coûteuses, ancrer, ix_clients_emailvalide, persisted, bit, ajouter, calculée, fréquemment, validées, calculer, stocker, évite, recalculs, subset, filtre, filtrage, puis, mauvais, stratégie, efficace, consiste, volume, appliquer, aide, répartir, importante, attendu, opérations, légèrement, différent, plupart, opérationnelles, habitude, paralléliser, 431, compromis, 431595, 55577, terstons, diminue, augmente, 672, quart, explique, processeur, amd, ryzen, 3700x, smt, totale, dépasser, capacité, 672954, 43590, machine, pousser, son, 320, défini, 320221, 82955, lance, observer, prenons, aucun, permis, obtenir, soit, into, insert, ix_temp_lastnameutf8, latin1_general_100_cs_as_sc_utf8, french_bin2, ix_temp_lastname, key, primary, drop, suis, demandé, pouvait, lié, créé, temporaire, indexées, seconde, essayer, augmenter, chances, ajouté, aidé, voulais, avoir, faible, encourager, indispensable, affichant, lookup, couvre, besoins, rien, changé, restée, info, essai, considérée, présence, evidemment, serait, présentées, termes, potentiellement, tirer, parti, améliorer, optimisées, scans, seeks, sargables, direct, relatif, troisième, rigoureuse, mêmes, deuxième, précise, parce, précis, relativement, basique, testons, croissante, valider, simpler, less, accurate, voir, produit, différences, significatives, 710, 571, 080, réaliser, grands, progrès, énormes, 8571080, 85710, permettre, manuellement, grosses, idée, lors, grants, édition, enterprise, pis, aller, ajuster, dynamiquement, intelligent, processing, semble, vérification, comments, notez, sûr, totalement, réelle, estime, réellement, énorme, entraîner, grant, excessif, tri, hash, 1542800, maintenant, faits, assez, proche, 247, 100247, cherchons, contiennent, sait, basant, présentes, 2005, premiers, marche, majeur, capable, correctement, statistique, pourriez, 1013526, 537002, 4190377, 4171470, convertie, 1013, cet, aspect, significatif, noter, impliquant, clairement, stricte, 31x, apportée, 999970, 527492, 4189766, 4172078, gain, global, opération, lourde, 999, 483825, 258479, 4186772, 4169796, 483, 32310, 19485, 4188571, 4168983, 169, effectuosn, quelques, analyses, emailmasque, partiel, telmobile, plaquefr, structurées, libre, supprimer, multiples, entreprises, city, statutcp, commence, normalizedphone, normalisation, garder, statut, mobile, emailsinvalides, emailsvalides, totalemails, qualité, valides, complet, tld, textemultiligne, nombrelignes, combinaison, contenunettoye, textes, simon, combinent, active, contradictoires, dernier, prévaut, retours, correspondent, actif, positionnent, absolu, absolue, boundary, parenthèses, créent, numérotés, capturants, optimisent, traitement, nommés, améliorent, réutiliser, captures, limités, restriction, signifie, versions, lazy, ajoutent, alternative, lisible, alphanumériques, minuscules, majuscules, hexadécimaux, xdigit, space, digit, alpha, alnum, simplifient, courants, équivaut, blancs, espace, tab, standards, sauf, échappe, représente, alternance, logique, crochets, définissent, tags, clientid, chat, mange, souris, liste, compétences, based, competences, employes, employeid, hashtag, découvrez, sqlserver2025, dataprocessing, hashtags, bigint, séquence, substring_matches, end_position, start_position, détail, secondspace, firstspace, nomcomplet, complets, positionat, positiondomain, détermine, travel, restaurant, clobinfo, nombrecles, jsoninfo, clés, verses, nbofwords, enrollment, invoice, conversion, implicite, nombrechiffres, messages, aeiouàâäéèêëïîôùûü, premier, voyelle, avenue, marechal, foch, 69006, lyon, isabelle, arco, prénom, séparément, domain, username, utilisateur, spécifique, capturé, partie, fonctionne, importe, quel, contacts, telephone, telephonenettoye, suppression, numériques, result, 2ème, derniers, formattedphone, 0612345678, formatage, numéro, pouvez, référencent, capturés, référence, back, references, substitution, vide, départ, spécifie, quelle, remplacer, cible, offre, avancées, ck_contact_telephone_valid, ck_contact_email_valid, contrainte, intégrité, insertion, clause, changer, nécessite, accepte, incluant, optionnel, classique, utilisé, prédicat, false, nchar, char, msg, 19300, level, state, was, provided, error, operator, occurred, during, evaluation, the, message, initcap, suivante, longueur, maximale, limitées, vaut, mieux, dit, raisons, absence, rend, gourmande, lookahead, limitent, certains, contextes, compilées, nativement, oltp, optimized, incompatibles, respectent, collations, linguistiques, strictement, basé, unicode, supportés, limitation, due, utilisée, large, objects, mabase, db_name, databases, actuel, courante, niveaux, utilisez, commandes, suivantes, correspondantes, extraite, modifiée, vrai, paramètres, principaux, plateformes, supportées, incluent, managed, instance, politique, mise, jour, date, fabric, appuient, linéaire, évitant, attaques, déni, service, possibles, moteurs, sécurisée, redos, google, utilisant, génèrent, ensembles, effectue, remplacements, retournent, manipuler, valued, functions, cinq, pallier, limitations, solutions, alternatives, courantes, intégrer, bibliothèques, complètes, net, formes, pose, évidence, personnalisées, via, gestion, limitée, natives, telles, découpage, puissance, flexibilité, modernes, simplifiée, jokers, seulement, string_split, outil, fondamental, manipulation, avancée, permettant, définir, motifs, textuelles, intégration, native, filtrés, interopérabilité, vingt, ans, attendait, élimine, recours, simplifie, nombreux, enfin, directement, natif, version, publiée, décembre, enrichir, article, futur, informations, précises, lire, tuning, categories, wsfc, windows, log, supervision, sauvegarde, restauration, parallelisme, dba, backup, cloud, page, entreprise, verrous, indexation, événements, étendus, matériel, introduction, livre, téléchargements, liens, utiles, ajout, réplication, rcsi, store, conversions, implicites, cardinality, estimator, bloquer, blocages, gérer, incréments, modélisation, problèmes, kvm, docker, linux, standard, comprendre, basic, availability, groups, bag, maîtriser, timeouts, dbatools, hadr, tracer, sp_whoisactive, deadlock, allocations, dev, fichiers, déplacer, bases, systèmes, mongodb, analytique, instances, bcp, prtg, monitoring, errorlog, backups, compression, howtos, ram, normal, dark, light, english, blog, formations,
Text of the page (random words):
pécifique 0 retourne le match entier défaut tandis qu un entier positif retourne le nième groupe capturé extraire le nom d utilisateur et le domaine d un email select contactid email regexp_substr email as username regexp_substr email 1 1 1 as domain from contact contact where email is not null extraction du prénom et du nom séparément declare name varchar 50 isabelle d arco select name regexp_substr name w 1 1 as firstname regexp_substr name w 1 2 as lastname extraction d un code postal français declare address varchar 50 55 avenue marechal foch 69006 lyon select regexp_substr address b d 5 b 1 1 as codepostal premier mot commençant par une voyelle select regexp_substr m text b aeiouàâäéèêëïîôùûü w 1 1 i as word m text from sys messages m regexp_count quantifie les occurrences regexp_count compte le nombre de correspondances d un pattern dans une chaîne regexp_count string_expression pattern_expression start flags cette fonction supporte les types lob n varchar max jusqu à 2 mo et retourne un entier compter les chiffres dans une chaîne select top 10 montantht regexp_count cast montantht as varchar 50 d as nombrechiffres pas de conversion implicite from enrollment invoice compter les mots select verse regexp_count verse b w b as nbofwords from ai verses compter les clés dans une chaîne json select top 10 jsoninfo regexp_count clobinfo s as nombrecles from travel restaurant regexp_instr localise les correspondances regexp_instr retourne la position d une correspondance avec contrôle fin sur le résultat regexp_instr string_expression pattern_expression start occurrence return_option flags group le paramètre return_option détermine si la fonction retourne la position de début 0 défaut ou de fin 1 de la correspondance trouver la position du domaine dans l email select contactid email regexp_instr email a za z0 9 a za z 2 as positiondomain regexp_instr email as positionat from contact contact where email is not null position des espaces dans les noms complets select contactid concat firstname lastname as nomcomplet regexp_instr concat firstname lastname s as firstspace regexp_instr concat firstname lastname s 1 2 as secondspace from contact contact where firstname is not null and lastname is not null regexp_matches tvf détaille toutes les correspondances regexp_matches retourne une table avec le détail de chaque correspondance regexp_matches string_expression pattern_expression flags la table retournée contient les colonnes match_id bigint séquence start_position int end_position int match_value même type que l entrée et substring_matches json détails des sous groupes extraire tous les hashtags d un texte select from regexp_matches découvrez sqlserver2025 et les regex pour dataprocessing a za z0 9_ retourne 3 lignes avec détails de chaque hashtag utilisation avec cross apply sur une table select e employeid m match_id m match_value from employes e cross apply regexp_matches e competences w as m regexp_split_to_table tvf découpe les chaînes regexp_split_to_table divise une chaîne en lignes selon un pattern délimiteur regexp_split_to_table string_expression pattern_expression flags la table retournée contient value sous chaîne et ordinal position 1 based découper une liste de compétences select from regexp_split_to_table sql python java javascript s retourne sql 1 python 2 java 3 javascript 4 découper un texte en mots select value ordinal from regexp_split_to_table le chat mange la souris s utilisation avec une table select c clientid s value as tag s ordinal from clients c cross apply regexp_split_to_table c tags s as s compatibilité ces deux fonctions tvf nécessitent le niveau de compatibilité 170 minimum la syntaxe re2 métacaractères et caractères spéciaux le moteur re2 supporte les métacaractères standards correspond à tout caractère sauf newline ancre au début ancre à la fin échappe les caractères spéciaux représente l alternance ou logique et les crochets définissent les classes de caractères classes de caractères perl les raccourcis perl simplifient les patterns courants d équivaut à 0 9 chiffres d à 0 9 non chiffres s aux espaces blancs espace tab newline s aux non espaces w aux caractères de mot 0 9a za z_ et w aux non caractères de mot classes posix les classes posix offrent une alternative lisible aux raccourcis perl alnum pour les alphanumériques alpha pour les alphabétiques digit pour les chiffres lower et upper pour les minuscules majuscules space pour les espaces word pour les caractères de mot et xdigit pour les hexadécimaux quantificateurs les quantificateurs contrôlent les répétitions signifie zéro ou plus greedy un ou plus zéro ou un n exactement n occurrences n m entre n et m n n ou plus les versions non greedy lazy ajoutent un n m limite les quantificateurs n n m et n sont limités à 1 000 répétitions maximum les quantificateurs et n ont pas cette restriction groupes et références les parenthèses créent des groupes de capture numérotés pattern les groupes non capturants pattern optimisent le traitement les groupes nommés p nom pattern améliorent la lisibilité les références arrière 1 à 9 permettent de réutiliser les captures ancres et limites de mots les ancres positionnent le match début de chaîne ligne fin de chaîne ligne a début absolu de chaîne z fin absolue b limite de mot word boundary b non limite de mot quatre flags contrôlent le comportement des correspondances flag description valeur par défaut c correspondance sensible à la casse actif défaut i correspondance insensible à la casse inactif m mode multi ligne et correspondent aux limites de ligne inactif s mode single line correspond aussi aux retours à la ligne inactif les flags se combinent dans une chaîne im active l insensibilité à la casse et le mode multi ligne en cas de flags contradictoires exemple ic le dernier spécifié prévaut recherche insensible à la casse select from contact contact where regexp_like lastname simon i mode multi ligne pour traiter des textes sur plusieurs lignes select regexp_replace contenu s 1 0 m as contenunettoye from articles combinaison de flags select regexp_count textemultiligne ligne 1 im as nombrelignes from documents exemples concrets d utilisation validation d adresses email pattern email complet avec validation tld declare patternemail nvarchar 200 a za z0 9 _ a za z0 9 a za z 2 filtrer les emails valides select from contact contact where regexp_like email patternemail i rapport de qualité des données select count as totalemails sum case when regexp_like email patternemail i then 1 else 0 end as emailsvalides sum case when not regexp_like email patternemail i then 1 else 0 end as emailsinvalides from contact contact validation de numéros de téléphone français téléphone fixe ou mobile français 10 chiffres commençant par 0 declare patterntelfr nvarchar 100 0 1 9 s d 2 s d 2 s d 2 s d 2 validation select phone case when regexp_like phone patterntelfr then valide else invalide end as statut from contact contact normalisation garder uniquement les chiffres update contact contact set normalizedphone regexp_replace phone 0 9 1 0 where regexp_like phone d validation de codes postaux et siret code postal français 5 chiffres commence par 01 95 ou 97 98 declare patterncp nvarchar 50 0 1 9 1 8 d 9 0 5 97 1 6 98 46 9 d 3 select c name c zipcode case when regexp_like zipcode patterncp then valide else invalide end as statutcp from reference city c siret 14 chiffres declare patternsiret nvarchar 50 d 14 select from entreprises where regexp_like regexp_replace siret s 1 0 patternsiret nettoyage et transformation de données supprimer les espaces multiples update documents set contenu regexp_replace contenu s 1 0 where regexp_like contenu s 2 extraction de données structurées depuis du texte libre select texteoriginal regexp_substr texteoriginal b a z 2 d 3 a z 2 b as plaquefr regexp_substr texteoriginal b d 5 b as codepostal regexp_substr texteoriginal b0 67 d 8 b as telmobile from documents masquage de données sensibles masquage de numéros de carte bancaire select numerocarte regexp_replace numerocarte d 4 d 4 d 4 d 4 xxxx xxxx xxxx 4 as cartemasquee from paiements masquage partiel des emails select email regexp_replace email 2 1 3 as emailmasque from contact contact analyse des performance effectuosn quelques analyses et comparaisons basiques de performances requête simple de recherche avec like sur la table posts de la base stackoverflow2013 la table posts contient 17 142 169 lignes sur 38 go de données set statistics time io on alter database stackoverflow2013 set compatibility_level 170 select count from posts where title like sql server go select count from posts where regexp_like title sql server go select count from posts where regexp_like title sql server i le like simple consomme 32 secondes de cpu table posts scan count 3 logical reads 4188571 physical reads 8 read ahead reads 4168983 sql server execution times cpu time 32310 ms elapsed time 19485 ms le regexp_like consomme 483 secondes de cpu 8 minutes mldr le temps d exécution est de 4 3 minutes le degré de parallélisme est de 2 mldr table posts scan count 3 logical reads 4186772 physical reads 2 read ahead reads 4169796 table worktable scan count 0 logical reads 0 sql server execution times cpu time 483825 ms elapsed time 258479 ms le regexp_like avec l option i insensible à la casse consomme 999 secondes de cpu 16 6 minutes le temps d exécution est de 8 7 minutes le degré de parallélisme est toujours de 2 on voit bien le gain global du parallélisme sur une opération aussi lourde table posts scan count 3 logical reads 4189766 physical reads 2 read ahead reads 4172078 table worktable scan count 0 logical reads 0 sql server execution times cpu time 999970 ms elapsed time 527492 ms dans ce cas de recherche simple regexp_like est donc 15 fois plus lent que like dans le cas d une recherche stricte et 31x plus lent pour une recherche insensible à la casse qui correspond à la fonctionnalité apportée au like par la collation ci de la colonne sql_latin1_general_cp1_ci_as les requêtes impliquant des expressions rationnelles sont donc clairement cpu bound à noter que le type est nvarchar donc en utf 16 voyons si cet aspect est significatif dans la consommation cpu select count from posts where regexp_like cast title as varchar 250 sql server i pas vraiment mldr le regexp_like avec l option i sur une colonne convertie en varchar consomme 1013 secondes de cpu 16 8 minutes table posts scan count 3 logical reads 4190377 physical reads 9 read ahead reads 4171470 table worktable scan count 0 sql server execution times cpu time 1013526 ms elapsed time 537002 ms estimation de cardinalité un problème majeur avec les expressions rationnelles est l estimation de cardinalité l estimateur de cardinalité de sql server n est pas capable d estimer correctement le nombre de lignes retournées par une expression rationnelle car il n a pas de modèle statistique pour cela comment pourriez vous estimer le nombre de lignes correspondant à une expression rationnelle complexe le moteur d estimation de cardinalité sait estimer la cardinalité sur l opérateur like en se basant sur les statistiques de chaînes présentes depuis sql server 2005 qui donne une estimation sur les 80 premiers caractères d un varchar cela marche plutôt bien dans notre exemple nous cherchons les titres qui contiennent la chaîne sql server la colonne title est de type nvarchar 250 donc l estimateur de cardinalité utilise les statistiques de chaînes pour un like voyons l estimation de cardinalité pour le like sur l opérateur indexscan dans le plan d exécution relop avgrowsize 261 estimatecpu 9 42827 estimateio 3088 19 estimatedexecutionmode row estimaterows 100247 estimatedrowsread 17142200 logicalop clustered index scan parallel true physicalop clustered index scan estimatedtotalsubtreecost 3097 62 tablecardinality 17142200 dans les faits la requête avec like sql server retourne 43 467 lignes ce qui est assez proche de l estimation de 100 247 lignes du plan voyons maintenant l estimation de cardinalité pour le regexp_like toujours sur l opérateur indexscan dans le plan d exécution relop avgrowsize 261 estimatecpu 9 42827 estimateio 3088 19 estimatedexecutionmode batch estimaterows 1542800 estimatedrowsread 17142200 logicalop clustered index scan parallel true physicalop clustered index scan estimatedtotalsubtreecost 3097 62 tablecardinality 17142200 ici l estimateur de cardinalité estime 1 542 800 lignes retournées par le regexp_like ce qui est très loin des 43 467 lignes réellement retournées l erreur d estimation est donc énorme ce qui peut entraîner la non utilisation d un index par exemple ou un memory grant excessif en cas de tri ou de hash vous notez également que l estimation de consommation cpu est identique entre les deux plans ce qui est bien sûr totalement faux comme on l a vu sur la consommation cpu réelle l estimation de cardinalité est identique pour l expression rationnelle insensible à la casse en fait l estimateur de cardinalité semble utiliser un pourcentage fixe ici 9 1 542 800 17 142 200 une vérification rapide avec un regexp_like sur la table comments montre le même pourcentage l idée de base est sans doute de compter sur iqp intelligent query processing pour ajuster dynamiquement l estimation de cardinalité lors de l exécution de la requête et corriger les memory grants mais ces fonctionnalités ne sont disponibles qu en édition enterprise et c est plutôt un pis aller options de requête pour l estimation de cardinalité pour permettre au moins de corriger manuellement certaines grosses erreurs d estimation sql server propose deux options hint de requêtes select count from posts where regexp_like title sql server i option use hint assume_fixed_min_selectivity_for_regexp relop avgrowsize 261 estimatecpu 9 42827 estimateio 3088 19 estimatedexecutionmode row estimaterows 85710 8 estimatedrowsread 17142200 logicalop clustered index scan nodeid 5 parallel true physicalop clustered index scan estimatedtotalsubtreecost 3097 62 tablecardinality 17142200 select count from posts where regexp_like title sql server i option use hint assume_fixed_max_selectivity_for_regexp relop avgrowsize 261 estimatecpu 9 42827 estimateio 3088 19 estimatedexecutionmode batch estimaterows 8571080 estimatedrowsread 17142200 logicalop clustered index scan nodeid 3 parallel true physicalop clustered index scan estimatedtotalsubtreecost 3097 62 tablecardinality 17142200 dans notre cas l option assume_fixed_min_selectivity_for_regexp donne une estimation de cardinalité de 85 710 lignes ce qui correspond à environ 0 5 de la table l option assume_fixed_max_selectivity_for_regexp donne une estimation de 8 571 080 lignes donc 50 de la table ces options de requêtes ne permettent pas de réaliser de grands progrès dans l estimation de cardinalité mais au moins elles permettent d éviter les erreurs énormes influence de la complexité de l expression rationnelle sur les performances essayons de voir si la complexité de l expression rationnel...
|