标签: optimization

优化 MySQL“可选”FULLTEXT 多表搜索

我需要根据客户输入选择带有optional columnsinwhere子句的数据。我的查询是这样的:

SELECT a.id, a.title, b.txt AS b_txt, c.txt AS c_txt 
FROM a 
LEFT JOIN b ON a.b_id=b.id 
LEFT JOIN c ON a.c_id=c.id 
where a.status=1 
AND (0=@bid OR a.b_id=@bid) 
AND (0=@cid OR a.c_id=@cid) 
Run Code Online (Sandbox Code Playgroud)

@bid并且@cid是客户端输入,如果客户端不提供输入,则这些值必须>0使用默认值0

客户端可以不提供任何输入,因此它将选择status=1忽略b_idc_id列的所有数据

客户可以提供@bid或提供@cid两者,查询将相应地选择。

表引擎是 InnoDB,列有索引,外键和关系集。

到目前为止一切都很好。EXPLAIN SQL显示选择是根据提供的索引完成的。

现在我需要在所有 3 个表上添加全文搜索来查询是我遇到问题的地方。如果客户端提供任何关键字进行搜索,文本搜索也是可选的。

全文索引定义为 a.title、b.txt 和 c.txt

我将查询更改为:

SELECT a.id, a.title, b.txt AS b_txt, c.txt AS c_txt …
Run Code Online (Sandbox Code Playgroud)

mysql optimization full-text-search

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

查询优化器会忽略碎片索引吗?

场景:我有一个带有索引的繁重 OLTP 表。我在一天或更短的时间内看到了许多插入、更新和删除以及索引碎片。在索引构建的第一天,优化器使用索引,在第二天或第三天,优化器完全跳过它。这是完全相同的查询。

我脑子里的问题:为什么有些查询计划会跳过索引,因为创建索引是为了帮助优化这些计划?

这篇文章的问题:优化器是否可以跳过一个严重碎片化的索引,例如我们有10亿条记录并建立了一个索引,然后两个小时后,所有十亿条记录被删除,我们有5亿条新记录?

我开始认为向该表添加索引根本无济于事,因为表的性质(数据输入快,数据输出快),但只是想了解为什么有一天,优化器会在其计划中使用该指数,但第二天不会。

index sql-server optimization sql-server-2012

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

先过滤后加入还是先加入后过滤?

考虑 5 个表,每个表都有超过 10 亿条记录。

一个查询需要加入它们。而且我知道他们需要的记录不到 10%。假设它们都有一个日期维度,并且只需要当月的数据。

什么应该更快:

1)使用简单的SELECT:连接所有表,然后过滤(WHERE)当月每个表的维度。

2)创建5个临时表,过滤每个源表为当月记录,这里我们也可以趁机只选择需要的列,然后加入这些临时表。

额外的可能性:

3) 维护二级表,只有当前月/年的数据。这些表由提供主要表的相同 ETL 维护。

sql-server optimization sql-server-2012

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

使用左连接的慢 Postgresql 查询

我有一个关于 Postgres 的查询,我还添加了适当的索引。这里有什么遗漏吗?

SELECT orders.*, demo.name as d_name
FROM orders
LEFT JOIN users as demo ON demo.id = orders.dr_id
WHERE orders.customer_id = 526373 
AND (orders.log_id = 300)
AND (orders.order_count_id IN (10, 1, 8, 2, 3))
LIMIT 5
Run Code Online (Sandbox Code Playgroud)

查询计划来自EXPLAIN ANALYZE

QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit  (cost=2490.30..2867.15 rows=3 width=182) (actual time=33.292..34.115 rows=3 loops=1)
->  Nested Loop Left Join  (cost=2490.30..2867.15 rows=3 width=182) (actual time=33.291..34.113 rows=3 loops=1)
     ->  Bitmap Heap Scan on orders  (cost=2490.02..2842.22 rows=3 width=172) (actual time=33.279..34.097 rows=3 loops=1)
           Recheck Cond: ((customer_id …
Run Code Online (Sandbox Code Playgroud)

postgresql performance optimization postgresql-performance

6
推荐指数
0
解决办法
2636
查看次数

优化“WHERE x BETWEEN a AND b GROUP BY y”查询

CREATE TABLE test_table
(
  id uuid NOT NULL,
  "RefId" uuid NOT NULL,
  "timestampCol" timestamp without time zone NOT NULL,
  "bigint1" bigint NOT NULL,
  "bigint2" bigint NOT NULL,
  "int1" integer NOT NULL,
  "int2" integer NOT NULL,
  "bigint3" bigint NOT NULL,
  "bigint4" bigint NOT NULL,
  "bigint5" bigint NOT NULL,
  "hugeText" text NOT NULL,
  "bigint6" bigint NOT NULL,
  "bigint7" bigint NOT NULL,
  "bigint8" bigint NOT NULL,
  "denormalizedData" jsonb NOT NULL,
  "textCol" text NOT NULL,
  "smallText" text NOT NULL,
  "createdAt" timestamp with time zone …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index optimization postgresql-9.4

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

哪个更快?游标循环中的多个更新查询,还是单个查询?

哪个更快?游标循环中的多个更新查询,还是单个查询?例如,在这种情况下,哪个更快?此查询在触发器中。

  1. 循环中的多个查询

    DECLARE done INT DEFAULT FALSE;
    DECLARE record_id INT;
    DECLARE cur CURSOR FOR SELECT id FROM table1 WHERE column = 0;
    
    OPEN cur;
    
      users_loop: LOOP
    
         FETCH cur INTO id;
    
         IF done THEN
             LEAVE users_loop;
         END IF;
    
         UPDATE table2 SET column = 0 WHERE id = id;
    
      END LOOP;
    
    CLOSE cur;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 单一查询

     CREATE TEMPORARY TABLE tmp_table (id int(10));
    
     INSERT INTO tmp_table SELECT id FROM table1 WHERE column = 0;
    
     UPDATE table2 SET column = 0 WHERE id IN(SELECT id FROM …
    Run Code Online (Sandbox Code Playgroud)

mysql performance optimization update query-performance

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

为什么`SELECT count(*)` 返回1?

一些 RDBMS 似乎允许没有 FROM 子句的查询,例如:

postgres=# SELECT 'foo' bar;
???????
? bar ?
???????
? foo ?
???????
Run Code Online (Sandbox Code Playgroud)

但是对于那些允许它的人,为什么SELECT count(*)不返回 0?

postgres=# SELECT count(*);
?????????
? count ?
?????????
?     1 ?
?????????
Run Code Online (Sandbox Code Playgroud)

performance optimization query-performance

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

SQL Server 计划指南

我有一个需要计划指南的查询,但我很难设置它。

从过程缓存中查询以下...

(@state nvarchar(14),
 @jobName nvarchar(18),
 @jobGroup nvarchar(28),
 @oldState nvarchar(6)) 

 UPDATE JOB_TRIGGERS 
 SET TRIGGER_STATE = @state 
 WHERE JOB_NAME = @jobName 
 AND JOB_GROUP = @jobGroup 
 AND TRIGGER_STATE = @oldState
Run Code Online (Sandbox Code Playgroud)

SQL Server 选择执行聚集索引扫描与非聚集索引查找。我在这个更新语句和表上的某个 select 语句中遇到了零星的死锁问题。我理解为什么 SQL 选择对表进行聚集索引扫描....Rows < 100 和 PageCount < 25。

该表有大量活动,由于它是第 3 方产品,我无法修改查询并提供索引提示。使用非聚集索引的查询成本更高,但我相信它会基于测试提高并发性....

我需要告诉它使用下面的非聚集索引

WITH (INDEX (ix_jobname_jobgroup_triggerstate))
Run Code Online (Sandbox Code Playgroud)

帮助设置这个将不胜感激..

sql-server optimization execution-plan plan-guides

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

如何生成分区函数和分区模式的创建脚本?

我有一个脚本来生成创建表脚本。你可以在我对这个问题的回答中看到它

但是,现在我需要编写我的分区函数分区方案

关于这个问题here,看到答案有关于如何向表添加分区以及如何从表中删除分区的示例,我想看看任何阶段的脚本。

我找到了这个链接:如何找到应用于表的分区函数文本

如何生成用于创建分区函数和分区模式的脚本?

我正在编写一个脚本来生成create partition function 如下所示的 ,但它仅适用于我自己的PF_year分区函数,因为was很难克服sys.partition_range_values具有sql_variant数据类型作为值的事实。

当我使用案例时,出现以下错误:

消息 206,级别 16,状态 2,第 35 行

操作数类型冲突:int 与日期不兼容

然后在他的精彩回答Dan Guzman 中,向我们展示了SQL_VARIANT_PROPERTY一些我不知道的奇妙事物,现在我是一名新的 DBA 和新人。

   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    SELECT
    RADHE = 'CREATE PARTITION FUNCTION' + space(1) + quotename(spf.name) + 
'(' +  
    COALESCE(baset.name,'data type not found') +   ')' + CHAR(13) + 
    'AS RANGE ' + CASE WHEN CAST(spf.boundary_value_on_right AS …
Run Code Online (Sandbox Code Playgroud)

database-design sql-server optimization partitioning sql-server-2014

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

是否有更优化的方法来创建此视图或存储过程?目前使用交叉应用,但速度很慢

我用一些测试数据更新了这篇文章。

我正在为我的电影数据库创建一个报告,我希望最终用户能够选择某种类型的电影。然而,有些电影有多种类型,我已经规范化了数据库,以便具有多个类型的电影订单项变成多个订单项,每个订单项都指向相应的类型/类型 ID。(对于董事也做了类似的事情)。

标准化前

电影 类型
弗兰肯斯坦的新娘 恐怖、剧情

标准化后

电影 类型
弗兰肯斯坦的新娘 恐怖
弗兰肯斯坦的新娘 戏剧

我遇到的问题是,为了这份报告,我希望做到这样,如果电影有多种类型,那么它们就不会在报告中重复。相反,电影标题成为一个行项目,并且流派字段被连接起来以显示一行内的所有流派(类似于标准化之前的视图)。我最终要做的是创建一个视图,在其中按照与电影 ID 匹配的类型交叉应用电影选择的输出。我觉得我有点过于复杂了,而且我的商店程序运行得相当慢,因为我还有其他几个字段允许用户进行过滤。

下面是交叉应用视图。

ALTER VIEW [dbo].[vwMoviesJoinedGenres] AS

WITH genreMovies_CTE AS (
SELECT M.MovieID
    , M.MovieTitle
    , G.GenreName
    , G.GenreID
    , M.TitleTypeID
    , TT.TitleType
    , M.MediaID
    , M.IMDBLink
    , M.IMDBRating
    , M.ReleaseDate
    , M.Runtime
    , M.ImageURL
    , M.MovieYear
FROM [dbo].[Movies] AS M
INNER JOIN GenresMovies AS GM
    ON GM.MovieID = M.MovieID
INNER JOIN Genres AS G
    ON G.GenreID = GM.GenreID
INNER JOIN TitleType AS TT …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures optimization t-sql cross-apply

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