如何在 C# .NET 中最大限度地减少从 Azure 查询传出的数据
How to Minimize Data Transfer Out From Azure Query in C# .NET
我有一个小的 table(23 行,2 个 int 列),只是一个基本的用户-activity 监视器。第一列代表用户 ID。第二列包含一个对每个用户都应该是唯一的值,但如果两个值相同,我必须提醒用户。我正在使用 Azure Sql 数据库来保存此 table,并使用 C# 中的 Linq to Sql 来 运行 查询。
问题:Microsoft 将根据从其数据中心传出的数据向我收费。我希望我的所有用户都时刻了解此 table 的当前状态,并且将每月的数据传输量控制在 5 GB 以下。我正在考虑 Linq-To-Sql 表达式,例如
UserActivity.Where(x => x.Val == myVal).Count() > 1;
但是这会将 table 下载到客户端,这是不可能发生的。我应该实施 Linq 解决方案吗?或者 SqlDataReader 会从服务器下载更少的元数据吗?我是否通过使用数据库采取了正确的方法?给我想法!
如果是数据传输,您担心需要在服务器上进行处理,return 只需要结果。 SQLDataReader 解决方案可以 return 一个较小的、已经处理过的数据集来最小化流量。
这里有几点想法:
首先,我强烈建议您对 LINQ-to-SQL 查询生成的 SQL 进行概要分析。有几种工具可用于此,这里是随机的一种(我没有特别的偏好或从属关系):
尽管您之前有 LINQ 查询效率低下的经验,但您在问题中引用的 LINQ 示例并不是特别复杂,所以我希望您可以有效地使其或类似的工作,只要有像上面的工具这样的良好反馈机制或相似。
其次,您没有明确提及您的查询客户端是 运行 在 Azure 中还是在 Azure 外部,但我从您对数据传出成本的担忧中了解到它在 Azure 外部 运行。因此,数据出口成本将是使用 TDS 协议(low-level 协议用于 SQL 服务器)的查询结果,这是非常有效的。一些快速 back-of-the-napkin 数学表明,您应该可以保持在每月 5 GB 限制以下:
- 23 位用户
- 10 hours/day
- 30 days/month(如果只有工作日则更少)
- 3600 requests/hour/user
- 每个响应 32 位原始数据
= 每月大约 95 MB 的原始响应数据
即使您假设 header 元数据等的 TDS 开销为 10 倍(如果我的计算正确:-)),那么您在 5 GB 以下仍有足够的空间。关键不是你应该停止考虑它并假设它很好......但也不要假设它不好。事实上,不要假设任何事情。测试、测量并做出明智的选择。我怀疑您会找到一种方法将内存保持在 5 GB 以下而不会遇到太多麻烦,即使使用 LINQ 也是如此。
另一个想法...也许您可以考虑 运行 您在 Azure 中的查询,并权衡其成本与 "query running outside Azure" 场景下的数据传出成本?这可以(例如)采用小型 Azure Web 作业的形式,该作业每秒运行一次查询,并在计数超过 1 时通知 23 个用户。
本质上,如果条件为假,您不会通知他们,只有当条件为真时才通知他们。至于通知机制,有多种选择cloud-friendly:
Azure mobile push notifications
这里的关键是确定它是否更 cost-effective 并符合任何 bigger-picture 技术或业务目标,让每个用户连续发出查询,或者在 Azure 中使用一些单独的进程如果满足 "trigger condition",则异步通知用户。
祝你好运!
我有一个小的 table(23 行,2 个 int 列),只是一个基本的用户-activity 监视器。第一列代表用户 ID。第二列包含一个对每个用户都应该是唯一的值,但如果两个值相同,我必须提醒用户。我正在使用 Azure Sql 数据库来保存此 table,并使用 C# 中的 Linq to Sql 来 运行 查询。
问题:Microsoft 将根据从其数据中心传出的数据向我收费。我希望我的所有用户都时刻了解此 table 的当前状态,并且将每月的数据传输量控制在 5 GB 以下。我正在考虑 Linq-To-Sql 表达式,例如
UserActivity.Where(x => x.Val == myVal).Count() > 1;
但是这会将 table 下载到客户端,这是不可能发生的。我应该实施 Linq 解决方案吗?或者 SqlDataReader 会从服务器下载更少的元数据吗?我是否通过使用数据库采取了正确的方法?给我想法!
如果是数据传输,您担心需要在服务器上进行处理,return 只需要结果。 SQLDataReader 解决方案可以 return 一个较小的、已经处理过的数据集来最小化流量。
这里有几点想法:
首先,我强烈建议您对 LINQ-to-SQL 查询生成的 SQL 进行概要分析。有几种工具可用于此,这里是随机的一种(我没有特别的偏好或从属关系):
尽管您之前有 LINQ 查询效率低下的经验,但您在问题中引用的 LINQ 示例并不是特别复杂,所以我希望您可以有效地使其或类似的工作,只要有像上面的工具这样的良好反馈机制或相似。
其次,您没有明确提及您的查询客户端是 运行 在 Azure 中还是在 Azure 外部,但我从您对数据传出成本的担忧中了解到它在 Azure 外部 运行。因此,数据出口成本将是使用 TDS 协议(low-level 协议用于 SQL 服务器)的查询结果,这是非常有效的。一些快速 back-of-the-napkin 数学表明,您应该可以保持在每月 5 GB 限制以下:
- 23 位用户
- 10 hours/day
- 30 days/month(如果只有工作日则更少)
- 3600 requests/hour/user
- 每个响应 32 位原始数据
= 每月大约 95 MB 的原始响应数据
即使您假设 header 元数据等的 TDS 开销为 10 倍(如果我的计算正确:-)),那么您在 5 GB 以下仍有足够的空间。关键不是你应该停止考虑它并假设它很好......但也不要假设它不好。事实上,不要假设任何事情。测试、测量并做出明智的选择。我怀疑您会找到一种方法将内存保持在 5 GB 以下而不会遇到太多麻烦,即使使用 LINQ 也是如此。
另一个想法...也许您可以考虑 运行 您在 Azure 中的查询,并权衡其成本与 "query running outside Azure" 场景下的数据传出成本?这可以(例如)采用小型 Azure Web 作业的形式,该作业每秒运行一次查询,并在计数超过 1 时通知 23 个用户。
本质上,如果条件为假,您不会通知他们,只有当条件为真时才通知他们。至于通知机制,有多种选择cloud-friendly:
Azure mobile push notifications
这里的关键是确定它是否更 cost-effective 并符合任何 bigger-picture 技术或业务目标,让每个用户连续发出查询,或者在 Azure 中使用一些单独的进程如果满足 "trigger condition",则异步通知用户。
祝你好运!