标签: query

MySQL:加入未使用的表时的索引(性能优化问题)

我需要优化以下查询:

SELECT /* [things omitted] */ articles.blogpost_id, articles.id AS articleid
FROM blogposts
JOIN articles ON articles.blogpost_id = blogposts.id
WHERE blogposts.deleted = 0
AND blogposts.title LIKE '%{de}%'
AND blogposts.visible = 1
AND blogposts.date_published <= NOW()
ORDER BY blogposts.date_created DESC
LIMIT 0 , 50
Run Code Online (Sandbox Code Playgroud)

EXPLAIN SELECT 给我以下结果:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE articles ALL blogpost_id NULL NULL NULL 6915 Using temporary; Using filesort
1 SIMPLE blogposts eq_ref PRIMARY PRIMARY 4 articles.blogpost_id 1 Using where
Run Code Online (Sandbox Code Playgroud)

为什么它先是文章,然后是博客文章?是因为博客文章有更多条目吗?以及如何改进查询以便文章帖子可以使用索引? …

mysql performance index query optimization

6
推荐指数
1
解决办法
6626
查看次数

在我的服务器上找到最大的数据库

我在同一个 MySQL 服务器上运行了数百个数据库。如何获得按数据库大小排序的列表?

mysql query database-size

6
推荐指数
2
解决办法
5031
查看次数

优化比较查询

假设我有两个表,A并且B我知道 size(A) = size(B)。我想确认两个表中的数据是在三个给出列相同,假设他们是XYZ(有在表上没有钥匙)。

为此,我会这样做:

 SELECT COUNT(*) FROM
     (
        Select
            X, Y, Z
        From
            A
     )
     MINUS
     (
        Select
            X, Y, Z
        From
            B
     )
Run Code Online (Sandbox Code Playgroud)

现在,我真的不需要知道count(*)值,只要数据之间存在一个不匹配,即值元组存在于A但不存在于中B,我就知道这些表不相同。有没有办法在 SQL 中说这个?即,只要 MINUS 遇到一个不匹配的值,就从查询中返回一个值来表示?

谢谢!

performance oracle query optimization minus query-performance

6
推荐指数
1
解决办法
1899
查看次数

如何在获取记录数和最小值/最大值的 MySQL 查询中使用 GROUP_CONCAT DISTINCT 值?

我正在运行 MySQL 5.0.88 (Coldfusion8)

我有一个产品搜索,我正在查询number-of-results以及min/max prices/rebates整个产品表。我还想包含一个 的字符串distinct sizes/colors,这样我就可以在显示结果的同时更新我的​​搜索条件。

但是我的 GROUP_CONCAT 没有返回所有预期值。我不知道我错过了什么,但它似乎只返回不同的min/max尺寸/颜色,而不是返回all整个记录集的不同尺寸/颜色。

