欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

/// <summary>
/// 單表(視圖)獲取分頁(yè)SQL語(yǔ)句
/// </summary>
/// <param name="tableName">表名或視圖名</param>
/// <param name="key">唯一鍵</param>
/// <param name="fields">獲取的字段</param>
/// <param name="condition">查詢(xún)條件(不包含WHERE)</param>
/// <param name="collatingSequence">排序規(guī)則(不包含ORDER BY)</param>
/// <param name="pageSize">頁(yè)大小</param>
/// <param name="pageIndex">頁(yè)碼(從1開(kāi)始)</param>
/// <returns>分頁(yè)SQL語(yǔ)句</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)識(shí)字段間的分隔符</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(序號(hào),非空,自增)
Tbl_Product->ProductId(產(chǎn)品Id,主鍵)
Tbl_Product->ProductName(產(chǎn)品名稱(chēng),非空)
Tbl_Product->IsDeleted(虛擬刪除標(biāo)記,非空)
調(diào)用BasicFunction.GetPagingSQL("Tbl_Product", "ID", "ID,ProductId,ProductName", "IsDeleted=0", "ProductName ASC, ID DESC", 5, 5),BasicFunction為分頁(yè)排序方法所在的靜態(tài)類(lèi),生成的分頁(yè)排序SQL語(yǔ)句如下(已手動(dòng)調(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

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

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

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

相關(guān)文章

  • C#備忘錄人生存檔的設(shè)計(jì)模式實(shí)例

    C#備忘錄人生存檔的設(shè)計(jì)模式實(shí)例

    這篇文章主要為大家介紹了C#設(shè)計(jì)模式中備忘錄模式的實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • C#過(guò)濾sql特殊字符串的方法

    C#過(guò)濾sql特殊字符串的方法

    這篇文章介紹了C#過(guò)濾sql特殊字符串的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 關(guān)于C#結(jié)構(gòu)體 你需要知道的

    關(guān)于C#結(jié)構(gòu)體 你需要知道的

    這篇文章主要介紹了關(guān)于C#結(jié)構(gòu)體的相關(guān)知識(shí),以及使用方法,文中代碼非常詳細(xì),幫助大家更好的參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Unity UGUI的GridLayoutGroup網(wǎng)格布局組件使用詳解

    Unity UGUI的GridLayoutGroup網(wǎng)格布局組件使用詳解

    這篇文章主要介紹了Unity UGUI的GridLayoutGroup網(wǎng)格布局組件使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • C#連接藍(lán)牙設(shè)備的實(shí)現(xiàn)示例

    C#連接藍(lán)牙設(shè)備的實(shí)現(xiàn)示例

    本文主要介紹了C#連接藍(lán)牙設(shè)備的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • C# TreeView從數(shù)據(jù)庫(kù)綁定數(shù)據(jù)的示例

    C# TreeView從數(shù)據(jù)庫(kù)綁定數(shù)據(jù)的示例

    這篇文章主要介紹了C# TreeView從數(shù)據(jù)庫(kù)綁定數(shù)據(jù)的示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#關(guān)于Func和Action委托的介紹詳解

    C#關(guān)于Func和Action委托的介紹詳解

    委托是存有對(duì)某個(gè)方法的引用的一種引用類(lèi)型變量,本文主要介紹了C#關(guān)于Func和Action委托的介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#使用Redis的基本操作

    C#使用Redis的基本操作

    這篇文章主要介紹了C#使用Redis的基本操作,需要的朋友可以參考下
    2017-06-06
  • 如何使用C#操作幻燈片

    如何使用C#操作幻燈片

    一般大家經(jīng)常會(huì)用PPT遙控翻頁(yè)筆來(lái)遙控幻燈片,本文確為大家介紹了使用C#制作一個(gè)遙控幻燈片,感興趣的朋友可以參考下
    2015-07-07
  • Unity Undo實(shí)現(xiàn)原理和使用方法詳解

    Unity Undo實(shí)現(xiàn)原理和使用方法詳解

    本文將詳細(xì)介紹Unity Undo實(shí)現(xiàn)原理和使用方法,并提供多個(gè)使用例子,幫助開(kāi)發(fā)者更好地理解和應(yīng)用該功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論