SQL反模式筆記15 隨機排序

2022-02-17 17:07:27 字數 714 閱讀 8633

目標:隨即排序

反模式:

使用rand()

缺點是無法利用索引,而且是全表遍歷,效能太差

合理使用反模式:

資料量很小的時候可以用

解決方案:

1、使用隨機數

ceil(rand()*(select max(id) from t) as randid)

問題是,取出的id有可能是不存在的,因為id不是連續的

2、選擇下乙個最大值

為了避免id不存在,我們找上面那條id的後一條資料。方法是:用上面那條sql和主表再關聯一次,然後找關聯後的第一條

3、使用row_number

這一章也很搞啊,作者咋想的?使用rand()根本無法隨機排序。

select *,rand()as number from people --這個執行結果的每行number都是一樣的(當然,每執行一次number會變一下),所以根本無法用它排序。

隨機排序就用newid()就行了啊。

題外話:sqlserver的rand,乙個種子只會得到唯一的結果。更杯具的是,種子連續的話,rand(seed)的結果也是有規律的!這一點很要命,以前我們用它生產乙個隨機碼,為了避免重複,用表id做seed,結果可想而知,隨機數的結果是有規律的......

查詢反模式 隨機選擇

隨機數在資料庫中是經常用到的系統。在sql server中查詢隨機數最簡單的方法為 select top1 from person order bynewid 以上sql語句的執行計畫如下 以上這種方法,需要對整個表進行一次排序,而且還無法有效地使用索引。加入我們只需要前幾條資料,那麼好不容易對整個...

SQL反模式筆記18 使用 查詢

目標 減少輸入 反模式 使用 缺點1 傳輸的資料量大。解決方案 明確列出列名 這一章內容太簡單了,好像沒啥可說的。我想起用ibatis的時候遇到的乙個問題 最初的sql都是自動生成的,比如根據id update某個表,輸入引數是這個表對應的乙個entity,包含了這個表幾乎所有的字段。這樣使用的時候...

SQL反模式筆記16 模糊查詢

目標 模糊查詢 反模式 like 缺點 效能太差,無法使用索引,必須全表遍歷。合理使用反模式 資料量小 條件簡單時可以用。解決方案 使用特殊的搜尋引擎而不是sql 1 資料庫擴充套件,各大資料庫都有對全文檢索的解決方案,但是配置複雜。2 使用第三方搜尋引擎,比如lucene.3 實現自己的搜尋引擎 ...