AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-26002

Jacobm001's questions

Martin Hope
Jacobm001
Asked: 2018-04-24 10:11:51 +0800 CST

将查询解析为“object name.field”列表

  • 0

我所在的团队有一个 SSRS 设置,大约有 1300 个(并且还在不断增加)罐装报告。可以想象,当对表进行重大更改时,这会带来问题。查找所有可能触及表/字段的报告充其量是容易出错的。

我正在尝试以编程方式构建依赖模型。获取视图/表的模式Owner -> Object -> Fields以及视图/表的关联方式非常简单。

我正在努力解决的问题是如何从给定查询中获取已解析的字段列表。我可以从 RDL 文件中提取查询,但解释这些文件远非如此。查询可以包含类似字段和表的别名,此外还有诸如select *. 我试图避免正则表达式黑客,我真的不想写一个 SQL 解释器......

我最初的想法是遍历 RDL 文件并解析解释计划输出。虽然在技术上可行,但这并没有给我已解决字段的完整列表。

有什么方法可以让数据库分析给定的查询并返回列表Object_Name.Field_Name?我不介意在必要时进行一些文本处理以提取结果。

oracle oracle-12c
  • 1 个回答
  • 26 Views
Martin Hope
Jacobm001
Asked: 2016-05-25 09:08:38 +0800 CST

SQL Tuning Advisor 的安全和性能影响

  • 2

我在一个使用 Oracle (11g) 数据库的相对较小的开发团队工作。最近有人要求为所有开发人员分配Advisor角色,以便我们可以在开发复杂查询时利用SQL Tuning Advisor 。有些人担心这可能会对性能和/或安全产生重大影响,但我无法找到这些影响的具体答案。

如果这个角色被赋予我团队的各个成员,我们应该注意的主要陷阱是什么?我也包含了 Oracle 12c 的标签,因为我们将在不久的将来升级到它。如果两者之间存在显着差异,如果至少指出,我将不胜感激。

performance security
  • 1 个回答
  • 194 Views
Martin Hope
Jacobm001
Asked: 2015-07-16 10:25:04 +0800 CST

Oracle 自动跟踪与解释

  • 3

我的团队使用 Oracle 11 和 SQL Developer。我最近一直在严重依赖解释计划来尝试确定解决各种问题的最有效方法。最近,一位同事指出,解释计划并不总是准确地反映数据库中实际发生的情况,并且自动跟踪是一个更好的指示,因为查询实际上是针对数据运行的。

测试一个查询,我得到了以下结果

_________________________________
|      Method        |   Cost   | 
|--------------------|----------|
| Query A Explain    |  306,188 |
| Query A Autotrace  |  399,131 |
| Query B Explain    |   99,226 |
| Query B Autotrace  |  137,661 |
|____________________|__________|

使用自动跟踪时,查询 A 的成本增加了 30%,查询 B 的成本增加了近 40%。显然,我应该在这两种情况下都使用查询 b,但我不明白是什么导致它们不同。

oracle oracle-sql-developer
  • 2 个回答
  • 1679 Views
Martin Hope
Jacobm001
Asked: 2014-09-19 15:01:53 +0800 CST

替换一行的结果

  • 0

我正在使用 Microsoft Reporting Services 2008。在我们的数据库中,我们有一小群机密学生需要考虑几个查询。如果他们是机密学生,则数据库基本上不需要返回任何内容。目前,我们按照以下方式做一些事情:

select
  case 
    when CONFIDENTIALITY_IND = 'Y' or :EmployeeClass = 'XA'
      then 'CONFIDENTIAL'
    else db.table.name
  end as name
from
  db.student

对于这么小的查询来说,这不是什么大问题,但它们中的大多数都会返回许多字段(通常超过 20 个),而且出于显而易见的原因,我不喜欢这么多的 case 语句。由于 Reporting Services 的工作方式,我也无法进行一般替换,必须在每个字段上进行。

有没有更有效的方法,我可以在单个案例语句中用“机密”替换行中的每个值,或者至少是更优雅的方法?

编辑: 澄清一下,选择中不只有这个字段。我只为这个例子写了一个,但在生产中,一些报告正在考虑显示大量的列。我试图避免对可能返回相当大的数据集的报告的每一列进行两次比较。

oracle oracle-11g-r2
  • 3 个回答
  • 310 Views
Martin Hope
Jacobm001
Asked: 2014-07-15 15:53:22 +0800 CST

聚集在一个重复的组上

  • 1

