---
title : SQL效能調校
tags: SQL效能調校
creat-date: 2022-12-21
update_date : 2022-12-21
---
---
## SQL 效能調校
---
### 一、連線字串使用 using:
**原始寫法:**
```c#=
public static DataTable QueryData(int nPyear)
{
ado db = new ado(CS.GConst.CONN_Default);
string sSql = @" SELECT *
FROM wra_plan
WHERE pyear= @pyear ";
var sqlParams = new SqlParameterBuilder();
sqlParams.Add("@pyear", SqlDbType.Int, nPyear);
return db.getDT(sSql, sqlParams.getParamList()).toDataTable();
}
```
**使用 using 改寫:**
```c#=
public static DataTable QueryData(int nPyear)
{
DataTable RtVal = null;
using (DbHelper db = new DbHelper(CS.GConst.CONN_Default)) {
string sSql = @"SELECT *
FROM wra_plan
WHERE pyear= @pyear ";
db.CommandText = sSql;
db.Parameters.Clear();
db.Parameters.Add("@pyear", SqlDbType.Int, nPyear);
RtVal = db.GetTable();
}
return RtVal;
}
```
### 二、Where 條件用程式改寫:
```c#=
public static DataTable QueryPlanPriceUnitLv1(int nPyear)
{
DataTable RtVal = null;
using (DbHelper db = new DbHelper(CS.GConst.CONN_Default)) {
string sqlcmd = @"SELECT pyear,short_unit_name AS UnitName,Total,TotalPrice2,ISNULL(TotalPrice,0) AS TotalPrice
FROM V_H_WraPlanPrice_UnitLv1
--WHERE pyear=@pyear
ORDER BY pyear,unit_order;";
db.CommandText = sqlcmd;
//db.Parameters.Clear();
//db.Parameters.Add("@pyear", nPyear);
RtVal = db.GetTable();
}
// 「Where pyear=@pyear」條件改用程式篩選
for (int i = 0; i <= RtVal.Rows.Count - 1; i++) {
DataRow dr = RtVal.Rows[i];
if (Convert.ToInt32(dr["pyear"]) != nPyear)
dr.Delete();
}
RtVal.AcceptChanges();
return RtVal;
}
```
### 三、少用序列函數 ROW_NUMBER():
**SQL語法:**
```c#=
public static GisTable ListvProjectBasicQuery(int nYearStart, int nYearEnd)
{
DbHelper db = new DbHelper(AppGlobal.ConnectionString);
db.Parameters.Clear();
db.CommandText = @"SELECT --ROW_NUMBER() OVER (ORDER BY ProjectYear,vPB.ProjectId) AS FlowNo,
*,
CASE WHEN ProjectType in ('01','02') AND (TelExtension='' OR PBS.ProjectId IS NOT NULL) THEN 'N'
WHEN ProjectType='03' AND (TelExtension='' OR Village = '' OR PBS.ProjectId IS NOT NULL) THEN 'N'
WHEN ProjectType='04' AND (ProjectNature='' OR ProjectEnginType= '' OR TelExtension = '' OR Village = ''
OR PBS.ProjectId IS NOT NULL OR (IsNonOpeningCeremony='Y' AND OpeningCeremonyDate IS null)) THEN 'N'
ELSE 'Y' END AS ProjectBasicFinish
FROM vProjectBasicQuery vPB INNER JOIN
Sync_Department AS SD ON vPB.AgencyUnit2Id=SD.OU AND SD.Dn like '%,OU=387100000G,%' LEFT JOIN
(SELECT distinct ProjectId
FROM ProjectBudgetSource
WHERE SourceItem='中央部會' and (PlanName='' or SubsidySituation='' or ApplicationDate= '' or ApplicationNo='')) PBS
ON vPB.ProjectId = PBS.ProjectId
WHERE ProjectYear BETWEEN @YearStart AND @YearEnd
ORDER BY ProjectYear,vPB.ProjectId ";
db.Parameters.Add("@YearStart", nYearStart);
db.Parameters.Add("@YearEnd", nYearEnd);
return db.GetTable();
}
```
**ListView中的流水號「項次」:**
```c#=
<asp:ListView ID="lvProject" runat="server" DataKeyNames="ProjectId" EnableViewState="true">
<GroupTemplate>
<asp:PlaceHolder runat="server" ID="itemPlaceholder" />
</GroupTemplate>
<LayoutTemplate>
<table class="table_list table-rwd">
<thead>
<tr>
<th class="center" style="width:3%">項次</th>
<th class="center" style="width:3%">年度</th>
<th class="center" style="width:19%">案件名稱</th>
</tr>
</thead>
<tbody>
<asp:PlaceHolder ID="groupPlaceholder" runat="server" />
</tbody>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<%--<td data-th="項次" class="center"><%# HttpUtility.HtmlEncode(Eval("FlowNo")) %></td>--%>
<td data-th="項次" class="center"><%# Container.DataItemIndex + 1 %></td>
<td data-th="年度" class="center"><%# HttpUtility.HtmlEncode(Eval("ProjectYear")) %></td>
<td data-th="案件名稱" class="left"><%# HttpUtility.HtmlEncode(Eval("ProjectName")) %></td>
</tr>
</ItemTemplate>
<EmptyDataTemplate>
</EmptyDataTemplate>
</asp:ListView>
```