SQL - 更新列需要超过5秒的时间

时间:2017-06-06 11:12:34

标签: mysql sql

我对表有以下查询:

tblrevrankreport

CREATE TABLE `tblrevrankreport` (  `id` bigint(20) NOT NULL auto_increment,  `ndate` date NOT NULL,  `tid` varchar(50) default '0',  `transid` varchar(30) default NULL,  `rmno` varchar(10) NOT NULL,  `rmdesc` text,  `rmcat` varchar(30) default NULL,  `rmcatdesc` varchar(30) default NULL,  `rmtariff` varchar(50) default NULL,  `rmtariffdesc` text,  `marketcode` varchar(50) default NULL,  `marketdesc` text,  `cindate` date default NULL,  `coutdate` date default NULL,  `nyts` int(10) default '0',  `noofadult` int(10) default '0',  `noofchild` int(10) default '0',  `mulrate` varchar(10) default 'False',  `revamt` double(20,6) default '0.000000',  `othamt` double(20,6) default '0.000000',  `lastmod` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,  `Company` varchar(200) default '',  `xDate` date default NULL,  PRIMARY KEY  (`id`,`ndate`,`rmno`),  UNIQUE KEY `id` (`id`))

tblcustomerinfohistory

CREATE TABLE `tblcustomerinfohistory` (  `ID` varchar(200) default '',  `TransactionID` varchar(200) default '',  `ConfirmationNo` varchar(200) default '',  `ConfirmationDate` date default NULL,  `ReservationNo` varchar(200) default '',  `GFNo` varchar(200) default '',  `ProcessBy` varchar(200) default '',  `UserName` varchar(200) default '',  `Room_No` varchar(200) default '',  `RoomCat` varchar(200) default '',  `Room_Tariff` varchar(200) default '',  `RTC` varchar(200) default '',  `ActionRTC` varchar(200) default 'False',  `LastName` varchar(300) default '',  `FirstName` varchar(300) default '',  `MiddleName` varchar(300) default '',  `Title` varchar(200) default '',  `Country` varchar(200) default '',  `xLanguage` varchar(200) default '',  `VIP` varchar(200) default '',  `PhoneNo` varchar(200) default '',  `Agent` varchar(200) default '',  `Company` varchar(200) default '',  `xCompanyCode` varchar(100) default '',  `xGroup` varchar(200) default '',  `Source` varchar(200) default '',  `CellNo` varchar(200) default '',  `CInDate` date default NULL,  `COutDate` date default NULL,  `Nights` bigint(20) default '0',  `NoOfRooms` bigint(20) default '0',  `NoOfAdult` bigint(20) default '0',  `NoOfChild` bigint(20) default '0',  `RateCode` varchar(200) default '',  `ArrivalTime` varchar(200) default '',  `DepartureTime` varchar(200) default '',  `Packages` varchar(200) default '',  `BlockCode` varchar(200) default '',  `xCurrency` varchar(200) default '',  `FixedRate` varchar(200) default '',  `ResType` varchar(200) default '',  `Market` varchar(200) default '',  `Source2` varchar(200) default '',  `Origin` varchar(200) default '',  `PaymentType` varchar(200) default '',  `CCNo` varchar(200) default '',  `ExpDate` varchar(200) default '0',  `PickUpReqd` varchar(200) default '',  `SCode1` varchar(200) default '',  `CCode1` varchar(200) default '',  `PickUpTime` varchar(200) default '',  `DropOffReqd` varchar(200) default '',  `SCode2` varchar(200) default '',  `CCode2` varchar(200) default '',  `DropOffTime` varchar(200) default '',  `NoPost` varchar(200) default '',  `Stat` varchar(200) default '',  `ReservedType` varchar(200) default '',  `BusSource` varchar(200) default '',  `HomeAdd` varchar(200) default '',  `Remarks` varchar(200) default '',  `EMail` varchar(200) default '',  `AmountDue` decimal(30,2) default '0.00',  `TransType` varchar(200) default '',  `GFNServices` varchar(5000) default '',  `GFNMeals` varchar(5000) default '',  `GFNRoom` varchar(5000) default '',  `GFNOthers` varchar(5000) default '',  `GFComment` varchar(5000) default '',  `GFCommentOPT` varchar(5000) default '',  `FlightNo` varchar(200) default '',  `FlightArr` date default NULL,  `FlightArrT` varchar(200) default '0',  `FlightNoDep` varchar(200) default NULL,  `FlightDepD` date default NULL,  `FlightDepT` varchar(200) default '0',  `DiscountAmount` double(30,2) default '0.00',  `DiscPercentage` bigint(20) default '0',  `MealsRem` varchar(200) default '',  `xRemarks` varchar(200) default '',  `xComments` varchar(800) default '',  `BFStat` varchar(200) default '',  `BFAd` bigint(20) default '0',  `BFCh` bigint(20) default '0',  `LNStat` varchar(200) default '',  `LNAd` bigint(20) default '0',  `LNCh` bigint(20) default '0',  `DNStat` varchar(200) default '',  `DNAd` bigint(20) default '0',  `DNCh` bigint(20) default '0',  `FullBoard` varchar(200) default '',  `CardType` varchar(200) default '',  `CardNo1` varchar(200) default '',  `CardNo2` varchar(200) default '',  `CardNo3` varchar(200) default '',  `CardNo4` varchar(200) default '',  `MachineNo` varchar(200) default '',  `TraceRemarks` varchar(200) default '',  `TransFer` double(20,0) default '0',  `NewTrans` varchar(200) default '',  `PromoRate` double(30,2) default '0.00',  `ExtendCon` varchar(200) default '0',  `ExtendNights` double(30,2) default '0.00',  `OptionDate` date default NULL,  `ReservePayment` decimal(40,2) default '0.00',  `OptionOverride` varchar(200) default 'False',  `PersonOverride` varchar(200) default '',  `DateOverride` varchar(200) default '',  `PerExtendDate` varchar(200) default '',  `DateExtendD` varchar(200) default '',  `ModePay` varchar(200) default '',  `CNP` varchar(200) default '',  `SourceToPay` varchar(200) default '',  `NSBilling` varchar(200) default '',  `NSAmount` double(30,2) default '0.00',  `NSDiscAmount` double(30,2) default '0.00',  `NSOptType` varchar(200) default '',  `NSOptNights` varchar(200) default '',  `NSRemarks` varchar(200) default '',  `CancelledDate` date default NULL,  `CancelledPerson` varchar(200) default '',  `RoomCleared` varchar(50) default '',  `GPassport` varchar(100) default '',  `Accompany1` varchar(200) default '',  `Accompany2` varchar(200) default '',  `Accompany3` varchar(200) default '',  `Accompany4` varchar(200) default '',  `Accompany5` varchar(200) default '',  `Accompany6` varchar(200) default '',  `AccompanyF1` varchar(70) default '',  `AccompanyF2` varchar(70) default '',  `AccompanyF3` varchar(70) default '',  `AccompanyF4` varchar(70) default '',  `AccompanyF5` varchar(70) default '',  `AccompanyF6` varchar(70) default '',  `AccompanyM1` varchar(70) default '',  `AccompanyM2` varchar(70) default '',  `AccompanyM3` varchar(70) default '',  `AccompanyM4` varchar(70) default '',  `AccompanyM5` varchar(70) default '',  `AccompanyM6` varchar(70) default '',  `AccompanyNo1` varchar(100) default '',  `AccompanyNo2` varchar(100) default '',  `AccompanyNo3` varchar(100) default '',  `AccompanyNo4` varchar(100) default '',  `AccompanyNo5` varchar(100) default '',  `AccompanyNo6` varchar(100) default '',  `MultipleRate` varchar(200) default 'False',  `TransferRoomRes` varchar(200) default '',  `RateSetup` varchar(200) default 'Night',  `BookingRef` varchar(300) default '',  `TimeShareCode` varchar(300) default '',  `GuestBalance` decimal(30,2) default '0.00',  `stayondate` date default NULL,  `CheckInTime` varchar(20) default NULL,  `isDORM` varchar(10) default '0',  `PPV_No` varchar(50) default '',  `AccountOf` varchar(200) default '',  `CountryMain` varchar(50) default NULL,  `PlateNo` varchar(100) default '',  `Revenue` double(40,6) default '0.000000',  `CPlateNo` varchar(100) default '',  `xOCCUPATION` varchar(100) default '',  `WithSC` varchar(5) default '0',  `allocation` int(5) default '0',  `NoOfSenior` int(10) default '0',  `RmVatExempt` varchar(10) default 'False',  `CINFolioNo` varchar(200) default '',  `intLoad` int(1) default '0',  `caName` varchar(200) default '',  `dwh_ID` varchar(200) default '',  `WinStat` varchar(100) default '',  `JuruScript` varchar(300) default '',  `intLoad2` int(4) default '0',  `xuseraccess` varchar(50) default '',  `xuseraccess2` varchar(50) default '',  `xDate` date default NULL,  `xID` int(11) NOT NULL auto_increment,  PRIMARY KEY  (`xID`))