我的产品表:

 CREATE TABLE dummy (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`iln` VARCHAR(13) NULL DEFAULT NULL,
`ean` VARCHAR(35) NULL DEFAULT NULL,
`artikelnummer` VARCHAR(35) NULL DEFAULT NULL,
`groesse` VARCHAR(10) NULL DEFAULT NULL,
`farbe` VARCHAR(35) NULL DEFAULT NULL,
`farbnummer` VARCHAR(10) NULL DEFAULT NULL,
`preis_ek` DECIMAL(12,2) NULL DEFAULT NULL,
`preis_vk` DECIMAL(12,2) NULL DEFAULT NULL,
`preis_aktuell` DECIMAL(12,2) NULL DEFAULT NULL,
`firma` VARCHAR(35) NULL DEFAULT …
Run Code Online (Sandbox Code Playgroud)

mysql query subquery select

6
推荐指数
1
解决办法
3万
查看次数

postgres 简单数字到字符串映射

Enum在编程语言级别有一个 an ,它作为一个简单的整数存储在表上。思考:

APPLE = 1
GOOGLE = 2
MSFT = 3
AMAZON = 4
 ... (100s more)
Run Code Online (Sandbox Code Playgroud)

我只想查询表而不是数字返回相应的字符串值。在不使用case语句或临时表的情况下,是否有更简单的方法来执行此操作:

SELECT
  CASE WHEN type = 1 THEN "APPLE"
  CASE WHEN type = 2 THEN "GOOGLE"
  CASE WHEN type = 3 THEN "MSFT"
  CASE WHEN type = 4 THEN "AMAZON"
  ...
  ELSE "UNKNOWN"
FROM t
Run Code Online (Sandbox Code Playgroud)

基本上它只是在字典中进行键查找。

postgresql query case

6
推荐指数
3
解决办法
3006
查看次数

使用 FOR SYSTEM_TIME 子句时历史表的查询/表提示

可能是一个非常简单的问题,但是FOR SYSTEM_TIME在查询时态表时使用语句时,有没有办法为历史表指定查询/表提示?我怀疑不是,但我想在放弃这个之前仔细检查一下。

这是一个dbfiddle,它显示了我所知道的为查询指定提示的不同方式的基本细分,我能弄清楚如何传递与历史表交互的查询和/或表提示的唯一方法是转换查询到UNION ALLlive 和 history 表之间,而不是使用FOR SYSTEM_TIME子句。

在使用该FOR SYSTEM_TIME子句时尝试指定历史表提示时,出现以下错误:

Msg 308 Level 16 State 1 Line X
Index '<<HISTORY TABLE INDEX NAME>>' on table '<<LIVE TABLE NAME>>' (specified in the FROM clause) does not exist.
Run Code Online (Sandbox Code Playgroud)

在使用该FOR SYSTEM_TIME子句时尝试指定指向历史记录表的查询提示时,出现以下错误:

Msg 8723 Level 16 State 1 Line X
Cannot execute query. Object '<<HISTORY TABLE>>' is specified in the TABLE HINT clause, but is not used in the query or does …
Run Code Online (Sandbox Code Playgroud)

sql-server query hints temporal-tables

6
推荐指数
1
解决办法
142
查看次数

多个join的SQL查询执行计划的逻辑顺序

我知道执行 SQL 查询的逻辑顺序是:

FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Run Code Online (Sandbox Code Playgroud)

如果查询中有多个连接会发生什么,例如,如果我们有这样的查询:

SELECT *
FROM user_branch T1
INNER JOIN dimcustomer2 T2
   ON T1.BRANCH_CODE = T2.BRANCH_CODE
INNER JOIN customer_guarantee T3
   ON T3.CUSTOMER_NUM = T2.CUSTOMER_NUM
Run Code Online (Sandbox Code Playgroud)

一些示例数据:

customer_guarantee:    CUSTOMER_NUM      BRANCH_CODE
                      -------------------------------
                           A                X
                           B                X
                           C                Y
                           D                Z



 user_branch:           USER_ID          BRANCH_CODE    
                      --------------------------------
                           U1               Y



 dimcustomer2:         CUSTOMER_NUM      BRANCH_CODE      
                      --------------------------------
                           A                Y
                           B                Y
                           C                Y
                           D                Z
Run Code Online (Sandbox Code Playgroud)

这将如何执行?哪个连接会先执行?如果查询中有不同类型的连接怎么办?在这种情况下执行连接的顺序是什么?提前致谢。

query t-sql sql-server-2016

6
推荐指数
2
解决办法
3983
查看次数

为什么 SQL Server 将它的 (JSON) 响应拆分为多行?

我正在尝试构建一个查询,该查询会生成一个由 SQL Server 生成的 JSON 对象。我发现我可以使用子查询用包含问题列表的 JSON 字符串填充字段(在本例中为问题字段)。

下面是查询:

SELECT
    quizzes.id AS 'id',
    quizzes.name AS 'name',
    quizzes.description AS 'description',
    quizzes.instructions AS 'instructions',
    author.id AS 'author.id',
    author.midas AS 'author.midas',
    author.first_name AS 'author.first_name',
    author.last_name AS 'author.last_name',
    author.email AS 'author.email',
    author.tel AS 'author.tel',
    author.department_name AS 'author.department_name',
    author.created_at AS 'author.created_at',
    author.last_updated AS 'author.last_updated',
    course.id AS 'course.id',
    course.name AS 'course.name',
    course.description AS 'course.description',
    course.crn AS 'course.crn',
    instructor.id AS 'course.instructor.id',
    instructor.midas AS 'course.instructor.midas',
    instructor.first_name AS 'course.instructor.first_name',
    instructor.last_name AS 'course.instructor.last_name',
    instructor.email AS 'course.instructor.email',
    instructor.tel AS 'course.instructor.tel',
    instructor.department_name …
Run Code Online (Sandbox Code Playgroud)

sql-server query subquery json

6
推荐指数
1
解决办法
729
查看次数

WHERE 子句中未使用的列

我在我们的代码库中找到了这个查询:

DELETE FROM "Foo"
WHERE ("Foo"."Id", "Foo"."CreatedAt")
IN (SELECT "f"."Id", "f"."CreatedAt"
    FROM "Foo" AS "f"
    WHERE "f"."CreatedAt" <= CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

它删除当前时间之前创建的记录。

这给出了相同的结果:

DELETE FROM "Foo"
WHERE "Foo"."CreatedAt"
IN (SELECT "f"."CreatedAt"
    FROM "Foo" AS "f"
    WHERE "f"."CreatedAt" <= CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

我不知道为什么Foo.Id将 包含在WHERE子句中 - 也许是各种重构留下的垃圾(例如,它可能已用于批量删除ORDER BY "f"."Id" LIMIT 1000)。但因为这是一场PK,我不愿意删除它,因为也许它的存在是有原因的。

是否有理论/性能原因将其放在那里,或者这两个查询是否等效?

(这同时针对 postgres 和 sqlite。)

postgresql sqlite query subquery relational-theory

6
推荐指数
1
解决办法
773
查看次数

查询sys.dm_db_log_info()函数,同时减少到最大值

我目前正在查询sys.dm_db_log_info()DMV 以从数据库检索 VLF,以确定何时可以收缩、重组和减少 TLOG 文件中的碎片量(10 MB VLF)。

原因是,如果事务位于 TLOG 文件末尾并导致活动 VLF,则无法收缩 TLOG 文件。类似的情况,如果活动事务驻留在 TLOG 文件的中间,那么您就无法缩小到超过该 VLF。

当前声明

我目前有这个语句来检索MAX(vlf_begin_offset)记录、MIN(vlf_begin_offset)记录和任何具有 active 的记录vlf_active = 1

SELECT ddli.vlf_begin_offset,
       ddli.vlf_sequence_number,
       ddli.vlf_active,
       ddli.vlf_status,
       ddli.vlf_first_lsn
FROM   sys.dm_db_log_info(DB_ID()) AS ddli
WHERE  ddli.vlf_begin_offset = (
           SELECT MIN(ddli2.vlf_begin_offset)
           FROM   sys.dm_db_log_info(DB_ID()) AS ddli2
       )
       OR  ddli.vlf_active = 1
       OR  ddli.vlf_begin_offset = (
               SELECT MAX(ddli3.vlf_begin_offset)
               FROM   sys.dm_db_log_info(DB_ID()) AS ddli3
           )
ORDER BY
       ddli.vlf_begin_offset ASC
Run Code Online (Sandbox Code Playgroud)

当所有记录都返回时,结果集如下所示:

+------------------+---------------------+------------+------------+------------------------+
| vlf_begin_offset | vlf_sequence_number | vlf_active | vlf_status …
Run Code Online (Sandbox Code Playgroud)

sql-server query dmv sql-server-2016

6
推荐指数
2
解决办法
323
查看次数