在有些大系統(tǒng)中,客戶端查詢非常復雜,需要顯示很多字段和過濾很多條件,例如TFS中的條件過濾,或則用戶希望客戶端查詢能像EXCEL過濾那樣方便
這樣可能導致查詢語句非常復雜,此時的效率也比較低.
TFS查詢條件界面:
如果可以獲取查詢語句的成本,當SQL語句執(zhí)行成本很大(可能執(zhí)行時間會很長時),系統(tǒng)自動提示用戶是否繼續(xù)或則大概需要多長時間,這樣會提高用戶體驗.
下舉一例:
查詢Sql Server中的所有列信息表:sys.all_columns
在Sql server 2k8 management studio 中先后執(zhí)行下面每行語句即可得到Sql語句的成本, 即為第二個語句執(zhí)行結果中第一行中TotalSubtreeCost字段值.
set showplan_all on
select * from sys.all_columns
第二個語句(select * from sys.all_columns)執(zhí)行結果:
再執(zhí)行 set showplan_all off結束查詢計劃分析結果.
此時可以應用showplan_all來獲取Sql查詢的成本.
如下為C#簡單實現(xiàn)上述應用,在VS2k8中編譯通過,只需正確更改Data Source即可運行:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
SqlConnectionStringBuilder connectionBuilder = new SqlConnectionStringBuilder();
connectionBuilder.Add("Data Source", "your server name or ip");
connectionBuilder.Add("Initial Catalog", "master");
connectionBuilder.Add("Integrated Security", "True");
string sqlStr = "select * from sys.all_columns";
Console.WriteLine(GetSqlCost(connectionBuilder.ToString(), sqlStr).ToString());
Console.Read();
}
static double GetSqlCost(string connectStr, string strSQL)
{
double sqlCost;
int timeOut;
SqlDataAdapter adapter;
SqlConnection connection = new SqlConnection(connectStr);
SqlCommand command;
DataTable table;
timeOut = 180;
adapter = null;
try
{
connection.Open();
command = new SqlCommand("set showplan_all on ", connection);
command.ExecuteNonQuery();
command.CommandText = strSQL;
adapter = new SqlDataAdapter(strSQL, connection);
adapter.SelectCommand.CommandTimeout = timeOut;
table = new DataTable();
adapter.Fill(table);
command.CommandText = "set showplan_all off";
command.ExecuteNonQuery();
sqlCost = System.Convert.ToDouble(table.Rows[0]["TotalSubtreeCost"]);
}
finally
{
command = null;
connection.Close();
}
return sqlCost;
}
}
}