最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#拼接SQL語句 用ROW_NUMBER實現(xiàn)的高效分頁排序

 更新時間:2012年05月23日 15:53:36   作者:  
C#拼接SQL語句,SQL Server 2005+,多行多列大數(shù)據(jù)量情況下,使用ROW_NUMBER實現(xiàn)的高效分頁排序
如果項目中要用到數(shù)據(jù)庫,鐵定要用到分頁排序。之前在做數(shù)據(jù)庫查詢優(yōu)化的時候,通宵寫了以下代碼,來拼接分頁排序的SQL語句

復(fù)制代碼 代碼如下:

/// <summary>
/// 單表(視圖)獲取分頁SQL語句
/// </summary>
/// <param name="tableName">表名或視圖名</param>
/// <param name="key">唯一鍵</param>
/// <param name="fields">獲取的字段</param>
/// <param name="condition">查詢條件(不包含WHERE)</param>
/// <param name="collatingSequence">排序規(guī)則(不包含ORDER BY)</param>
/// <param name="pageSize">頁大小</param>
/// <param name="pageIndex">頁碼(從1開始)</param>
/// <returns>分頁SQL語句</returns>
public static string GetPagingSQL(
string tableName,
string key,
string fields,
string condition,
string collatingSequence,
int pageSize,
int pageIndex)
{
string whereClause = string.Empty;
if (!string.IsNullOrEmpty(condition))
{
whereClause = string.Format("WHERE {0}", condition);
}

if (string.IsNullOrEmpty(collatingSequence))
{
collatingSequence = string.Format("{0} ASC", key);
}

StringBuilder sbSql = new StringBuilder();

sbSql.AppendFormat("SELECT {0} ", PrependTableName(tableName, fields, ','));
sbSql.AppendFormat("FROM ( SELECT TOP {0} ", pageSize * pageIndex);
sbSql.AppendFormat(" [_RowNum_] = ROW_NUMBER() OVER ( ORDER BY {0} ), ", collatingSequence);
sbSql.AppendFormat(" {0} ", key);
sbSql.AppendFormat(" FROM {0} ", tableName);
sbSql.AppendFormat(" {0} ", whereClause);
sbSql.AppendFormat(" ) AS [_TempTable_] ");
sbSql.AppendFormat(" INNER JOIN {0} ON [_TempTable_].{1} = {0}.{1} ", tableName, key);
sbSql.AppendFormat("WHERE [_RowNum_] > {0} ", pageSize * (pageIndex - 1));
sbSql.AppendFormat("ORDER BY [_TempTable_].[_RowNum_] ASC ");

return sbSql.ToString();
}

/// <summary>
/// 給字段添加表名前綴
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="fields">字段</param>
/// <param name="separator">標(biāo)識字段間的分隔符</param>
/// <returns></returns>
public static string PrependTableName(string tableName, string fields, char separator)
{
StringBuilder sbFields = new StringBuilder();

string[] fieldArr = fields.Trim(separator).Split(separator);
foreach (string str in fieldArr)
{
sbFields.AppendFormat("{0}.{1}{2}", tableName, str.Trim(), separator);
}

return sbFields.ToString().TrimEnd(separator);
}

假設(shè)有如下產(chǎn)品表:
復(fù)制代碼 代碼如下:

CREATE TABLE [dbo].[Tbl_Product]
(
[ID] [int] IDENTITY(1, 1)
NOT NULL ,
[ProductId] [varchar](50) NOT NULL ,
[ProductName] [nvarchar](50) NOT NULL ,
[IsDeleted] [int] NOT NULL
CONSTRAINT [DF_Tbl_Product_IsDeleted] DEFAULT ( (0) ) ,
CONSTRAINT [PK_Tbl_Product] PRIMARY KEY CLUSTERED ( [ProductId] ASC )
WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
)
ON [PRIMARY]

Tbl_Product->ID(序號,非空,自增)
Tbl_Product->ProductId(產(chǎn)品Id,主鍵)
Tbl_Product->ProductName(產(chǎn)品名稱,非空)
Tbl_Product->IsDeleted(虛擬刪除標(biāo)記,非空)
調(diào)用BasicFunction.GetPagingSQL("Tbl_Product", "ID", "ID,ProductId,ProductName", "IsDeleted=0", "ProductName ASC, ID DESC", 5, 5),BasicFunction為分頁排序方法所在的靜態(tài)類,生成的分頁排序SQL語句如下(已手動調(diào)整了格式):
復(fù)制代碼 代碼如下:

SELECT Tbl_Product.ID ,
Tbl_Product.ProductId ,
Tbl_Product.ProductName
FROM ( SELECT TOP 25
[_RowNum_] = ROW_NUMBER() OVER ( ORDER BY ProductName ASC, ID DESC ) ,
ID
FROM Tbl_Product
WHERE IsDeleted = 0
) AS [_TempTable_]
INNER JOIN Tbl_Product ON [_TempTable_].ID = Tbl_Product.ID
WHERE [_RowNum_] > 20
ORDER BY [_TempTable_].[_RowNum_] ASC

