我有以下查询。出于性能优化的原因,我被要求用 SQL 中的 ISNULL 函数替换逻辑。我怎样才能做到这一点?请指教。
SELECT CASE
WHEN tb1.[tag-value] IS NOT NULL THEN tb1.[tag-value]
ELSE 'N/A'
END AS [tag-value]
FROM @AgentTableFilt ta
Run Code Online (Sandbox Code Playgroud) 我有这个查询运行了很长时间
(@P0 nvarchar(4000))
select emaildmo0_.Id as Id7_
,emaildmo0_.CreatedDate as CreatedD2_7_
,emaildmo0_.EmailAddress as EmailAdd3_7_
,emaildmo0_.EmailType_Id as EmailType4_7_
,emaildmo0_.isPreferedEmail as isPrefer5_7_
,emaildmo0_.ProfileId as ProfileId7_
,emaildmo0_.UpdatedDate as UpdatedD6_7_
from dbo.Email emaildmo0_
where emaildmo0_.EmailAddress = @P0
Run Code Online (Sandbox Code Playgroud)
这是执行计划

我的第一个问题为什么是索引扫描而不是索引查找
ExecutionPlan.xml 中的这两行
<Warnings>
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(255),[emaildmo0_].[EmailAddress],0)" />
<PlanAffectingConvert ConvertIssue="Seek Plan" Expression="CONVERT_IMPLICIT(nvarchar(255),[emaildmo0_].[EmailAddress],0)=[@P0]" />
</Warnings>
Run Code Online (Sandbox Code Playgroud)
你能帮我解释一下这个警告是什么意思吗?如果有任何建议来调整这个查询
这是我的查询:
SELECT a.z_companyid_pk "z_companyid_pk" ,
a.company_name "Client" ,
a.display_name "Display_Name" ,
a.z_parentcompanyid_fk "Parent_Company",
a.z_resellerid_fk "Reseller" ,
(SELECT company_name
FROM company_mst
WHERE z_companyid_pk= a.z_resellerid_fk
)
"Reseller_name",
(SELECT IF(COUNT(*)>=1,"YES","NO")
FROM webprofile
WHERE z_boxid_fk IN
(SELECT z_boxid_pk
FROM box_mst
WHERE z_companyid_fk=a.z_companyid_pk
)
)
"V1_Website",
(SELECT IF(COUNT(*)>=1,"YES","NO")
FROM webapp_mst
WHERE z_companyid_fk=a.z_companyid_pk
)
"V2_Website",
(SELECT IF(COUNT(*)>0,"YES","NO")
FROM widget_mst
WHERE widget_status=1
AND type IN("templated-menu",
"menus")
AND z_companyid_fk=a.z_companyid_pk
)
"Widgets_with_my_menu",
(SELECT IF(COUNT(imagehtml)>0,"YES","NO")
FROM image_mst
WHERE LENGTH(imagehtml)>0
AND z_companyid_fk =a.z_companyid_pk
)
"HTML_menus",
(SELECT MAX(login_datetime)
FROM loginlog_mst a
LEFT …Run Code Online (Sandbox Code Playgroud) 当存储过程在任何时候从管理工作室运行良好时,我正在对这种情况进行故障排除,但即使对于相同的参数,相同的存储过程在其中一个网络服务器中运行得非常糟糕。可能有一些原因导致这种情况,包括阻塞等。
我想排除使用不同 SET 选项创建 2 个不同计划的可能性,并且这些计划中至少有一个使用产生错误计划的参数组合进行了优化。
引用本杰明·内瓦雷斯:
“一般来说,查询优化是一个代价高昂的操作,为了避免这种优化成本,计划缓存会尽量将生成的执行计划保存在内存中,以便它们可以被重用。但是,如果一个新的连接运行相同的存储过程有不同的SET选项,它可能会生成一个新的计划……”
为了解决这个问题,我想要一个 T-SQL 查询,它会显示为会话设置的所有值。
这可能吗?
以下 SET 选项将影响执行计划的重用:
(他们中的一些)
DATEFORMAT
LANGUAGE
NUMERIC_ROUNDABORT
FORCEPLAN
performance sql-server optimization plan-cache sql-server-2014 query-performance
我在数据库中有两张表,一张是Orders,另一张是customers
订单表包含:订单 ID、客户 ID 和订单日期
客户表包含:CustomerID、CustomerName、ContactName 和 country
实际上,“Orders”表中的“CustomerID”列指的是“Customers”表中的“CustomerID”。上面两个表之间的关系是“CustomerID”列。
加入查询
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;
Run Code Online (Sandbox Code Playgroud)
简单查询
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders,Customers
WHERE Orders.CustomerID=Customers.CustomerID;
Run Code Online (Sandbox Code Playgroud)
两个查询的结果是: OrderID 、 CustomerName 和 OrderDate
在上面的两个查询中,我得到了相同的结果。我想知道这些查询之间的区别,如果我们可以通过 SIMPLE 查询来实现,为什么要使用 JOIN?
我有一个 8GB 大的表,有 20M 条记录。有一个名为 mth 的 int 字段。第 m 个字段以 YYYYMM 的形式存储日期信息,我想将第 m 个字段转换为连续整数。所以我使用一个公式从字段mth中获取年份和月份并计算月份顺序,具体来说,我使用以下代码:
create function mth_to_num(@month int)
returns int
as
begin
return(round(@month/100,0)*12+@month-100*round(@month/100,0))
end
Run Code Online (Sandbox Code Playgroud)
然后我用下面的代码来更新大表中的值
update full_orig_month_Q1_1999
set mth_order = dbo.mth_to_num(period)
Go
Run Code Online (Sandbox Code Playgroud)
但是,代码执行时间很长,大约 2-3 分钟。我的系统是带有 SQL Server 2016 的 Windows 10 64 位。有什么办法可以加快速度吗?
另一个问题是,执行上述查询后,我发现SQL server 在数据库中占用了多达8GB 的空间。需要那么多内存吗?我怎样才能释放它们?
提前感谢您的帮助!
杰森
我想更新一个有 83,423,460 行并且还在增长的大表。
以下查询需要 8 分钟才能成功执行:
UPDATE FPP_Invoice_Revenue
SET Till_Prev_Inv_Amt = Till_Prev_Inv_Amt_In_USD / 0.0285714286,
Cur_Inv_Amt = Cur_Inv_Amt_In_USD / 0.0285714286,
YTD_Inv_Amt = YTD_Inv_Amt_In_USD / 0.0285714286
WHERE SOW_Number = '20014378'
Run Code Online (Sandbox Code Playgroud)
存在一个clustered index。我想在更新之前禁用该索引,并在更新后再次重建,但这也不起作用,因为重建需要很多时间。
我在某处读过这可以通过分成小部分来实现,但是如何划分上述查询?
DDL:
CREATE TABLE [dbo].[FPP_Invoice_Revenue](
[Project_Code] [varchar](10) NOT NULL,
[Project_Desc] [varchar](50) NULL,
[SOW_Number] [varchar](10) NOT NULL,
[SOW_Desc] [varchar](50) NULL,
[Invoice_No] [varchar](50) NOT NULL,
[Inv_Month] [int] NOT NULL,
[Inv_Year] [int] NOT NULL,
[Billing_Date] [smalldatetime] NULL,
[Doc_Currency] [varchar](10) NULL,
[Vertical] [varchar](255) NULL,
[Till_Prev_Inv_Amt] [numeric](24, 10) NULL,
[Cur_Inv_Amt] [numeric](24, 10) NULL, …Run Code Online (Sandbox Code Playgroud) 我有一个现有的ASSET_SUMMARY_VW观点:
+-----------------------+---------------+
| ASSET_TYPE | COST |
+-----------------------+---------------+
| TRANSPORTATION | 1,000,000,000 |
| TRANSPORTATION | 500,000,000 |
| TRANSPORTATION | 500,000,000 |
| ACTIVE TRANSPORTATION | 100,000,000 |
| ACTIVE TRANSPORTATION | 50,000,000 |
| STORMWATER MANAGEMENT | 500,000,000 |
+-----------------------+---------------+
Run Code Online (Sandbox Code Playgroud)
我想 GROUP BY 并计算每个ASSET_TYPE与总成本相比的百分比:
+-----------------------+---------------+------------------+
| ASSET_TYPE | COST | PERCENT_OF_TOTAL |
+-----------------------+---------------+------------------+
| TRANSPORTATION | 2,000,000,000 | 75.4 |
| ACTIVE TRANSPORTATION | 150,000,000 | 5.6 |
| STORMWATER MANAGEMENT | 500,000,000 | …Run Code Online (Sandbox Code Playgroud) performance oracle aggregate computed-column query-performance
我们有一个第三方分析平台,允许最终用户从选择的预定义视图中创建自己的表格和图表。这将查询 MS SQL 数据库。
不幸的是,根据我的知识和理解,该软件注入数据库以查询数据的 SQL 语法似乎非常低效,或者看起来如此。
例如,以下是将两个表连接在一起的查询的样子:
SELECT tblOne.ColumnOne, tblOne.ColumnTwo, tblTwo.ColumnThree
FROM (SELECT * FROM tblOne) AS tblOne
JOIN (SELECT * FROM tblTwo) AS tblTwo ON tblOne.id = tblTwo.id
Run Code Online (Sandbox Code Playgroud)
现在想象这些表每个都有很多列,或者有更多连接到附加表,每个表都遵循相同的模式 - 我假设这将在子查询中执行全表扫描,有效地读取比实际需要的更多的数据是否正确?我是否也正确地假设以下内容实际上会更有效?
SELECT tblOne.ColumnOne, tblOne.ColumnTwo, tblTwo.ColumnThree
FROM tblOne
JOIN tblTwo ON tblOne.id = tblTwo.id
Run Code Online (Sandbox Code Playgroud)
在我给这个分析解决方案的开发人员写一封措辞强硬的电子邮件之前,我只是想要第二个意见,以防万一我误解了引擎将如何处理这样的查询。
提前致谢。
如果我理解正确,索引一列会提高 SELECT 速度,但会降低 INSERT 速度。
假设您的应用程序是新的,并且您已经确定了适合编制索引的列(基于您查看视图的方式,例如 WHERE / JOINS)。
您是否必须在发现性能问题之前立即索引这些列?或者稍后再做这些操作而不影响 INSERT 是否有意义?
mysql performance optimization query-performance performance-tuning
performance ×10
sql-server ×6
optimization ×5
mysql ×3
aggregate ×1
isnull ×1
join ×1
oracle ×1
plan-cache ×1
t-sql ×1
update ×1