标签: optimization

用于识别查询优化和缺失索引的 SQL 服务器工具

我有一个关于 SQL Server 的广泛问题,这是在测验中给我的,但我不确定答案是什么,因为我在家无法访问 SQL Server。我的问题是如何利用 SQL Server 工具来识别查询优化、缺失索引等?

有人可以给我一个非常简短的答案吗?

谢谢

index sql-server optimization

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

TOPN 如何通过 group by 影响查询?

我有一个如下所示的查询:

Select t1.field1, t2.field2, sum(t1.field3)
From  t1 inner join t2 on t1.id = t2.id
Group by t1.field1, t2.field2
Run Code Online (Sandbox Code Playgroud)

它被简化了,通常上面有更多的连接和属性。我现在的问题是,将 TOP N 子句添加到查询而不是在 N 行返回到我的 C# 代码后停止查询的影响有多大。

我知道,添加该条款对服务器更好,但我对粗略估计该条款有多大影响很感兴趣。我的猜测是,因为我有一个聚合,服务器无论如何都必须处理所有行,因此影响不是那么大。

编辑:C# Snippet 我们如何停止执行

var cmd = new SqlCommand();
cmd.CommandText = sqlStatement;
cmd.Connection = connectionString;
SqlDataReader dr;
dr = cmd.ExecuteReader();
while (dr.HasRows)
{
    while (dr.Read())
    {
        MyDataRow newRow = new MyDataRowDataRow();
        newRow.Parse(dr); //Parse the value from datarow to our format
        result.Add(newRow);
        if (topN.HasValue)
        {
            if (result.Count >= topN.Value)
            {
                break; //stop reading!
            }
        } …
Run Code Online (Sandbox Code Playgroud)

optimization limits group-by

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

将数据写入 SQL 数据库的最大瓶颈(时间)是什么?

我正在运行一个 ETL 过程,该过程将大约 200 万行写入 SQL Server 数据库。

我正在尝试优化纯插入所需的时间(我猜更新是另一回事)。

我想知道将基本插入到 SQL 数据库的最大瓶颈是什么,或者是减少时间的最佳方法。

我的意思是,第一件事可能是数据的大小,对吗?行数、列数和每列中的数据大小。其中一些可能无法最小化,每行的 KB/ 占用空间是可以潜在优化的一件事,对吧?

还有什么可以优化或者是最大的因素?它是传输介质吗?我的意思是,写入同一台计算机上的数据库与通过 Web 连接写入(即强大、快速且 ping 为 1 毫秒?)之间有多大差异。

最后 --- 为什么与数据库的多个并行连接似乎将进程加速到某个点?我的意思是,当我有 20 个连接进行循环插入时,它比一个连接写入所有数据快 6-7 倍。我很好奇这是为什么。

现在我有 220 万行,总计 2.7 GB。这是每行 1.23 kb。

现在使用 14 个连接一次插入 1000 行 (1.23 MB) 需要 6.7 秒。这是蜗牛般的每秒 10.66 行。即使假设 1 个连接也一样快(它不是),最多为 150 行/秒,这也不是完全“快”。我正在写一个超快速、强大的网络连接 b/c,我们不能在与数据仓库相同的空间上进行 ETL 过程。

那么..如何优化这里的速度?

一次 1000 行的原因是因为数据来自 1000 页 - 但优化解析现在是一个单独的问题。

我相信我确实有一个主要索引,但没有什么写起来太昂贵。现在我只是在做蒙特卡罗之类的测试(尝试一下,看看什么是有效的),但我需要更专注的东西。

performance sql-server optimization parallelism query-performance

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

优化 Postgres 中的行级安全表达式

我有一个包含数百万行的表,分为几个类别(比如数字 1-5)。访问数据库的应用程序使用一个单一的数据库帐户。但是,该应用程序有自己的用户帐户,每个应用程序用户只能访问某些类别。因此,允许的类别列表通过会话变量传递给数据库:

SET SESSION mydb.allowed_categories = '1,3,5';
Run Code Online (Sandbox Code Playgroud)

我使用 RLS 根据会话变量过滤行:

CREATE POLICY table_select_policy ON big_table
FOR SELECT
USING (ARRAY[category] && string_to_array(current_setting('mydb.allowed_categories'),',')::int[]));
Run Code Online (Sandbox Code Playgroud)

问题在于,使用这种方法,RLS 行过滤需要花费大量时间。另一方面,当我通过以下方式进行实验时:

CREATE POLICY table_select_policy ON big_table
FOR SELECT
USING (category = 1 OR category = 3 OR category = 5);
Run Code Online (Sandbox Code Playgroud)

RLS 过滤几乎快了 10 倍。当然,这种硬编码是行不通的,因为我想在应用程序中动态更改允许的类别列表。

category列有一个 btree 索引,但是由于类别的数量相当少,查询计划器总是倾向于对 RLS 过滤器进行顺序扫描。

所以我的问题是 - 有没有办法优化 RLS 表达式,使其至少更接近硬编码方法?你会建议一个不同的解决方案吗?该应用程序有很多用户,所以我不想为每个用户都创建一个数据库帐户。

postgresql security optimization row-level-security

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

改进选择查询

我今天在接受新工作的面试时被问到一个关于SELECT查询的问题:

SELECT lastname FROM users WHERE name='John';
Run Code Online (Sandbox Code Playgroud)

SELECT查询将运行超过一百万行。

我被问到:你如何使它更快/更有效?

我没有答案,一些谷歌搜索也没有向我透露任何信息。

我知道这个问题被关闭的可能性很高,但我真的很想知道您如何使该查询运行得更快。有任何想法吗?

mysql performance optimization query-performance

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

IN 子句 - 列表值和查询之间的性能差异

我改变了这个查询

SELECT ...
FROM linkedServer.DB.Schema.Table1 t1
LEFT JOIN linkedServer.DB.Schema.Table2 t2 ON t1.ORDER_ID = t2.ORDER_ID
WHERE t1.BRANCH_ID NOT IN (
        '009991', '009992', '009993', '009994', '009995', '009996', '009999', '900001', 
        '900002', '900003', '900004', '900005', '900006', '900007', '900008', '999991', 
        '999992', '999993', '999994', '999995'
        )
GROUP BY ...
Run Code Online (Sandbox Code Playgroud)

进入这个

SELECT ...
FROM linkedServer.DB.Schema.Table1 t1
LEFT JOIN linkedServer.DB.Schema.Table2 t2 ON t1.ORDER_ID = t2.ORDER_ID
WHERE t1.BRANCH_ID NOT IN (
        SELECT b.BRANCH_ID
        FROM TB_BRANCH b --25 rows in total
        WHERE b.START_DT = '99999999' --the result of this sub-query …
Run Code Online (Sandbox Code Playgroud)

performance sql-server optimization execution-plan

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

条件子查询

我有以下查询:

SELECT id,
   email,
   first_name as "firstName",
   last_name as "lastName",
   is_active as "isActive",
   password,
   access,
   CASE
     WHEN access < 3 THEN (
       SELECT
         CASE WHEN count(*) = 1 THEN true ELSE false END
       FROM user_rating_entity ure
       WHERE ure.user_id = u.id
         AND ure.rating_entity_id = :re_id
     )
     ELSE true
   END as "isResponsible"
FROM users u
WHERE u.id = :id
Run Code Online (Sandbox Code Playgroud)

如果access > 3,字段“isResponsible”应直接设置为true,并且不应执行子查询。我在这两种情况下都使用了解释分析,其中 access>=<to 3但我得到了相同的输出。

为什么呢?

postgresql optimization execution-plan subquery explain

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

MySQL 在 ORDER BY 之前运行 WHERE 子句吗?

我有这个查询:

SELECT my_code 
FROM ranges 
WHERE 123456789 BETWEEN first_number AND last_number 
ORDER BY type_of_code ASC LIMIT 1 ;
Run Code Online (Sandbox Code Playgroud)

我的问题是,它会在ORDER BYWHERE子句中选择行之后运行吗?

KEYfirst_numberlast_number。我的桌子大约有 500 万行。我不想ORDER BY先。

mysql optimization order-by where

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

加速查询的方法

我的查询返回大约 590 行和 8 列。我遇到的问题是从开始到结束查询需要 2 分 30 秒才能完成。这里的一群人教会了我很多如何编写更有效的查询,所以这里是另一个!

我使用的是date变量而不是变量,datetime因为我的变量只包含一个日期 - 我还使用Aaron Bertrand - Bad Habits To Kickyyyymmdd建议的格式存储我的日期。

我可以做些什么来优化此查询并使结果返回得更快?

DECLARE @Startdate date = '20170101', 
        @Enddate   date = '20170131';

WITH fc As
(
    Select
    Teacher
    ,Team
    ,fc
    FROM [Helper].[dbo].[fc]
)
,ia As
(
    Select
    Teacher
    ,tia
    FROM dbo.ia
    WHERE [hiredate] >= @Startdate
    AND [hiredate] <  DATEADD(DAY,1,@Enddate)
)
,inb As
(
    Select 
    Teacher
    ,tinb
    FROM inb
),
ripcord As
(
    Select
    Teacher
    ,pit
    FROM [homebase].[dbo].[rip] …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization cte t-sql sql-server-2008-r2

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

同一个查询不同的执行计划

我正在尝试优化服务器的性能,这个特定的查询导致从数据库中读取大量数据,进而导致查询超时。此查询是从 Asp.Net MVC 中的 EF6 生成的。

这是有问题的查询:

exec sp_executesql N'SELECT 
[Project1].[C1] AS [C1], 
[Project1].[Date] AS [Date], 
[Project1].[AssetID] AS [AssetID], 
[Project1].[EventData] AS [EventData]
FROM ( SELECT 
    [Extent1].[AssetID] AS [AssetID], 
    [Extent1].[Date] AS [Date], 
    [Extent1].[EventData] AS [EventData], 
    1 AS [C1]
    FROM [dbo].[Alarm] AS [Extent1]
    WHERE ([Extent1].[AssetID] IN (cast(''c6e3142e-5b1f-4a91-90d2-03a504e86ece'' as uniqueidentifier), cast(''4de25e8a-7401-49ae-bd6d-0861d67f0d2f'' as uniqueidentifier), cast(''455e3a5f-1091-4784-9964-0a1a54eaa644'' as uniqueidentifier), cast(''04b46c21-c44f-4b67-b64b-12f2764c0448'' as uniqueidentifier), cast(''a350992b-8548-4bf1-bd22-131c114a5343'' as uniqueidentifier), cast(''98ec1f36-cc54-45d2-a0e3-22aa1b669373'' as uniqueidentifier), cast(''27abcf37-2093-43d5-ae62-2e7b10fe4692'' as uniqueidentifier), cast(''c9f43598-2b9c-47b0-9230-37440e6aea54'' as uniqueidentifier), cast(''c5964caa-5c73-4c0e-bb80-4c1dc7e11039'' as uniqueidentifier), cast(''6ac30678-3876-43c9-b708-61ef19b5ea17'' as uniqueidentifier), cast(''e69d870a-87de-4e3d-b4fc-62c962489a7b'' as uniqueidentifier), cast(''a7c2f407-c605-4491-85fe-66c16fc15586'' as uniqueidentifier), …
Run Code Online (Sandbox Code Playgroud)

performance sql-server optimization parameter-sniffing query-performance

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