国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SQL面試題:第二個(gè)優(yōu)化案例

這篇具有很好參考價(jià)值的文章主要介紹了SQL面試題:第二個(gè)優(yōu)化案例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

今天繼續(xù)給大家分享一個(gè) SQL 優(yōu)化案例。

問題描述

已知表結(jié)構(gòu)如下:

CREATE TABLE `customer` (
`C_CUSTKEY` int NOT NULL,
`C_NAME` varchar(25) NOT NULL,
`C_ADDRESS` varchar(40) NOT NULL,
`C_NATIONKEY` int NOT NULL,
`C_PHONE` char(15) NOT NULL,
`C_ACCTBAL` decimal(15,2) NOT NULL,
`C_MKTSEGMENT` char(10) NOT NULL,
`C_COMMENT` varchar(117) NOT NULL,
PRIMARY KEY (`C_CUSTKEY`)
) ENGINE=InnoDB;

CREATE TABLE `orders` (
`O_ORDERKEY` int NOT NULL,
`O_CUSTKEY` int NOT NULL,
`O_ORDERSTATUS` char(1) NOT NULL,
`O_TOTALPRICE` decimal(15,2) NOT NULL,
`O_ORDERDATE` date NOT NULL,
`O_ORDERPRIORITY` char(15) NOT NULL,
`O_CLERK` char(15) NOT NULL,
`O_SHIPPRIORITY` int NOT NULL,
`O_COMMENT` varchar(79) NOT NULL
PRIMARY KEY (`C_ORDERKEY`)
) ENGINE=InnoDB;

請(qǐng)問下面的查詢語(yǔ)句應(yīng)該如何優(yōu)化?

SELECT o_custkey, c_name, sum(o.o_totalprice)
FROM customer c, orders o 
WHERE o_custkey = c_custkey 
GROUP BY o_custkey, c_name
ORDER BY c_name;

思路分析

首先,這個(gè)查詢的作用是統(tǒng)計(jì)每個(gè)客戶的訂單金額匯總,數(shù)據(jù)來自 orders 表;最后按照客戶名稱排序,名稱來自 customer 表,兩個(gè)表通過 c_custkey 字段關(guān)聯(lián)??匆幌聢?zhí)行計(jì)劃:

EXPLAIN
select c_custkey, c_name, sum(o.o_totalprice)
from customer c, orders o 
where o_custkey = c_custkey 
group by c_name, c_custkey
order by c_name;

id|select_type|table|partitions|type  |possible_keys|key    |key_len|ref           |rows|filtered|Extra                          |
--+-----------+-----+----------+------+-------------+-------+-------+--------------+----+--------+-------------------------------+
 1|SIMPLE     |o    |          |ALL   |             |       |       |              |   1|   100.0|Using temporary; Using filesort|
 1|SIMPLE     |c    |          |eq_ref|PRIMARY      |PRIMARY|4      |hr.o.O_CUSTKEY|   1|   100.0|                               |

orders 表使用了 ALL 全表掃描,由于 group by,所以 Extra 包含了臨時(shí)表(Using temporary);由于 order by,所以 Extra 包含了排序操作(Using filesort)。這些都會(huì)導(dǎo)致性能問題。

第一步,考慮到每個(gè)客戶的訂單金額匯總只需要 orders 表中的數(shù)據(jù),可以單獨(dú)按照 o_custkey 分組,并且基于 o_custkey 和 o_totalprice 創(chuàng)建復(fù)合索引,利用索引覆蓋掃描優(yōu)化;然后再和 customer 表關(guān)聯(lián)。另外,c_custkey 是主鍵,決定了 c_name,延遲關(guān)聯(lián)可以避免 group by 中的 c_name。

-- 創(chuàng)建索引
CREATE INDEX idx_orders_custkey_totalprice ON orders(o_custkey, o_totalprice);

EXPLAIN
select o.o_custkey, c.c_name, o.sumprice
from
(select o_custkey, sum(o_totalprice) sumprice
from orders 
group by o_custkey) o, customer c
where o_custkey = c_custkey 
order by c_name;