在当前报告中,我正在尝试跟踪人员从部门 n 迁移到 n+1 或 n+k 的情况。

我的数据每学期分成一行(大学数据)。一个例子:

dept |  term
------------
   a | 20120
   a | 20121
   a | 20122
   b | 20123 -- <- person moved to new department
   b | 20130
   c | 20131 -- <- person moved to another new department
   a | 20132 -- <- person went back to a department they've already been in

使用查询

select 
  dept, 
  FIRST_VALUE(term) OVER (PARTITION BY dept ORDER BY term) as 
from
  table
order by term;

给我:

dept |  term
------------
   a | 20120
   a | 20120
   a | 20120
   b | 20123
   b | 20123
   c | 20131 
   a | 20120 -- <- notice this is the same as the above set of a's

第一组中重复的 a 和第二组中的 b 是由于数据中的其他行造成的(我对此没意见,但删除它会是一个奖励)。我的主要问题是我需要将最后一个 a 视为不同的组;所以基本上每次出现集群时都会显示第一个。

oracle aggregate
  • 2 个回答
  • 68 Views
Martin Hope
Jacobm001
Asked: 2013-09-07 14:31:52 +0800 CST

计算一组出现的次数

  • 0

我试图找出在我的数据库中特定分组发生了多少次。我有两个相关的表。

mysql> describe logins;
+-------------+-------------+------+-----+---------------------+----------------+
| Field       | Type        | Null | Key | Default             | Extra          |
+-------------+-------------+------+-----+---------------------+----------------+
| id          | int(11)     | NO   | PRI | NULL                | auto_increment |
| username    | varchar(10) | NO   | MUL |                     |                |
| login_time  | datetime    | NO   | MUL | 0000-00-00 00:00:00 |                |
| logout_time | datetime    | YES  |     | NULL                |                |
| duration    | int(11)     | YES  |     | NULL                |                |
| location    | varchar(15) | YES  | MUL | NULL                |                |
+-------------+-------------+------+-----+---------------------+----------------+

和

mysql> describe login_apps;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int(11)     | NO   | PRI | NULL    | auto_increment |
| sid         | int(11)     | YES  |     | NULL    |                |
| programName | varchar(63) | YES  |     | NULL    |                |
| duration    | int(11)     | YES  |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+

假设我想知道给定会话中使用了哪些应用程序。我可以用:

mysql> select distinct programName from login_apps where sid="35" and programName!="NULL";
+--------------------+
| programName        |
+--------------------+
| Acrobat  Distiller |
| FireFox            |
| Minitab 16         |
+--------------------+

获取不同的程序名称,但我感兴趣的是特定应用程序组在给定会话中的使用频率。因此,从本质上讲,这三个应用程序多久被组合在一起。有没有一种方法可以让我以以下形式获得结果

application x-y-z, 12
application x-z, 9
application y-z, 7
mysql mysql-5.1
  • 2 个回答
  • 53 Views
Martin Hope
Jacobm001
Asked: 2013-09-04 13:42:28 +0800 CST

条件计数

  • 1

我正在分析一所大学的登录记录数据库,并且我正在尝试编写一个查询,让我了解有多少用户正在使用实验室进行短期爆发,而不是长期停留。

我有下面的查询,它告诉我每个用户使用实验室的时间少于或等于 10 分钟的次数。我想要的是一个结果,告诉我这个和他们的登录总数。

select username, count(*) as "<= 10 min"
    from logins
    where duration<="600"
    group by username
    order by username asc
    limit 10;

示例所需输出:

+----------+----------+----------+
| username | <=10 Min |  total   |
+----------+----------+----------+
| user1    |        4 |        7 |
| user2    |       11 |       22 |
| user3    |        1 |        3 |
| user4    |        4 |        8 |
+----------+----------+----------+
mysql-5.1
  • 1 个回答
  • 223 Views
Martin Hope
Jacobm001
Asked: 2013-08-22 10:35:56 +0800 CST

MySQL函数错误

  • 1

在一个继承的数据库中,我有两个当前感兴趣的表,records和logins. login告诉我用户的位置以及他登录的地点和时间(包括进出时间)。

有趣的是登录会话和运行的应用程序之间没有关联标记。为了解决这个问题,我正在创建一个新表login_apps并尝试使用一个函数来合并这两个表。

到目前为止我有:

drop function if exists ltop;
delimiter $$

create function ltop(id int, u varchar(10), s datetime, e datetime)
    returns text
    language sql
