|
Membre éclairé
Inscription : février 2005 Messages : 349 Détails du profil  Informations personnelles : Localisation : France, Vaucluse (Provence Alpes Côte d'Azur) Informations forums :
Inscription : février 2005 Messages : 349 Points : 358 Points : 358
|
structure identique optimisation différente
bonjour à tous.
Je suis tombé sur un cas qui reste une enigme pour moi. Je me demandais si quelqu'un saurait me l'expliquer.
Je dispose de multiples bases ayant la même structure.
La création des tables incriminés dans mon enigme est ci-dessous (@database est a remplacer par le nom des bases. Je ne peut pas donner le vrai nom des bases pour des questions de confidentialites)
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
| SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
CREATE SCHEMA IF NOT EXISTS `@database` DEFAULT CHARACTER SET latin1 ;
USE `@database` ;
-- -----------------------------------------------------
-- Table `@database`.`DocPage`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `@database`.`DocPage` (
`dw_PageKey` INT(11) UNSIGNED NOT NULL DEFAULT '0' ,
`dw_DocKey` INT(11) UNSIGNED NOT NULL DEFAULT '0' ,
`i_PosXDoc` INT(5) UNSIGNED NOT NULL DEFAULT '0' ,
`i_PosYDoc` INT(5) UNSIGNED NOT NULL DEFAULT '0' ,
`dw_WidthDoc` INT(10) UNSIGNED NOT NULL DEFAULT '0' ,
`dw_HeightDoc` INT(11) NOT NULL DEFAULT '0' ,
`b_ManDoc` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' ,
`sz_TypeDocPageKey` CHAR(2) NOT NULL ,
PRIMARY KEY (`dw_PageKey`, `dw_DocKey`) ,
INDEX `dw_PageKey` (`dw_PageKey` ASC) ,
INDEX `dw_DocKey` (`dw_DocKey` ASC) ,
INDEX `sz_TypeDocPageKey` (`sz_TypeDocPageKey` ASC) ,
INDEX `b_ManDoc` (`b_ManDoc` ASC) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;
-- -----------------------------------------------------
-- Table `@database`.`Document`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `@database`.`Document` (
`dw_DocKey` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ,
`vc_RefDoc` VARCHAR(35) NOT NULL DEFAULT '' ,
`txt_RefDoc` VARCHAR(35) NOT NULL ,
`vc_ShippingNumDoc` VARCHAR(32) NOT NULL DEFAULT '' ,
`sz_CustKey` CHAR(3) NOT NULL DEFAULT '' ,
`vc_OrderDateDoc` VARCHAR(14) NOT NULL DEFAULT '' ,
`vc_OrderNumDoc` VARCHAR(32) NOT NULL DEFAULT '' ,
`vc_OrderTypeDoc` VARCHAR(8) NOT NULL ,
`vc_DelDateDoc` VARCHAR(14) NOT NULL DEFAULT '' ,
`dw_SenderKey` INT(11) NOT NULL DEFAULT '0' ,
`dw_ReceiverKey` INT(11) NOT NULL DEFAULT '0' ,
`vc_FirstDate` VARCHAR(8) NOT NULL DEFAULT '' ,
`vc_SenderAgencyKey` VARCHAR(10) NOT NULL DEFAULT '' ,
`vc_ReceiverAgencyKey` VARCHAR(10) NOT NULL DEFAULT '' ,
`vc_Com1Doc` VARCHAR(35) NOT NULL DEFAULT '' ,
`vc_Com2Doc` VARCHAR(12) NOT NULL DEFAULT '' ,
`vc_Com3Doc` VARCHAR(12) NOT NULL ,
`vc_Com4Doc` VARCHAR(12) NOT NULL ,
`doc_State` VARCHAR(25) NOT NULL ,
`doc_NameContract` VARCHAR(128) NOT NULL ,
`doc_DateDeadLine` VARCHAR(14) NOT NULL ,
`doc_ProviderCode` INT(10) UNSIGNED NOT NULL DEFAULT '0' ,
`doc_ProviderName` VARCHAR(128) NOT NULL ,
`doc_CompanyCode` INT(10) UNSIGNED NOT NULL DEFAULT '0' ,
`doc_CompanyName` VARCHAR(128) NOT NULL ,
`doc_DateSuivi` VARCHAR(14) NOT NULL ,
`doc_DateInvoice` VARCHAR(14) NOT NULL ,
`doc_DateBeginValid` VARCHAR(14) NOT NULL ,
`doc_DateEndValid` VARCHAR(14) NOT NULL ,
`doc_DateRadiation` VARCHAR(14) NOT NULL ,
`doc_InsDateHour` VARCHAR(14) NOT NULL ,
`doc_UpdDateHour` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP ,
`doc_LastFileUpd` VARCHAR(128) NOT NULL ,
PRIMARY KEY (`dw_DocKey`) ,
INDEX `vc_AgencyKey` (`vc_SenderAgencyKey` ASC) ,
INDEX `vc_OrderDateDoc` (`vc_OrderDateDoc` ASC) ,
INDEX `vc_ReceiverAgencyKey` (`vc_ReceiverAgencyKey` ASC) ,
INDEX `vc_DelDateDoc` (`vc_DelDateDoc` ASC) ,
INDEX `vc_RefDoc` (`vc_RefDoc` ASC) ,
INDEX `vc_ShippingNumDoc` (`vc_ShippingNumDoc` ASC) ,
INDEX `dw_SenderKey` (`dw_SenderKey` ASC) ,
INDEX `dw_ReceiverKey` (`dw_ReceiverKey` ASC) ,
INDEX `sz_CustKey` (`sz_CustKey` ASC) ,
INDEX `vc_FirstDate` (`vc_FirstDate` ASC) ,
INDEX `vc_OrderNumDoc` (`vc_OrderNumDoc` ASC) ,
INDEX `vc_Com1Doc` (`vc_Com1Doc` ASC) ,
INDEX `vc_Com2Doc` (`vc_Com2Doc` ASC) ,
INDEX `vc_Com3Doc` (`vc_Com3Doc` ASC) ,
INDEX `doc_NameContract` (`doc_NameContract` ASC) ,
INDEX `doc_ProviderName` (`doc_ProviderName` ASC) ,
INDEX `doc_DateSuivi` (`doc_DateSuivi` ASC) ,
INDEX `doc_DateBeginValid` (`doc_DateBeginValid` ASC) ,
INDEX `doc_DateRadiation` (`doc_DateRadiation` ASC) ,
INDEX `vc_OrderTypeDoc` (`vc_OrderTypeDoc` ASC) ,
INDEX `doc_InsDateHour` (`doc_InsDateHour` ASC) ,
INDEX `doc_UpdDateHour` (`doc_UpdDateHour` ASC) ,
INDEX `doc_LastFileUpd` (`doc_LastFileUpd` ASC) ,
FULLTEXT INDEX `txt_RefDoc` (`txt_RefDoc` ASC) )
ENGINE = MyISAM
AUTO_INCREMENT = 1490713
DEFAULT CHARACTER SET = latin1;
-- -----------------------------------------------------
-- Table `@database`.`TypeDocPage`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `@database`.`TypeDocPage` (
`sz_TypeDocPageKey` CHAR(2) NOT NULL ,
`sz_CustKey` CHAR(3) NOT NULL DEFAULT 'BPR' ,
`vc_NameTypeDocPage` VARCHAR(32) NOT NULL ,
`i_OrderTypeDocPage` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '1' ,
`i_AccessLevel` INT(10) UNSIGNED NOT NULL DEFAULT '0' ,
PRIMARY KEY (`sz_TypeDocPageKey`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; |
Sur la plupart des bases lorsque j'execute cette requete
Code :
1 2 3 4 5 6 7 8 9 10 11 12
| SELECT SQL_NO_CACHE DISTINCT
Document.dw_DocKey, DocPage.sz_TypeDocPageKey
FROM
@DATABASE.Document , @DATABASE.DocPage LEFT JOIN TypeDocPage
ON DocPage.sz_TypeDocPageKey = TypeDocPage.sz_TypeDocPageKey
WHERE
Document.sz_CustKey = '$CUSTKEY'
AND (TypeDocPage.i_AccessLevel <= '99' OR TypeDocPage.i_AccessLevel IS NULL)
AND Document.vc_RefDoc LIKE '%9705251%'
AND DocPage.sz_TypeDocPageKey LIKE '%'
AND Document.dw_DocKey = DocPage.dw_DocKey
LIMIT 100; |
l'optimiseur commence par Document. Voir explain
Code :
1 2 3
| 1, SIMPLE, Document, ref, PRIMARY,sz_CustKey, sz_CustKey, 3, const, 361121, USING WHERE; USING TEMPORARY
1, SIMPLE, DocPage, ref, dw_DocKey, dw_DocKey, 4, @DATABASE.Document.dw_DocKey, 43, USING WHERE
1, SIMPLE, TypeDocPage, eq_ref, PRIMARY, PRIMARY, 2, @DATABASE.DocPage.sz_TypeDocPageKey, 1, USING WHERE; DISTINCT |
mais sur une des bases, il s'acharne à commencer par DocPage (ce qui ne m'arrange pas du tout car DocPage fait 7.5M de d'enreg). Voir explain :
Code :
1 2 3
| '1', 'SIMPLE', 'DocPage', 'ALL', 'dw_DocKey', NULL, NULL, NULL, '7758845', 'Using where; Using temporary'
'1', 'SIMPLE', 'Document', 'eq_ref', 'PRIMARY,sz_CustKey', 'PRIMARY', '4', '@database.DocPage.dw_DocKey', '1', 'Using where'
'1', 'SIMPLE', 'TypeDocPage', 'eq_ref', 'PRIMARY', 'PRIMARY', '2', '@database.DocPage.sz_TypeDocPageKey', '1', 'Using where; Distinct' |
Quelqu'un saurait il m'expliquer cette difference de l'optimiseur de requete?
__________________
La connaissance s'accroit lorsqu'on la partage.
|