云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

京东云_阿里云摄像头_限时特惠

小七 141 0

增强生产数据库的SQL查询

博客SQL是最强大的数据处理工具之一。在sqlsuperstar中,我们为您提供可操作的建议,以帮助您充分利用这种多功能语言并创建漂亮、有效的查询。如果运行时没有数据仓库或用于报告的独立分析数据库,则live production数据库可能是最新、最新数据的唯一来源。查询生产数据库时,优化是关键。低效的查询将耗尽生产数据库的资源,如果查询包含错误,则会导致其他用户的性能降低或服务中断。优化查询以使对数据库性能的影响最小是至关重要的。1首先定义业务需求我们在其他地方介绍了定义BI业务需求的最佳实践。一定要确保在优化SQL查询时应用了这些实践,包括:确定相关利益相关者。确保所有必要的参与方都参与到讨论中来开发您的查询。查询生产数据库时,请确保DBA团队包括在内。集中注意力关于商业成果。给出明确的目的。重复的数据库是不必要的风险。框架关于最佳需求的讨论。通过确定目标受众来定义报告的功能和范围。这将把查询集中在具有正确级别的表上细节。问好问题。遵循5个W:谁?什么?哪里?什么时候?为什么?写下非常具体的要求,并与利益相关者确认。生产数据库的性能非常关键,不能有不明确或不明确的要求。确保需求尽可能具体,并在运行查询之前与所有涉众确认需求。想看更多吗?提交此表格即表示我同意Sisense的隐私政策和服务条款。2选择字段而不是选择*在运行探索性查询时,许多SQL开发人员使用SELECT*(读作"SELECT all")作为速记来查询表中的所有可用数据。但是,如果一个表有许多字段和许多行,则会通过查询大量不必要的数据来增加数据库资源的负担。使用SELECT语句将使数据库只查询满足业务需求所需的数据。下面是一个业务需求为客户请求邮件地址的示例。效率低下:选择*来自客户此查询可能会将存储在customer表中的其他数据(如电话号码、活动日期以及来自sales和customer service的注释)拉入。高效:选择名字、姓氏、地址、城市、州、邮政编码来自客户这个查询更简洁,只提取邮件地址所需的信息。若要保留所有表和字段名的索引,请从系统表(如INFORMATION_SCHEMA或所有\u TAB_列)运行查询(对于MS SQL Server,请阅读此内容)。三。避免选择不同selectdistinct是从查询中删除重复项的一种简便方法。通过将查询中的所有字段分组以创建不同的结果,选择DISTINCT works。然而,要实现这个目标,需要大量的处理能力。此外,数据可能被分组到不准确的程度。若要避免使用selectdistinct,请选择更多字段以创建唯一的结果。效率低下且不准确:选择不同的名字,姓氏,州来自客户此查询不说明处于同一状态的多个人具有相同的名字和姓氏。像大卫·约翰逊这样的人名组合在一起会造成一些不准确的名字。在较大的数据库中,大量的David Smiths和Diane Johnsons将导致此查询运行缓慢。高效准确:选择名字、姓氏、地址、城市、州、邮政编码来自客户通过添加更多字段,不使用selectdistinct返回未重复的记录。数据库不必对任何字段进行分组,并且记录的数量是准确的。请参见Sisense的行动:浏览仪表板4使用内部联接创建联接(而不是WHERE)一些SQL开发人员喜欢使用WHERE子句进行联接,例如:选择客户.CustomerID, 客户名称, 销售.LastSaleDate来自客户、销售哪里客户.CustomerID= 销售.CustomerID这种类型的联接创建笛卡尔联接,也称为笛卡尔积或十字联接。在笛卡尔连接中,将创建所有可能的变量组合。在本例中,如果有1000个客户的总销售额为1000,则查询将首先生成1000000个结果,然后过滤CustomerID正确联接的1000条记录。这是对数据库资源的低效使用,因为数据库所做的工作比需要的多100倍。笛卡尔连接在大型数据库中尤其有问题,因为两个大型表的笛卡尔连接可以创建数十亿或万亿的结果。若要防止创建笛卡尔连接,请改用内部连接:选择客户.CustomerID, 客户名称, 销售.LastSaleDate来自客户内部联合销售打开客户.CustomerID= 销售.CustomerID当CustomerID相等时,数据库将只生成1000条所需的记录。一些DBMS系统能够识别WHERE连接并自动将它们作为内部连接运行。在这些DBMS系统中,WHERE连接和内部连接在性能上没有差别。然而,所有DBMS系统都可以识别内部连接。您的DBA将建议您在您的环境中哪个是最好的。5使用WHERE而不是必须定义过滤器高效查询的目标是只从数据库中提取所需的记录。按照SQL操作顺序,HAVING语句在WHERE语句之后计算。如果目的是基于条件过滤查询,则WHERE语句更有效。例如,假设2016年销售了200台,我们想查询2016年每个客户的销售额。选择客户.CustomerID, 客户名称,计数(销售.SalesID)来自客户内部联合销售打开客户.CustomerID= 销售.CustomerID分组依据客户.CustomerID, 客户名称有销售.LastSaleDate2016年1月1日至2016年12月31日#此查询将从sales表中提取1000条销售记录,然后过滤2016年生成的200条记录,最后统计数据集中的记录。相比之下,WHERE子句限制提取的记录数:选择客户.CustomerID, 客户名称,计数(销售.SalesID)来自客户内部联合销售打开客户.CustomerID= 销售.CustomerID哪里销售.LastSaleDate2016年1月1日至2016年12月31日#分组依据客户.CustomerID, 客户名称此查询将从2016年提取200条记录,然后对数据集中的记录进行计数。HAVING子句中的第一步已经完全取消。只有在对聚合字段进行筛选时才应使用HAVING。在上面的查询中,我们还可以使用HAVING语句筛选销售额大于5的客户。选择客户.CustomerID, 客户名称,计数(销售.SalesID)来自客户内部联合销售打开客户.CustomerID= 销售.CustomerID哪里销售.LastSaleDate2016年1月1日至2016年12月31日#分组依据客户.CustomerID, 客户名称正在计算(销售.SalesID)>5个6仅在短语末尾使用通配符当搜索纯文本数据(如城市或名称)时,通配符可以创建最广泛的搜索。然而,最广泛的搜索也是最低效的搜索。当使用前导通配符时,特别是与结束通配符结合使用时,数据库的任务是在所选字段的任何位置搜索所有记录中的匹配项。考虑使用以下查询来提取以"Char"开头的城市:从客户中选择城市像"%Char%"这样的城市此查询将获取查尔斯顿、夏洛特和查尔顿的预期结果。然而,它也会带来意想不到的结果,比如查尔斯角、蟹园和理查森。更有效的查询是:从客户中选择城市城市喜欢"Char%"此查询将只提取查尔斯顿、夏洛特和查尔顿的预期结果。7使用限制对查询结果进行采样在第一次运行查询之前,请使用LIMIT语句确保结果是理想的和有意义的。(在某些DBMS系统中,TOP与LIMIT互换使用。)LIMIT语句只返回指定的记录数。使用LIMIT语句可以避免使用大型查询来增加生产数据库的负担,只会发现查询需要编辑或优化。在上述2016年销售查询中,我们将检查最多10条记录:选择客户.CustomerID, 客户名称,计数(销售.SalesID)来自客户内部联合销售打开客户.CustomerID= 销售.CustomerID哪里销售.LastSaleDate2016年1月1日至2016年12月31日#分组依据客户.CustomerID, 客户名称限制10我们可以从样本中看出我们是否有可用的数据集。8在非高峰时段运行查询为了将分析查询对生产数据库的影响降到最低,请与DBA讨论将查询安排在非高峰时间运行的问题。查询应该在并发用户数量最少时运行,通常是在午夜(凌晨3点到5点)。以下条件越多,您的查询就越有可能在夜间运行该查询:从大表(>1000000条记录)中选择笛卡尔联接或交叉联接Loping语句选择不同语句所列子查询在长文本或备注字段中通配符搜索多个架构查询自信地询问记住这些技巧(再加上口袋里的一些其他SQL技巧和技巧),您应该能够构建高效、漂亮的查询,这些查询将平稳运行,并返回您的团队需要的改变游戏规则的见解。标记:数据分析|数据建模|数据团队|如何操作| SQL