時間:2024-03-11 15:08作者:下載吧人氣:20
問題背景
許多開發(fā)和測試人員都可能遇到過列表的數(shù)據(jù)翻下一頁的時候顯示了上一頁的數(shù)據(jù),也就是翻頁會有重復(fù)的數(shù)據(jù)。
如何處理?
這個問題出現(xiàn)的原因是因?yàn)檫x擇的排序字段有重復(fù),常見的處理辦法就是排序的時候加上唯一字段,這樣在分頁的過程中數(shù)據(jù)就不會重復(fù)了。 關(guān)于這個問題文檔也有解釋并非是一個bug。而是排序時需要選擇唯一字段來做排序,不然返回的結(jié)果不確定
排序返回數(shù)據(jù)重復(fù)的根本原因是什么呢?
經(jīng)常優(yōu)化sql的同學(xué)可能會發(fā)現(xiàn),執(zhí)行計劃里面會有Sort Method這個關(guān)鍵字,而這個關(guān)鍵字就是排序選擇的方法。abase的排序分為三種
quicksort 快速排序
top-N heapsort Memory 堆排序
external merge Disk 歸并排序
推測
分頁重復(fù)的問題和執(zhí)行計劃選擇排序算法的穩(wěn)定性有關(guān)。
簡單介紹下這三種排序算法的場景:
在有索引的情況下:排序可以直接走索引。 在沒有索引的情況下:當(dāng)表的數(shù)據(jù)量較小的時候選擇快速排序(排序所需必須內(nèi)存小于work_mem), 當(dāng)排序有l(wèi)imit,且耗費(fèi)的內(nèi)存不超過work_mem時選擇堆排序, 當(dāng)work_mem不夠時選擇歸并排序。
驗(yàn)證推測
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)友評論