tbltransactionpostingdumy

CREATE TABLE `tbltransactionpostingdumy` (  `id` varchar(40) default NULL,  `GuestNO` varchar(200) default NULL,  `RoomNO` varchar(200) default NULL,  `trCode` varchar(200) default NULL,  `Description` varchar(200) default NULL,  `Amount` decimal(40,6) default '0.000000',  `Qty` double(30,2) default NULL,  `Win` varchar(20) default NULL,  `CheckNO` varchar(200) default NULL,  `refno` text,  `XPOS` double(200,0) default '1',  `Xdate` date default NULL,  `roomdate` date default NULL,  `roomadd` int(20) default '0',  `settleCode` int(20) default '0',  `Rout` int(20) default '0',  `COut` int(20) default '0',  `Supplement` text,  `xuser` varchar(200) default NULL,  `xTime` varchar(200) default '0',  `GuestName` varchar(200) default '',  `Source` varchar(200) default '',  `TransferCharge` varchar(200) default '0',  `AR` varchar(200) default 'False',  `ARPayment` varchar(200) default 'False',  `ChitNo` varchar(200) default '',  `ORnumberNO` varchar(200) default '',  `Correction` varchar(200) default 'False',  `TRUE_DATE` date default NULL,  `POS_QTY` bigint(10) default '0',  `POS_TOTAL` decimal(30,2) default '0.00',  `POS_AMTDUE` decimal(30,2) default '0.00',  `POS_VAT` decimal(30,2) default '0.00',  `POS_SC` decimal(30,2) default '0.00',  `POS_WID` varchar(100) default '',  `POS_WNAME` varchar(300) default '',  `POS_CID` varchar(100) default '',  `POS_CNAME` varchar(300) default '',  `POST_STAT` varchar(100) default 'HMS',  `MainTransNo` varchar(20) default '0',  `TransferDesc` varchar(20) default '',  `ConfiNo` varchar(20) default '',  `isAdvBill` varchar(20) default '',  `CCNum` varchar(200) default NULL,  `CCName` varchar(200) default NULL,  `HName` varchar(200) default NULL,  `ExpDate` date default NULL,  `AuthCode` varchar(200) default NULL,  `isSOA` varchar(100) default 'NO',  `SENDBILLTO` varchar(50) default NULL,  `WithVat` tinyint(5) default '1',  `WithSC` tinyint(5) default '1',  `AMT_VAT` decimal(30,6) default '0.000000',  `AMT_SC` decimal(30,6) default '0.000000',  `CL_TRNF` tinyint(5) default '0',  `G_ID` varchar(30) default '',  `G_NAME` varchar(100) default '',  `G_TRNO` varchar(5) default '',  `SpecialCase` varchar(10) default '0',  `SD_Amount` decimal(40,6) default '0.000000',  `SD_Vat` decimal(40,6) default '0.000000',  `SeniorDis` varchar(10) default '0',  `SeniorPerc` decimal(40,6) default '0.000000',  `withLT` tinyint(5) default '0',  `amt_LT` decimal(30,6) default '0.000000',  `WithSD` varchar(5) default '0',  `AMT_SENIORDISC` decimal(30,6) default '0.000000',  `xCat` varchar(200) default '',  `SC_PERC` double(40,6) default '0.000000',  `disctype` varchar(200) default '',  `origAmount` decimal(40,2) default '0.00',  `vatExempt` decimal(40,6) default '0.000000',  `SENDBILLTOCODE` varchar(200) default '',  `caID` int(100) default NULL,  `CaTrans` varchar(100) default '',  `ARCollections` tinyint(1) default '0',  `vatExemptSales` decimal(40,6) default '0.000000',  `xdatetime` timestamp NULL default CURRENT_TIMESTAMP,  `baseCharge` decimal(40,6) default '0.000000',  `SRP` decimal(40,6) default '0.000000',  `seniorID` varchar(40) default '',  `Machinenum` varchar(50) default '',  `fullname` varchar(200) default '',  KEY `idx_date` (`Xdate`),  KEY `idx_guestno` (`GuestNO`),  KEY `idx_id` (`id`),  KEY `idx_machine` (`Machinenum`),  KEY `idx_roomno` (`RoomNO`),  KEY `idx_trcode` (`trCode`))