id|select_type|table     |partitions|type |possible_keys                |key                          |key_len|ref           |rows|filtered|Extra         |
--+-----------+----------+----------+-----+-----------------------------+-----------------------------+-------+--------------+----+--------+--------------+
 1|PRIMARY    |c         |          |ALL  |PRIMARY                      |                             |       |              |   1|   100.0|Using filesort|
 1|PRIMARY    |<derived2>|          |ref  |<auto_key0>                  |<auto_key0>                  |4      |hr.c.C_CUSTKEY|   2|   100.0|              |
 2|DERIVED    |orders    |          |index|idx_orders_custkey_totalprice|idx_orders_custkey_totalprice|11     |              |   1|   100.0|Using index   |

子查詢 o 已經(jīng)優(yōu)化完成,Extra 中的 Using index 顯示了索引覆蓋掃描。剩下的問題就是 customer 表上的排序操作,對(duì)應(yīng) Extra 中的 Using filesort。

第二步,基于 c_name 字段創(chuàng)建索引,避免排序操作。

-- 創(chuàng)建索引
CREATE INDEX idx_customer_name ON customer(c_name);

EXPLAIN
select c.c_custkey, c.c_name, o.sumprice
from
(select o_custkey, sum(o_totalprice) sumprice
from orders 
group by o_custkey) o, customer c
where o_custkey = c_custkey 
order by c_name;

id|select_type|table     |partitions|type |possible_keys                |key                          |key_len|ref           |rows|filtered|Extra      |
--+-----------+----------+----------+-----+-----------------------------+-----------------------------+-------+--------------+----+--------+-----------+
 1|PRIMARY    |c         |          |index|PRIMARY                      |idx_customer_name            |102    |              |   1|   100.0|Using index|
 1|PRIMARY    |<derived2>|          |ref  |<auto_key0>                  |<auto_key0>                  |4      |hr.c.C_CUSTKEY|   2|   100.0|           |
 2|DERIVED    |orders    |          |index|idx_orders_custkey_totalprice|idx_orders_custkey_totalprice|11     |              |   1|   100.0|Using index|

可以看到,對(duì)于 customer 表的訪問,也使用了索引覆蓋掃描,因?yàn)槎?jí)索引包含了主鍵字段(c_custkey)。

額外補(bǔ)充,還有一種寫法就是調(diào)整 group by 字段的順序,把 c_name 放在第一位,并且把 c_custkey 改成 o_custkey:

EXPLAIN 
select o_custkey, c_name, sum(o.o_totalprice)
from customer c, orders o 
where o_custkey = c_custkey 
group by c_name, o_custkey
order by c_name;

id|select_type|table|partitions|type |possible_keys                |key                          |key_len|ref           |rows|filtered|Extra      |
--+-----------+-----+----------+-----+-----------------------------+-----------------------------+-------+--------------+----+--------+-----------+
 1|SIMPLE     |c    |          |index|PRIMARY,idx_customer_name    |idx_customer_name            |102    |              |   1|   100.0|Using index|
 1|SIMPLE     |o    |          |ref  |idx_orders_custkey_totalprice|idx_orders_custkey_totalprice|4      |hr.c.C_CUSTKEY|   1|   100.0|Using index|

留個(gè)作業(yè),為什么呢?文章來源地址http://www.zghlxwxcb.cn/news/detail-634249.html

到了這里,關(guān)于SQL面試題:第二個(gè)優(yōu)化案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • smartsofthelp 5.0 最專業(yè)的數(shù)據(jù)庫(kù)優(yōu)化工具,數(shù)據(jù)庫(kù)配置優(yōu)化,數(shù)據(jù)庫(kù)高并發(fā)優(yōu)化,SQL 語(yǔ)句優(yōu)化...

    smartsofthelp 5.0 最專業(yè)的數(shù)據(jù)庫(kù)優(yōu)化工具,數(shù)據(jù)庫(kù)配置優(yōu)化,數(shù)據(jù)庫(kù)高并發(fā)優(yōu)化,SQL 語(yǔ)句優(yōu)化...

    ? 下載地址:百度網(wǎng)盤 請(qǐng)輸入提取碼 SQL操作返回歷史記錄: 2023-08-21 20:42:08:220 ?輸入:select @@version as 版本號(hào) 2023-08-21 20:42:08:223 ?輸出:當(dāng)前數(shù)據(jù)庫(kù)實(shí)例版本號(hào):Microsoft SQL Server 2012 - 11.0.2100.60 (X64)? ?? ?Feb 10 2012 19:39:15? ?? ?Copyright (c) Microsoft Corporation ?? ?Developer Edition (

    2024年02月12日
    瀏覽(97)
  • MySQL數(shù)據(jù)庫(kù)進(jìn)階第二篇(索引,SQL性能分析,使用規(guī)則)

    MySQL數(shù)據(jù)庫(kù)進(jìn)階第二篇(索引,SQL性能分析,使用規(guī)則)

    本篇博客深入詳細(xì)地介紹了數(shù)據(jù)庫(kù)索引的概念和重要性。內(nèi)容包含:索引的概念和目標(biāo)、索引的優(yōu)點(diǎn)與缺點(diǎn)。此外,博客還深入解析了三種主要的索引結(jié)構(gòu):B-Tree、B+Tree和Hash,提供了詳細(xì)的結(jié)構(gòu)解析和優(yōu)化方法,并通過插圖進(jìn)一步增強(qiáng)了理解。 博客的部分內(nèi)容專注于對(duì)B-Tr

    2024年02月21日
    瀏覽(114)
  • 關(guān)于數(shù)據(jù)庫(kù)SQL優(yōu)化

    關(guān)于數(shù)據(jù)庫(kù)SQL優(yōu)化

    ? 在項(xiàng)目上線初期,業(yè)務(wù)數(shù)據(jù)量相對(duì)較少,SQL的執(zhí)行效率對(duì)程序運(yùn)行效率的影響可能不太明顯,因此開發(fā)和運(yùn)維人員可能無法判斷SQL對(duì)程序的運(yùn)行效率有多大。但隨著時(shí)間的積累,業(yè)務(wù)數(shù)據(jù)量的增多,SQL的執(zhí)行效率對(duì)程序的運(yùn)行效率的影響逐漸增大,此時(shí)對(duì)SQL的優(yōu)化就很有必

    2024年02月08日
    瀏覽(86)
  • SQL筆記 -- 數(shù)據(jù)庫(kù)結(jié)構(gòu)優(yōu)化

    不常用的數(shù)據(jù)為冷數(shù)據(jù),反之則為熱數(shù)據(jù)。如果一個(gè)表中的數(shù)據(jù)存在明顯的使用頻率差異,那么可以將冷熱數(shù)據(jù)分離。通過這種分解可以提高表的查詢效率。對(duì)于字段很多且有些字段使用不頻繁的表,可以通過這種分解的方式來優(yōu)化數(shù)據(jù)庫(kù)的性能。 例如: 會(huì)員members表存儲(chǔ)會(huì)

    2024年01月22日
    瀏覽(98)
  • 數(shù)據(jù)庫(kù)優(yōu)化案例—某市中心醫(yī)院HIS系統(tǒng)

    數(shù)據(jù)庫(kù)優(yōu)化案例—某市中心醫(yī)院HIS系統(tǒng)

    記得在自己學(xué)習(xí)數(shù)據(jù)庫(kù)知識(shí)的時(shí)候特別喜歡看案例,因?yàn)閮?yōu)化的手段是容易掌握的,但是整體的優(yōu)化思想是很難學(xué)會(huì)的。這也是為什么自己特別喜歡看案例,今天也開始分享自己做的優(yōu)化案例。 最近一直很忙,博客產(chǎn)出也少的可憐,今天整理了一下自己做過優(yōu)化或各種方案的

    2024年02月05日
    瀏覽(20)
  • 【MySQL 數(shù)據(jù)庫(kù)】7、SQL 優(yōu)化

    【MySQL 數(shù)據(jù)庫(kù)】7、SQL 優(yōu)化

    ① 批量插入數(shù)據(jù) ② 手動(dòng)控制事務(wù) ③ 主鍵順序插入,性能要高于亂序插入 主鍵亂序插入 : 8 1 9 21 88 2 4 15 89 5 7 3 主鍵順序插入 : 1 2 3 4 5 7 8 9 15 21 88 89 【☆】 】 ① 如果需要一次性插入大批量數(shù)據(jù)(百萬級(jí)別),使用 insert 語(yǔ)句插入性能 很低 ② 可使用 MySQL 數(shù)據(jù)庫(kù)提供的 loa

    2024年02月08日
    瀏覽(33)
  • SQL Server 數(shù)據(jù)庫(kù)優(yōu)化分享

    ? ? ? ?隨著數(shù)據(jù)量和業(yè)務(wù)復(fù)雜性的增加,數(shù)據(jù)庫(kù)優(yōu)化變得越來越重要。通過對(duì) SQL Server 數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化,您可以提高查詢性能、減少資源消耗,從而改善整體系統(tǒng)性能。以下是一些優(yōu)化技巧,可幫助您實(shí)現(xiàn)更高效、更可靠的數(shù)據(jù)庫(kù)操作。 使用恰當(dāng)?shù)乃饕?索引是一種提供快

    2024年02月11日
    瀏覽(89)
  • 數(shù)據(jù)庫(kù)優(yōu)化:探索 SQL 中的索引

    數(shù)據(jù)庫(kù)優(yōu)化:探索 SQL 中的索引

    推薦:使用 NSDT場(chǎng)景編輯器 助你快速搭建可編輯的3D應(yīng)用場(chǎng)景 在一本書中搜索特定主題時(shí),我們將首先訪問索引頁(yè)面(該頁(yè)面位于該書的開頭),并找到包含我們感興趣的主題的頁(yè)碼?,F(xiàn)在,想象一下在沒有索引頁(yè)的書中找到特定主題是多么不方便。為此,我們必須搜索書中

    2024年02月14日
    瀏覽(96)
  • 【數(shù)據(jù)庫(kù)】sql優(yōu)化有哪些?從query層面和數(shù)據(jù)庫(kù)層面分析

    【數(shù)據(jù)庫(kù)】sql優(yōu)化有哪些?從query層面和數(shù)據(jù)庫(kù)層面分析

    這類型問題可以稱為:Query Optimization,從清華AI4DB的paper list中,該類問題大致可以分為: Query Rewriter Cardinality Estimation Cost Estimation Plan Optimization 從中文的角度理解那就是: 查詢重寫 基數(shù)估計(jì) 成本估計(jì) 執(zhí)行計(jì)劃優(yōu)化 可以發(fā)現(xiàn),這類型的優(yōu)化問題,大多數(shù)從sql本身,或者說從

    2024年01月17日
    瀏覽(97)
  • 實(shí)時(shí)Flink的數(shù)據(jù)庫(kù)與Kafka集成優(yōu)化案例

    在現(xiàn)代數(shù)據(jù)處理系統(tǒng)中,實(shí)時(shí)數(shù)據(jù)處理和分析是至關(guān)重要的。Apache Flink是一個(gè)流處理框架,可以用于實(shí)時(shí)數(shù)據(jù)處理和分析。在許多場(chǎng)景下,F(xiàn)link需要與數(shù)據(jù)庫(kù)和Kafka等消息系統(tǒng)進(jìn)行集成,以實(shí)現(xiàn)更高效的數(shù)據(jù)處理。本文將討論Flink與數(shù)據(jù)庫(kù)和Kafka集成的優(yōu)化案例,并提供實(shí)際示

    2024年02月20日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包