查詢的字段列表,去掉了不關(guān)心的字段(這里為IsDeleted,因為條件里面IsDeleted=0,查出來的產(chǎn)品都是沒被刪除的);
排序依據(jù),在調(diào)用該方法時,應(yīng)盡量確保排序的依據(jù)可以唯一確定記錄在結(jié)果集中的位置(這里添加了輔助排序依據(jù),ID DESC,如果產(chǎn)品重名,添加的晚的排在前面);
性能優(yōu)化的一點兒建議:如果字段的值是計算出來的,如:總價=單價*數(shù)量,而此時需要總價大于多少的記錄,還得拿總價遞增或者遞減排序,如果不要臨時表,數(shù)據(jù)量大的時候,就等著買新電腦吧!你問我為什么要買新電腦,哦,因為你會把現(xiàn)在的電腦砸掉!O(∩_∩)O~
另外一點兒建議,使用ROW_NUMBER時,切記一定要和“TOP n”一起使用,n等于int.MaxValue都比不加“TOP n”時要快。
最后,拜托哪位好心人士給測試下性能,拜托了,本人數(shù)據(jù)庫菜鳥,不太懂得數(shù)據(jù)庫的性能測試。

我只知道我對我寫的分頁排序還是很有信心的,(*^__^*) 嘻嘻!

首發(fā):博客園->劍過不留痕

相關(guān)文章

  • C#冒泡法排序算法實例分析

    C#冒泡法排序算法實例分析

    這篇文章主要介紹了C#冒泡法排序算法,結(jié)合兩個常用實例分析了C#冒泡排序算法的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2015-07-07
  • WPF實現(xiàn)類似ChatGPT逐字打印效果的示例代碼

    WPF實現(xiàn)類似ChatGPT逐字打印效果的示例代碼

    前一段時間ChatGPT類的應(yīng)用十分火爆,這類應(yīng)用在回答用戶的問題時逐字打印輸出,像極了真人打字回復(fù)消息,本文就來利用WPF模擬一下這種逐字打印的效果吧
    2023-08-08
  • C#修改MAC地址類的實例

    C#修改MAC地址類的實例

    C#修改MAC地址類的實例,需要的朋友可以參考一下
    2013-03-03
  • C#預(yù)處理器指令的用法實例分析

    C#預(yù)處理器指令的用法實例分析

    這篇文章主要介紹了C#預(yù)處理器指令的用法,以實例形式較為詳細(xì)的分析了預(yù)處理器指令的原理與相應(yīng)的用法,有助于深入理解C#程序的運行原理,需要的朋友可以參考下
    2014-11-11
  • C#微信公眾號開發(fā)之接收事件推送與消息排重的方法

    C#微信公眾號開發(fā)之接收事件推送與消息排重的方法

    這篇文章主要介紹了C#微信公眾號開發(fā)之接收事件推送與消息排重的方法,詳細(xì)分析了事件推送與消息排重的使用技巧,對微信開發(fā)有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • WPF實現(xiàn)動畫效果(六)之路徑動畫

    WPF實現(xiàn)動畫效果(六)之路徑動畫

    這篇文章介紹了WPF實現(xiàn)動畫效果之路徑動畫,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#提取PPT文本和圖片的實現(xiàn)方法

    C#提取PPT文本和圖片的實現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了C#提取PPT文本和圖片的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • C#實現(xiàn)雙端隊列的示例代碼

    C#實現(xiàn)雙端隊列的示例代碼

    雙端隊列是一種可以在兩端擴展或收縮的序列化容器,本文主要介紹了C#實現(xiàn)雙端隊列的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • WPF實現(xiàn)手風(fēng)琴式輪播圖切換效果

    WPF實現(xiàn)手風(fēng)琴式輪播圖切換效果

    這篇文章主要為大家詳細(xì)介紹了WPF實現(xiàn)手風(fēng)琴式輪播圖切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C#實現(xiàn)判斷當(dāng)前操作用戶管理角色的方法

    C#實現(xiàn)判斷當(dāng)前操作用戶管理角色的方法

    這篇文章主要介紹了C#實現(xiàn)判斷當(dāng)前操作用戶管理角色的方法,涉及C#針對系統(tǒng)用戶判斷的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08

最新評論

盈江县| 喀什市| 通榆县| 观塘区| 房产| 白玉县| 海南省| 石屏县| 淮滨县| 厦门市| 区。| 许昌县| 靖安县| 张家界市| 台湾省| 客服| 海阳市| 荃湾区| 昭平县| 诸城市| 民乐县| 察雅县| 宜州市| 河北区| 金寨县| 新乡市| 吉木乃县| 塘沽区| 渝北区| 德清县| 湄潭县| 潢川县| 宣汉县| 留坝县| 齐河县| 金华市| 池州市| 花垣县| 苏州市| 田阳县| 拉萨市|