请教各位,如何分批获取数据库中数据

请教各位,如何分批获取数据库中数据,第1张

在有些业务场景中需要分批去取数据表中的全部数据来进行处理,最简单的方法就是使用分页查询语句(偷懒以MySQL为例):

[sql] view plain copy print

select from datatable limit offset,amount

select from datatable limit offset,amount

这里就会有一个问题,随着offset值的越来越大,这条sql要扫描的表数据就会越来越多,因为要定位到offset这一行就需要扫描比offset小的所有行。显然在一张大数据量的表中,去这样做,性能就会出问题。为了避免这样的情形出现,我们自然会想到使用索引来解决,比如使用自增序列id进行分批取:

[sql] view plain copy print

select from datatable where id >= start and id<start+batchCount

select from datatable where id >= start and id<start+batchCount

这样我们对id建索引,然后分批去取,显然效果会高很多,但是如果自增序列由于删除等 *** 作变得不是连续,就会出现空执行和多执行的情况出现。要解决这个方法,我们就需要结合使用索引和分页的优势来处理:

[sql] view plain copy print

select from datatable where id >= start limit batchCount

select from datatable where id >= start limit batchCount

然后每次取回来我们再计算出起始id值,再去取下一批数据。这样就可以既避免了第一种不走索引,查询性能低下的问题,又解决了第二种id不连续,导致取回来的数据量不稳定导致浪费的问题了。

/// <summary>

/// 获得目标服务器所有数据库名

/// </summary>

/// <param name="serverName"></param>

/// <param name="userName"></param>

/// <param name="password"></param>

public void getDataBaseNameList(string serverName, string userName, string password)

{

SQLDMOApplication sqlApplication = new SQLDMOApplicationClass();

SQLDMOSQLServer sqlServer = new SQLDMOSQLServerClass();

sqlServerConnect(serverName, userName, password); // 连接服务器

foreach (SQLDMODatabase databBase in sqlServerDatabases)

{

if (databBaseName != null)

{

thisDataBaseTreeViewNodesAdd(databBaseName);

getDataBaseTableList(serverName, userName, password, databBaseName);

}

}

}

/// <summary>

/// 加载数据库中

/// </summary>

/// <param name="serverName">服务器名</param>

/// <param name="userName">用户名</param>

/// <param name="password">密码</param>

/// <param name="dataBaseName">数据库名</param>

private void getDataBaseTableList(string serverName, string userName, string password, string dataBaseName)

{

SQLDMOSQLServer Server = new SQLDMOSQLServerClass();

//连接到服务器

ServerConnect(serverName, userName, password);

//对所有的数据库遍历,获得指定数据库

for (int i = 0; i < ServerDatabasesCount; i++)

{

//判断当前数据库是否是指定数据库

if (ServerDatabasesItem(i + 1, "dbo")Name == dataBaseName)

{

//获得指定数据库

SQLDMO_Database db = ServerDatabasesItem(i + 1, "dbo");

//获得指定数据库中的所有表

for (int j = 0; j < dbTablesCount; j++)

{

thisDataBaseTreeViewNodes[i]NodesAdd(dbTablesItem(j + 1, "dbo")Name);

}

}

}

}

/// <summary>

/// 获得表中所有列名

/// </summary>

/// <param name="serverName">服务器名</param>

/// <param name="userName">用户名</param>

/// <param name="password">密码</param>

/// <param name="tableName">表名</param>

/// <param name="dataBaseName">数据库名</param>

/// <returns></returns>

public string getRowListFromTable(string serverName, string userName, string password, string tableName, string dataBaseName)

{

string result = stringEmpty;

string connectionString = stringEmpty;

connectionString += "server=" + serverName;

connectionString += ";Pwd=" + password;

connectionString += ";UID=" + userName;

connectionString += ";Database=" + dataBaseName;

string commandString = stringEmpty;

commandString += "select name from syscolumns where id=object_id('";

commandString += tableName;

commandString += "')";

SqlConnection sqlConnection = new SqlConnection(connectionString);

SqlCommand sqlCommand = new SqlCommand(commandString, sqlConnection);

SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, sqlConnection);

DataSet dataSet = new DataSet();

dataAdapterFill(dataSet);

DataTable dataTable = dataSetTables[0];

// DataTable dataTable = sqlConnectionGetSchema("Tables");

foreach (DataRow row in dataTableRows)

{

result += row[0]ToString() + "-";

}

if (result != null)

{

return result;

}

else

{

return "0";

}

}

打开SQL企业管理器,把所涉及的两个数据库都连接上

打开旧数据库

表--

搞定了,数据表结构以及表中数据就全部复制过来了,至于你取部分数据什么的,自己通过SQL查询分析器去修改表中的数据吧

以上就是关于请教各位,如何分批获取数据库中数据全部的内容,包括:请教各位,如何分批获取数据库中数据、winform如何拿到一个服务器中所有数据库名称、关于SQL数据库提取数据的问题(如何提取数据库中的数据)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9525311.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存