首先从' 2017-04-01'删除记录到' 2017-04-30':

DELETE FROM tblrevrankreport 
WHERE xdate BETWEEN '2017-04-01' AND '2017-04-30';

然后获取记录并保存:

INSERT INTO tblrevrankreport (ndate, xDate, tid, transid, rmno, rmcat, rmcatdesc, rmtariff, marketdesc, cindate, coutdate, mulrate, revamt, othamt, Company) 
    SELECT 
        a.xDate, a.xDate, b.id, a.guestno, a.roomno, 
        b.RoomCat, b.roomcat, b.Room_Tariff,
        b.Market, b.CInDate, b.coutdate, b.MultipleRate,
        IF(c.ratecode = 1, (a.amount - (a.AMT_VAT + a.AMT_SC + a.AMT_LT)), ''),
        IF(c.ratecode <> 1, (a.amount - (a.AMT_VAT + a.AMT_SC + a.AMT_LT)), ''),
        b.Company
    FROM
        tbltransactionpostingdumy a 
    LEFT JOIN 
        tblcustomerinfo b ON a.MaintransNo = b.transactionID
    LEFT JOIN 
        tblreftransaction c ON a.trcode = c.xcode
    WHERE 
        (a.xDate BETWEEN '2017-04-01' AND '2017-04-30') 
        AND c.xcat = 'ROOM CHARGE';

然后问题发生在这里:

UPDATE 
    tblrevrankreport b, tblcustomerinfohistory a
SET   
    b.nyts = 1, 
    b.NoOfAdult = a.NoOfAdult, 
    b.NoOfChild = a.NoOfChild
WHERE 
    b.xdate = '2017-04-01' 
    AND '2017-04-30')
    AND b.COutDate > b.xdate
    AND b.rmcat <> 'PQ'
    AND b.transid = a.TransactionID
    AND b.xdate = a.Xdate;

最后一次查询花了很多时间,在tblrevrankreport中要更新的总记录数是5242.

还有其他方法可以改善它吗?

谢谢!

0 个答案:

没有答案