begin
    declare pid varchar(40);
    declare pname varchar(63);
    declare my_return varchar(100);
    declare cur1 cursor for (select usageProgramID 
                                from records 
                                where usageUser=u
                                    and usageWhen>=s 
                                    and usageWhen<=e
                                    and usageProgramID!="");
    open cur1;
    read_loop: loop
        fetch cur1 into pid;
        set pname = (select programName from Programs where programID=pid);
        insert into login_apps(`sid`, `programName`) values(id, pname);
    end loop read_loop;

    close cur1;

    return "finished";
end;$$
delimiter ;

它毫无问题地进入系统,并且插件在测试中按预期工作。我提出的问题是当它运行时:

select ltop("265548", "user", "2013-02-21 13:54:27", "2013-02-21 14:32:18");

我收到错误:

ERROR 1329 (02000): No data - zero rows fetched, selected, or processed

返回的数据不应该是“完成”的吗?

其次,我不太确定在logins任何指针的每个值上运行这条路线的最佳方式是什么?

mysql mysql-5.1
  • 1 个回答
  • 339 Views
Martin Hope
Jacobm001
Asked: 2013-08-14 09:15:42 +0800 CST

附加值的查询优化

  • 0

我有一个表现有点奇怪的查询。在我的数据库中,我有一个名为“记录”的表。它告诉我有关用户在我公司的机器上运行了哪些应用程序的大量信息。我正在尝试汇总一些统计信息,但在查询时遇到了一些奇怪的问题。

此查询运行大约 6.5 分钟(“记录”中约有 3000 万个条目)。如果未指定 divisionName,我预计它会花费更长的时间,但它似乎花费了不合理的时间来完成(一夜之间并且仍在发出声音)。

select divisionName, programName, count(usageID) 
    from records R 
    right join Programs P 
        on P.programID=R.usageProgramID 
    right join locate L 
        on L.computerID=R.usageComputerID 
    where divisionName="umbrella"
    group by programName
    order by programName asc
    INTO OUTFILE '/tmp/lab_prog_umbrella.csv'
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n';

是否有替代结构来加速查询?我在 locate 中有一个关于 (computerID,divisionName) 的索引,在 Programs 中有一个关于 (programID,programName) 的索引,以及记录中的大量索引。

注意:Programs 包含 4 个字段,locate 包含 2 个。我不认为连接特别大。

编辑:

解释:

+----+-------------+-------+------+-----------------+-----------+---------+----------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys   | key       | key_len | ref                  | rows | Extra                                        |
+----+-------------+-------+------+-----------------+-----------+---------+----------------------+------+----------------------------------------------+
|  1 | SIMPLE      | L     | ref  | loc             | loc       | 27      | const                | 1195 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | R     | ref  | uprog,computers | computers | 34      | scf.L.computerID     | 1627 |                                              |
|  1 | SIMPLE      | P     | ref  | pid_name        | pid_name  | 43      | scf.R.usageProgramID |    1 | Using index                                  |
+----+-------------+-------+------+-----------------+-----------+---------+----------------------+------+----------------------------------------------+

记录说明:

+-----------------+-------------+------+-----+---------------------+-------+
| Field           | Type        | Null | Key | Default             | Extra |
+-----------------+-------------+------+-----+---------------------+-------+
| usageID         | varchar(24) | NO   | PRI | NULL                |       |
| usageWhen       | datetime    | NO   | PRI | 0000-00-00 00:00:00 |       |
| usageEnum       | int(11)     | YES  |     | NULL                |       |
| usageServerID   | int(11)     | YES  |     | NULL                |       |
| usageServerType | int(11)     | YES  |     | NULL                |       |
| usageProgramID  | varchar(40) | NO   | PRI |                     |       |
| usageLicenseID  | varchar(18) | YES  |     | NULL                |       |
| usageComputerID | varchar(31) | YES  | MUL | NULL                |       |
| usageExpansion  | varchar(0)  | YES  |     | NULL                |       |
| usageUser       | varchar(31) | YES  | MUL | NULL                |       |
| usageAddress    | varchar(28) | YES  |     | NULL                |       |
| usageGroup      | varchar(16) | YES  |     | NULL                |       |
| usageEvent      | int(11)     | YES  |     | NULL                |       |
| usageReason     | int(11)     | YES  |     | NULL                |       |
| usageTime       | int(11)     | YES  |     | NULL                |       |
| usageOtherTime  | varchar(25) | YES  |     | NULL                |       |
| usageGMTOffset  | int(11)     | YES  |     | NULL                |       |
| usageCount      | int(11)     | YES  |     | NULL                |       |
+-----------------+-------------+------+-----+---------------------+-------+

