标签: optimization

多视图查询优化

我们有一个怪物视图,其中包含与许多(许多)表的联接,以便返回所需的数据。在某些情况下,为了获取一列信息,我们必须连接到 4 个表,只是为了获取我们需要的值(数据库结构不是很好,我们无法更改它)。

为了提高性能,我提取了某些组件并将它们构建到自己的视图中,以简化执行计划,并希望优化查询。

如果我编写一个将这些视图连接在一起的查询,我是否会失去每个视图的查询优化的好处?即,我最终会回到开始的地方,将视图组合成单个选择,还是因为它们彼此原子地起作用,所以它本身会表现得更好?

sql-server optimization sql-server-2000 view

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

存储过程使用的 UDF 是否在 SP 本身中进行了优化/合并?

这个问题让我疯狂了几天,我可能已经找到了答案,但我需要确认并检查最终的简单解决方案。

当存储过程使用一些用户定义的函数时,UDF 计划是合并到主计划中并且一切都得到优化还是每次都直接调用?

假设它没有发生,有没有办法强制 SQL Server 为特定的 SP 执行它?

sql-server query optimization

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

查询速度优化

我有几个表,我试图将它们与以下查询结合起来。我正在使用以下表格:

  • LoanOrigination:这包含贷款特征,例如资产价值、贷款期限等。每笔贷款有一个独特的观察。该表在LOAN_IDSUB_SAMPLE和上建立索引COLLATERAL_TYPE
  • LoanPerformance:这包含了所有贷款的表现LoanOrigination。每一行是一个独特的MONTHLY_REPORTING_PERIODLOAN_ID组合,并且该表已被索引两个。
  • CollateralData:这包含基于COLLATERAL_TYPE. 这样做的目的是估计贷款对抵押品的当前价值。

下面查询的目的是组合这些表,以便每一行都包含贷款特征以及当月和下个月的拖欠状态。但是,查询速度非常慢。有什么办法可以加快速度吗?

with

COLLATERAL_VALUES as (
    select
        COLLATERAL_TYPE,
        dateadd( day, 1-day(AsOfDate), AsOfDate) as ASOFDATE,
        Value as INDEX
    from LoanData.CollateralData
),

SAMPLE_LOANS as (
    select
        a.*,
        b.INDEX as INDEX_T0
    from LoanData.LoanOrigination a
    join COLLATERAL_VALUES b on b.ASOFDATE = a.ORIG_DATE and b.COLLATERAL_TYPE = a.COLLATERAL_TYPE
    where SUB_SAMPLE = 0
),

