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
    • 最新
    • 标签
主页 / dba / 问题 / 77628
Accepted
user1910240
user1910240
Asked: 2014-09-26 05:50:16 +0800 CST2014-09-26 05:50:16 +0800 CST 2014-09-26 05:50:16 +0800 CST

读取 SQL Server 执行计划

  • 772

我对任何类型的调优都很陌生,但一直在学习更多。我的一个特定数据库中发现的慢速查询问题之一是许多隐式转换。据我了解,当比较 2 种不相似的列类型时,SQL Server 必须将一种转换为另一种,有优先级列表告诉它如何转换——由于数据类型已转换,它可能不会使用索引正确.. 确定的第一个查询是一个非常基本的查询,我想看看是否有人可以帮助我确定我在执行计划中看到的内容......

基本查询是:

(
@1 TINYINT
,@2 VARCHAR(8000)
,@3 NUMERIC(4, 0)
)
SELECT CONVERT([float], [low] / @3, 0)
FROM [master].[dbo].[spt_values]
WHERE [number] = @1
AND [type] = @2

执行计划显示:

在此处输入图像描述

聚簇索引查找的详细信息

索引查找

spt_vaules.Type 定义为 nchar(3)

Seek Predicates 部分让我感到困惑,它到底在转换哪一部分......我的查询说 [low] 正在从 int 转换为 numeric 但这似乎不是集群索引搜索细节显示的内容,是它?

有没有办法在这个具体的例子中告诉我如果我明确地进行转换会有多少“更好”?我认为我可以在查询中进行“转换”并在变量所在的位置插入一些数字,对吗?

sql-server index-tuning
  • 1 1 个回答
  • 1403 Views

1 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2014-09-26T06:19:35+08:002014-09-26T06:19:35+08:00

    为什么您的输入参数与表的类型不匹配?为什么要保留错误的类型并执行任何强制转换或转换(无论是隐式还是显式)?你为什么要将任何东西转换为FLOAT, of all things?解决具体问题:

    我的查询说 [low] 正在从 int 转换为 numeric 但这似乎不是集群索引搜索详细信息显示的内容,是吗?

    的转换low发生在输出中,而不是在查找谓词中(谓词用于查找匹配行和/或消除不匹配行)。

    有没有办法在这个具体的例子中告诉我如果我明确地进行转换会有多少“更好”?我认为我可以在查询中进行“转换”并在变量所在的位置插入一些数字,对吗?

    除了生成不同的计划并进行比较之外,没有办法让执行计划向您展示不同的计划会有多好。您可以使用此比较来记录如果接口正确会有多好(另外两种方法是保留接口但是(a)在查询中执行显式转换 - 不是列,而是变量或(b) 使用正确类型的局部变量并为它们分配参数值)。所以你可以向他们展示 3 种不同的方法来解决问题,并展示所有 3 种方法都比当前版本更好的证据。

    我的建议是以正确的方式修复程序。首先让我们看看您关心的实际类型:

    USE master;
    GO
    SELECT t.name, c.max_length/CASE 
      WHEN t.name LIKE N'n[cvt]%' THEN 2 ELSE 1 END
    FROM sys.all_columns AS c 
    INNER JOIN sys.types AS t
    ON c.system_type_id = t.system_type_id
    AND c.system_type_id = t.user_type_id
    WHERE EXISTS
    (
      SELECT 1 FROM sys.all_objects AS o
        INNER JOIN sys.schemas AS s
        ON o.[schema_id] = s.[schema_id]
        WHERE o.[object_id] = c.[object_id]
        AND o.name = N'spt_values'
        AND s.name = N'dbo'
    )
    AND c.name IN (N'number',N'type');
    

    结果:

    number    int     4
    type      nchar   3
    

    所以你的存储过程的接口应该是:

    USE yourdb;
    GO
    ALTER PROCEDURE dbo.some_name
      @1 INT,
      @2 NCHAR(3),
      @3 NUMERIC(4, 0)
    AS
    BEGIN
      SET NOCOUNT ON;
    
      SELECT CONVERT([float], [low] / @3, 0) -- don't think you want float here
        FROM [master].[dbo].[spt_values]
        WHERE [number] = @1
        AND [type] = @2;
    END
    GO
    

    varchar 和 nvarchar 之间的隐式转换可能特别糟糕(尤其是在与您相反的情况下 - 参数是 nvarchar 并且列是 varchar),但是当可能的最长字符串时,确实没有理由允许任何类型的 8000 个字符的参数表中是3个字符...

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

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