【问题标题】:DBGrid Filter, Delphi.DBGrid 过滤器,德尔福。
【发布时间】:2014-09-22 17:43:59
【问题描述】:

我最近深入研究了 Delphi 的世界,对于我当前的迷你项目,我通过 SQL 查询获取数据,然后使用 filter 属性准确显示我想要的内容。

我错误地发现了过滤器,现在我更喜欢它,而不是建立多个连接或调用数据库。例如,我正在返回一个可能拥有许多汽车的人员对象,该应用程序有一个复选框,并且根据选择了哪一个,它将更新过滤器以仅显示他的汽车是蓝色或粉红色或其他。

据我了解,过滤器的作用类似于 where 子句,但作用于从初始查询返回的数据集。所以,我的问题是:以这种方式处理小型数据集时使用过滤器属性是否更快,我认为返回、存储数据集然后应用过滤器而不是不断更新是完全错误的?

我在网上查看过,资源确实让我相信它更有效,但我仍然不确定。感谢您的帮助。

【问题讨论】:

    标签: sql delphi filter delphi-7 advantage-database-server


    【解决方案1】:

    数据集上的过滤器确实像WHERE 子句一样工作(或至少表现得如此),并且在某些情况下可能非常快。

    依赖过滤器的问题是:

    1. 网络流量增加。您正在将更多不需要的数据从服务器移动到客户端,因为无论如何您只是将其过滤掉。

    2. 过滤器逐行应用于数据。 WHERE 子句可以由服务器优化为全部(或至少部分)基于现有索引,而客户端没有这些索引可用。

    3. 增加了客户端的内存和 CPU 使用率,以维护内存中未使用的数据并处理行以进行过滤。

    4. 其他用户或进程更新的数据对客户端应用程序不可见,因为您现在正在处理本地内存中的所有数据,而不是从服务器刷新。

    IMO,对除了微不足道的数据集以外的所有数据集使用过滤器不是一个好的选择,如果数据量那么小,您可以将整个数据集移动到 TClientDataSet 并自己保存在内存中。与正在考虑的所有其他优化一样,正确的答案取决于您的应用程序的需求和有问题的实际数据,并且应该使用该标准进行基准测试以确定什么是实际上更好的解决方案。

    【讨论】:

    • 初始查询的结果存储在某处——在本地机器的内存中。设置一个过滤器,然后迭代内存中的行来决定每一行是否满足过滤条件。
    • 如果您只处理 20 行,只要其他用户不更改这 20 行的内容,过滤器就应该可以正常工作。这是可以忽略不计(微不足道)的数据量,对于这么小的数据集,过滤器应该非常快。
    • FWIW,您可能会查看 DevExpress ExpressGrid。他们使用内存表,让您能够设置大量不同类型的过滤器,让用户轻松查看不同的数据集。顺便说一句,我已经看到这些在实际上有数百条记录且每条记录有数十个字段的情况下使用。它们的速度非常快。 TMS 也有一些非常漂亮的带有过滤器的网格,您可以查看它们。关键是,TClientDataSet 只是一个内存表。 DevEx 和 TMS 都有自己的与他们的解决方案紧密配合的方式。您也可以使用 kbmMemTable。
    • 这取决于。除了过滤数据以供显示之外,您还在做什么?如果您正在修改数据,或者您需要以各种方式对其进行排序而不重新查询服务器,那么TClientDataSet(简称 CDS)就可以很好地工作。您可以创建用于排序的内存索引、过滤数据、维护可应用回服务器行的更改日志、嵌套其他表以进行查找以及各种其他类型的事情。它们还制作了用于收集用户输入的出色表格,您可以附加数据感知控件(DBEdit/DBGrid/DBText、添加验证等。
    • @DavidSchwartz:DevEx 的 ExpressGrid 是一种非常昂贵的产品,对这里提出的问题没有明显的适用性。对于询问数据集上的过滤器是否可以“仅显示蓝色汽车”的问题来说,这是非常过分的。 TClientDataSet 和标准 TDBGrid 可以很好地用于此处描述的用途。
    【解决方案2】:

    两种不同的动物。您问的是重复查询数据库或仅在客户端进行过滤是否会减少开销。

    如果您的应用程序和数据库都在同一台机器上运行,那么这可能是一个折腾。

    但是,如果您在客户端-服务器、n 层或分区移动应用程序中运行它,并且这是一种常见操作,那么我会说您最好缓存更多的结果集在客户端的单个查询中并使用过滤器允许用户查看结果的不同视图。这减少了主机带宽,用户享受更快的响应时间。

    (搜索汽车、公寓或房地产是我的烦恼,我选中或取消选中一个框以更改视图,我必须等待 5-10 秒才能让应用回复。)

    也就是说,您可能还需要考虑数据的整体大小、时间性、更新频率,并查看是否值得将大量数据块加载到客户端并本地化更多专用视图。拉下整个记录并在本地缓存它们,以便为用户提供更快的响应时间。并尽可能减少缓存记录的重新加载。

    很多时候,每条记录的实际数据都相当小。但是,当您添加媒体内容时,它会爆炸。人们通常不会考虑这一点,只考虑包括媒体 blob 在内的每个“记录”的总大小。如果数据库设计者很聪明,媒体甚至不会存储在数据库中,而是存储在其他地方,并且可以通过 URL 访问。

    【讨论】:

    • 它目前在开发中,所以两者都在本地机器上,但发布时它将是客户端-服务器。我也有那个小毛病,太烦人了。 :) qry 返回的数据集相当小,可能最多 20 行人。其中包含的数据也比较小,主要由int或char组成。
    • 老实说,数据集越大,通过在本地缓存数据所看到的改进就越大。只要数据是相当静态的并且您不必担心争用,远程查询比本地过滤要昂贵得多——例如实时更新会计数据、时间敏感交易(例如股票)交易)和类似的东西。
    猜你喜欢
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2011-07-02
    相关资源
    最近更新 更多