定位说明:

+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| computerID   | varchar(31) | YES  | MUL | NULL    |       |
| divisionName | varchar(24) | YES  | MUL | NULL    |       |
+--------------+-------------+------+-----+---------+-------+

程序说明:

+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| programID      | varchar(40) | YES  | MUL | NULL    |       |
| programName    | varchar(63) | YES  | MUL | NULL    |       |
| programVersion | varchar(31) | YES  |     | NULL    |       |
| category       | varchar(30) | YES  |     | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
mysql performance
  • 1 个回答
  • 53 Views
Martin Hope
Jacobm001
Asked: 2013-08-10 09:54:12 +0800 CST

更新函数中的子查询

  • 1

我继承了一组非常糟糕的数据,我的部分工作是检查并将其清理成实际可用的数据。目前,我正在尝试根据条目名称更新表中的列。

表:(类别目前几乎所有内容都为空)

+-----------------------------------------------------+
| programID | programName | programVersion | category |
+-----------------------------------------------------+

我的查询:

update Programs 
    set category="Adobe Suites" 
    where programName 
        in (
            select distinct programName 
                from Programs
                where programName regexp '^adobe.*cs[1-9]$'
            );

问题是,无论我尝试什么,我都会不断收到错误消息:

ERROR 1093 (HY000):您不能在 FROM 子句中指定要更新的目标表“Programs”

我不确定还有什么其他方法可以做到这一点。关于如何用其他内容替换 from 语句的任何想法?

mysql
  • 2 个回答
  • 305 Views
Martin Hope
Jacobm001
Asked: 2013-08-09 12:33:19 +0800 CST

使用通配符压缩查询结果

  • 1

我有以下查询:

select programVersion, count(programVersion) 
     from records R 
     inner join Programs P 
         on P.programID=R.usageProgramID 
     where programName="word" 
     group by programVersion;

结果:

+----------------+-----------------------+
| programVersion | count(programVersion) |
+----------------+-----------------------+
| 12.0.0         |                     1 |
| 12.2.0         |                 32190 |
| 12.2.3         |                    20 |
| 12.2.6         |                  3990 |
| 12.2.8         |                 13128 |
| 12.3.1         |                   114 |
| 12.3.2         |                     4 |
| 12.3.4         |                    20 |
| 14.0.0         |                    57 |
| 14.1.0         |                 86587 |
| 14.1.3         |                    44 |
| 14.1.4         |                   728 |
| 14.2.0         |                    42 |
| 14.2.2         |                   130 |
| 14.2.3         |                 88219 |
| 14.2.5         |                    66 |
| 14.3.0         |                   126 |
| 14.3.1         |                    36 |
| 14.3.2         |                    74 |
+----------------+-----------------------+

为此,我并不真正关心次要版本的增量。我真正感兴趣的是主要增量的差异。有没有办法可以将第一期之后的结果合并起来?

示例输出

+----------------+-----------------------+
| programVersion | count(programVersion) |
+----------------+-----------------------+
| 12             |         total of 12's |
| 14             |         total of 14's |
+----------------+-----------------------+
mysql performance
  • 1 个回答
  • 73 Views
Martin Hope
Jacobm001
Asked: 2013-08-07 08:24:30 +0800 CST

MySQL 分组错误

  • 1

我正在尝试对表运行查询,以查看在给定时间点系统中有多少唯一用户有使用记录。我一直在处理以下查询,但我还没有看到正确的结果。

SELECT count(distinct usageUser), divisionName
FROM records R 
INNER JOIN locate L  
    ON L.computerID=R.usageComputerID
WHERE R.usageWhen LIKE "2012-07-08T12:%"
GROUP BY L.divisionName;

目前,对于连接表中的每个分区,查询返回 18。没有GROUP BY条款我得到相同数量的记录。

编辑:我根据评论的建议再次运行查询。通过删除 group by 和 count 子句,我得到了这个(太大而无法发布)。此数据的格式非常糟糕,不幸的是它是继承的并且相当大。

这些用户不可能像列出的那样使用每个实验室。

这最初发布到服务器故障,并迁移到 StackOverFlow。然后我被指到这里说这实际上可能是最合适的地方。

mysql
  • 1 个回答
  • 30 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve