時(shí)間:2024-03-11 15:08作者:下載吧人氣:22
問(wèn)題背景
許多開(kāi)發(fā)和測(cè)試人員都可能遇到過(guò)列表的數(shù)據(jù)翻下一頁(yè)的時(shí)候顯示了上一頁(yè)的數(shù)據(jù),也就是翻頁(yè)會(huì)有重復(fù)的數(shù)據(jù)。
如何處理?
這個(gè)問(wèn)題出現(xiàn)的原因是因?yàn)檫x擇的排序字段有重復(fù),常見(jiàn)的處理辦法就是排序的時(shí)候加上唯一字段,這樣在分頁(yè)的過(guò)程中數(shù)據(jù)就不會(huì)重復(fù)了。 關(guān)于這個(gè)問(wèn)題文檔也有解釋并非是一個(gè)bug。而是排序時(shí)需要選擇唯一字段來(lái)做排序,不然返回的結(jié)果不確定
排序返回?cái)?shù)據(jù)重復(fù)的根本原因是什么呢?
經(jīng)常優(yōu)化sql的同學(xué)可能會(huì)發(fā)現(xiàn),執(zhí)行計(jì)劃里面會(huì)有Sort Method這個(gè)關(guān)鍵字,而這個(gè)關(guān)鍵字就是排序選擇的方法。abase的排序分為三種
quicksort 快速排序
top-N heapsort Memory 堆排序
external merge Disk 歸并排序
推測(cè)
分頁(yè)重復(fù)的問(wèn)題和執(zhí)行計(jì)劃選擇排序算法的穩(wěn)定性有關(guān)。
簡(jiǎn)單介紹下這三種排序算法的場(chǎng)景:
在有索引的情況下:排序可以直接走索引。 在沒(méi)有索引的情況下:當(dāng)表的數(shù)據(jù)量較小的時(shí)候選擇快速排序(排序所需必須內(nèi)存小于work_mem), 當(dāng)排序有l(wèi)imit,且耗費(fèi)的內(nèi)存不超過(guò)work_mem時(shí)選擇堆排序, 當(dāng)work_mem不夠時(shí)選擇歸并排序。
驗(yàn)證推測(cè)
1.創(chuàng)建表,初始化數(shù)據(jù)
abase=# create table t_sort(n_int int,c_id varchar(300));
CREATE TABLE
abase=# insert into t_sort(n_int,c_id) select 100,generate_series(1,9);
INSERT 0 9
abase=# insert into t_sort(n_int,c_id) select 200,generate_series(1,9);
INSERT 0 9
abase=# insert into t_sort(n_int,c_id) select 300,generate_series(1,9);
INSERT 0 9
abase=# insert into t_sort(n_int,c_id) select 400,generate_series(1,9);
INSERT 0 9
abase=# insert into t_sort(n_int,c_id) select 500,generate_series(1,9);
INSERT 0 9
abase=# insert into t_sort(n_int,c_id) select 600,generate_series(1,9);
INSERT 0 9
網(wǎng)友評(píng)論