LOAN_STATE as (
    select
        a.LOAN_ID,
        MONTHLY_REPORTING_PERIOD AS CUR_DATE,
        CURRENT_ACTUAL_UPB as CUR_UPB,
        LOAN_AGE, …
Run Code Online (Sandbox Code Playgroud)

performance sql-server optimization query-performance

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

我应该重新设计我的“事件”表

我的系统需要存储一个仅附加的事件日志。目前我有一个数据库表,将所有相关数据存储在一个表中:

CREATE TABLE `events` (
        `event_id` VARCHAR(255) NOT NULL PRIMARY KEY,
        `event_type` VARCHAR(255) NOT NULL,
        `event_timestamp` DATETIME,
        `group_id` VARCHAR(255),
        `person_id` VARCHAR(255),
        `client_id` VARCHAR(255),
        `name` VARCHAR(768),
        `result` VARCHAR(255),
        `status` VARCHAR(255),
        `logged_at` DATETIME,
        `severity` VARCHAR(255),
        `message` LONGTEXT,
        INDEX `event_type_index` (`event_type`),
        INDEX `event_timestamp_index` (`event_timestamp`),
        INDEX `group_id_index` (`group_id`),
        INDEX `person_id_index` (`person_id`),
        INDEX `client_id_index` (`client_id`),
        INDEX `name_index` (`name`),
        INDEX `result_index` (`result`),
        INDEX `status_index` (`status`),
        INDEX `logged_at_index` (`logged_at`),
      ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8_general_ci
Run Code Online (Sandbox Code Playgroud)

但是我注意到在 WHERE 子句中具有多个属性的查询仍然很慢。例如:

SELECT
  count(e.event_id) as total
FROM events e
WHERE
  e.result='Success' …
Run Code Online (Sandbox Code Playgroud)

mysql database-design optimization

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

Should I split timestamp parts into separate columns?

I am building a PostgreSQL database and I have created a timestamp table, where the primary key is the timestamp itself (e.g. id: Fri Apr 13 2018 15:00:19). The database is supposed to be later migrated to a data warehouse, from which analytics will be extracted.

At this point, I am wondering whether it is beneficial to add extra columns to the timestamp table, containing the parsed metrics such as the example below, or have a single table with …

postgresql performance database-design optimization timestamp query-performance

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

基数估计有所不同的查询执行计划示例

我正在尝试创建一个查询执行计划的示例,它表明如果我对表的某些列进行基数估计,我可以决定哪个查询执行计划的成本最低。

所以我有这两篇文章(12),我可以将估计基数理解为列上不同值的数量。然后我计算选择性。

SELECT max(price) FROM tickets WHERE country = "CANADA";
Run Code Online (Sandbox Code Playgroud)

如果我的桌子有 180 件物品,而只有 10 件是加拿大的。而且只有 4 个不同的国家(加拿大、巴西、美国、德国)。所以....

列 country é 4的基数,因为它是不同项目的数量。

列 country = CANADA的选择性是访问的项目数除以表中的项目数。10/180 = 0.0555。

但是优化器可以根据基数选择哪些不同的查询执行计划?

如果这不是一个很好的例子,有人可以指出一个查询,基数对于优化器来说是一种财富,以便决定选择一个计划还是另一个计划?

谢谢,费利佩

sql-server optimization execution-plan cardinality-estimates

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

在 PostgreSQL 中将 unix/epoch 值解析为“TIMESTAMP”

PostgreSQL 的COPY命令对于快速导入大量数据非常有用,并且数据必须采用数据类型的文本表示形式。

我正在导入大量数据,包括一timestamp,但它存储为“unix time”,即自纪元以来的秒数。我可以将其转换为ISO 8601(例如2010-01-01 00:00:00,并且 PostgreSQL 接受 a 的转换timestamp。它不接受原始纪元值整数。

是否可以让 postgres 接受纪元整数值并将其解释/转换为时间戳?这将使我的代码更简单(也许更快)。

这适用于psql

create temporary table test1 ( v1 timestamp );
copy test1 from stdin ;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF     signal.
>> 2010-01-01 00:00:00
>> \.
COPY 1
Run Code Online (Sandbox Code Playgroud)

但这些没有:

copy test1 from stdin …
Run Code Online (Sandbox Code Playgroud)

postgresql optimization import timestamp copy

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

带有文字的 SQL Server 查询立即运行,使用变量需要几分钟

对于运行 ERP 系统的 Azure 上的 Microsoft SQL Server 2017 (RTM-CU20)(因此不能更改此处的代码)。

我有一个超过 4200 万行的表。这是一个机器操作统计跟踪表。用户按设备、日期、班次和统计类型(运行小时数、吨数等)输入运行统计数据。

该表具有这样的主键结构(请不要对 nchar 而不是 nvarchar 或将日期存储为字符串发表评论,这就是 ERP 供应商提供它的方式,这正是我必须使用的):

equip nchar(12)       This is a 12 character equipment number
key_type nchar(1)     One of two values E for equipment or G - always E here
shift_seq_no nchar(2) Sequence of shifts (usually 00 or 01)
stat_date nchar(8)    Date, YYYYMMDD
stat_type nchar(2)    A code for stat type, OH here (operating hours)
trc_seq_no nchar(3)   A sequence number for when there's more than one entry …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization query-performance

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

如果使用日期函数,则在 MySQL 中索引日期列不起作用

我有一个具有以下架构的表

table_name

id int
task_id int
completed_date datetime (INDEX IX_TBL_NAME_COMPLETED_DATE)
Run Code Online (Sandbox Code Playgroud)

我在这个查询上运行 EXPLAIN

EXPLAIN 
    SELECT
        *
    FROM table_name TBL
    WHERE
        TBL.completed_date BETWEEN date1 AND date2
Run Code Online (Sandbox Code Playgroud)

此查询使用已完成日期的索引运行并获取记录

但是,在使用日期函数运行相同的查询时

EXPLAIN 
    SELECT
        *
    FROM table_name TBL
    WHERE
        CONVERT_TZ(TBL.completed_date, timezone1, timezone2) BETWEEN date1 AND date2
Run Code Online (Sandbox Code Playgroud)

未使用索引导致查询变慢。

有人可以解释这种行为背后的原因以及优化此类查询的解决方案吗?

mysql optimization index-tuning datetime mysql-5.7

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

使用“OR”运算符时的 SQL Server 索引扫描

我们实现了一个 Google 风格的搜索,其中在前端触发去抖动后运行 SQL 查询。(我们知道 SQL 可能是错误的技术,但我在这里陷入了启动混乱。)查询:

SELECT 
    TOP(50) [Name], [Surname]
FROM 
    [dbo].[Clients]
WHERE 
    [Name] LIKE @SearchTerm + '%' OR
    [Surname] LIKE @SearchTerm + '%'
Run Code Online (Sandbox Code Playgroud)

这是一个相当大的表,所以我在两列上添加了两个非聚集索引以帮助加快速度:

CREATE NONCLUSTERED INDEX [IX_Patients_Name] ON [dbo].[Clients]
(
    [Name] ASC
)
INCLUDE([Surname]);

CREATE NONCLUSTERED INDEX [IX_Patients_Surname] ON [dbo].[Clients]
(
    [Surname] ASC
)
INCLUDE([Name]);
Run Code Online (Sandbox Code Playgroud)

我的想法是 SQL 会在两列上进行索引查找,但查询优化器似乎决定使用索引扫描

聚集索引查找

对于这个简单的用例,这可能不是一个真正的问题,但我们有更复杂的版本,具有多个连接等。

有什么方法可以优化此查询以使用搜索吗?

sql-server optimization nonclustered-index

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