小编Nat*_*ate的帖子

EF Code First 对所有字符串使用 nvarchar(max)。这会损害查询性能吗?

我有一些使用 Entity Framework Code First 创建的数据库;应用程序正在运行,总的来说,我对 Code First 让我做的事情感到非常满意。我首先是一名程序员,其次是 DBA,这是必要的。我正在阅读 DataAttributes 以在 C# 中进一步描述我希望数据库执行的操作;我的问题是:将这些nvarchar(max)字符串放在我的桌子上会吃什么惩罚(见下面的例子)?

在这个特定的表中有几列;在 C# 中,它们是这样定义的:

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Message { get; set; }
    public string Source { get; set; }
    public DateTime Generated { get; set; }
    public DateTime Written { get; set; }
Run Code Online (Sandbox Code Playgroud)

我希望根据名称、来源、生成和书面内容进行查询和/或排序。我希望 Name 和 Source 的长度为 0-50 个字符,有时可达 150 个。我希望这个表开始时很小(<100k 行),但随着时间的推移显着增长(>1m 行)。显然消息可以是小或大的,并且可能不会被查询。

我想知道的是,我的 Name 和 Source …

sql-server entity-framework sql-server-2008-r2 azure-sql-database

33
推荐指数
4
解决办法
7万
查看次数

SQL Server 位列是否真的使用了整个字节的空间?

我在 SSMS 周围闲逛,注意到我的INT列的“大小”是 4 个字节(预期),但看到我的BIT列是一个完整字节时,我有点震惊。

我误解了我在看什么吗?

sql-server datatypes

20
推荐指数
3
解决办法
6411
查看次数

当现有索引包含新索引中的所有列时,为什么创建这个新索引会大大提高性能?

我有 Log 和 LogItem 表;我正在编写一个查询来从两者中获取一些数据。有数千个,Logs每个Log最多可以有 125 个LogItems

有问题的查询很复杂,所以我跳过它(如果有人认为它很重要,我可以发布它),但是当我运行 SSMS 估计查询计划时,它告诉我一个新的非聚集索引可以将性能提高到 100% .

Existing Index: Non-clustered
Key Colums (LogItem): ParentLogID, DateModified, Name, DatabaseModified

Query Plan Recommendation
CREATE NONCLUSTERED INDEX [LogReportIndex]
ON [dbo].[LogItem] ([ParentLogID],[DatabaseModified])
Run Code Online (Sandbox Code Playgroud)

只是为了好玩,我创建了这个新索引并运行了查询,令我惊讶的是,我的查询现在需要大约 1 秒才能运行,而之前是 10+ 秒。

我假设我现有的索引会覆盖这个新查询,所以我的问题是为什么在我的新查询中使用的唯一列上创建一个新索引可以提高性能?我是否应该为我的where子句中使用的每个唯一的列组合创建一个索引?

注意:我不认为这是因为 SQL Server 正在缓存我的结果,我在创建索引之前运行了大约 25-30 次查询并且它持续花费了 10-15 秒,在索引之后它现在持续 ~1或更少。

index sql-server

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

PL/SQL:计算数组元素的最佳方法?

鉴于这种:

DECLARE
  TYPE T_ARRAY IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
  MY_ARRAY T_ARRAY;
  V_COUNT INTEGER;
Run Code Online (Sandbox Code Playgroud)

我想要做:

BEGIN
  -- ... some code filling the MY_ARRAY array

  -- obviously COUNT_ELEMENTS() does not exists, this is what I'm looking for :-)
  V_COUNT := COUNT_ELEMENTS(MY_ARRAY);

  DBMS_OUTPUT.PUT_LINE('My array containts ' || V_COUNT || ' elements.');
END;
Run Code Online (Sandbox Code Playgroud)

有什么比创建一个执行基本循环递增计数器的过程更好的方法吗?也许 PL/SQL 本机函数已经这样做了COUNT_ELEMENTS()

oracle plsql

16
推荐指数
3
解决办法
8万
查看次数

是否可以提高具有数百万行的窄表的查询性能?

我有一个查询目前平均需要 2500 毫秒才能完成。我的表很窄,但有 4400 万行。我有什么选择可以提高性能,或者这是否已经达到了最好的效果?

查询

SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'; 
Run Code Online (Sandbox Code Playgroud)

桌子

CREATE TABLE [dbo].[Heartbeats](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DeviceID] [int] NOT NULL,
    [IsPUp] [bit] NOT NULL,
    [IsWebUp] [bit] NOT NULL,
    [IsPingUp] [bit] NOT NULL,
    [DateEntered] [datetime] NOT NULL,
 CONSTRAINT [PK_Heartbeats] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

指数

CREATE NONCLUSTERED INDEX …
Run Code Online (Sandbox Code Playgroud)

performance sql-server optimization query-performance

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

为什么这个查询不使用我的非聚集索引,我该如何做?

作为这个关于提高查询性能的问题的后续,我想知道是否有办法让我的索引默认使用。

此查询在大约 2.5 秒内运行:

SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
Run Code Online (Sandbox Code Playgroud)

这个运行在大约 33 毫秒内:

SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' 
ORDER BY [DateEntered], [DeviceID];
Run Code Online (Sandbox Code Playgroud)

[ID] 字段 (pk) 上有一个聚集索引,[DateEntered],[DeviceID] 上有一个非聚集索引。第一个查询使用聚集索引,第二个查询使用我的非聚集索引。我的问题是两部分:

  • 为什么,因为两个查询在 [DateEntered] 字段上都有一个 WHERE 子句,服务器是否在第一个而不是第二个上使用聚集索引?
  • 即使没有orderby,如何在此查询中默认使用非聚集索引?(或者为什么我不想要这种行为?)

index sql-server optimization sql-server-2008-r2

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

视图上的 SELECT COUNT(*) 比同一视图上的 SELECT * 慢几个数量级

风景

CREATE VIEW [dbo].[vProductList]
WITH SCHEMABINDING
AS 

SELECT
     p.[Id]
    ,p.[Name]
    ,price.[Value] as CalculatedPrice
    ,orders.[Value] as OrdersWithThisProduct
FROM 
    products as p 
    INNER JOIN productMetadata as price ON p.Id = price.ProductId AND price.MetaId = 1
    INNER JOIN productMetadata as orders ON p.Id = orders.ProductId AND orders.MetaId = 2
Run Code Online (Sandbox Code Playgroud)

为简单起见,假设productMetadataProductId, MetaId, Value有~87m 行,products表中有大约 400k 行。

针对此视图的一般查询完美地工作:

SELECT * FROM vProductList WHERE CalculatedPrice > 500
Run Code Online (Sandbox Code Playgroud)

查询结果在 2-4 秒内(通过 vpn 和远程,所以我很擅长)。

将上述更改为计数同样快:

SELECT COUNT(*) from vProductList WHERE …
Run Code Online (Sandbox Code Playgroud)

performance view azure-sql-database query-performance

10
推荐指数
1
解决办法
3260
查看次数

Oracle 排序 varchar2 列最后带有特殊字符

如何在 Oracle 中按我自己自定义的顺序对 Varchar2 或 NVarchar2 列进行排序。或者是否有任何现有的选项可以先放字母,然后是数字,然后是所有特殊字符。

我们的第一种方法是使用一个函数来手动将字符映射到数字。

select id, sorted_column
from some_table
order FN_SPECIAL_SORT_KEY(sorted_column,'asc')
Run Code Online (Sandbox Code Playgroud)

特殊的排序函数将每个字符映射到一个 2 位数字,返回值用于排序。这似乎只是非常昂贵的串联,感觉不对。

        for i in 1..length(sorted_text)
        loop
            v_result:=v_result ||  case substr(sorted_text,i,1)
                WHEN ' '   THEN 82 WHEN  '!'   THEN 81 WHEN '"'    THEN 80 WHEN  '#'   THEN 79 WHEN  '$'
                ..............
                WHEN 'u'   THEN 15 WHEN  'U'   THEN 15 WHEN  'v'   THEN 14 WHEN  'V'   THEN 14 WHEN  'w'   THEN 13 WHEN  'W'   THEN 13 WHEN  'x'
                ....
                else 90 end;
        end loop;
Run Code Online (Sandbox Code Playgroud)

我很难想出另一种方法。我想知道这种方法存在哪些问题。也许我们别无选择。 …

oracle oracle-10g order-by sorting

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

使用复制进行横向扩展

阅读了Using Replication for Scale-Out,我如何将不同的查询路由到不同的服务器,例如,SELECT我想路由到从服务器和NON-SELECT主服务器。我假设作为负载均衡器我可以使用haproxy,但我没有发现可以在haproxy级别上区分查询?另外,假设有人直接到达了master,master如何识别这是SELECT查询和显示发送到slave,或loadbalancer。

mysql replication scalability

8
推荐指数
1
解决办法
387
查看次数

时间跟踪应用程序的数据库设计

我正在为时间跟踪应用程序设计数据库架构,我需要一些建议。应用程序必须允许用户为一周中的每一天输入他为特定项目工作的时间。在您看来,存储这些值的最佳方式是什么?

database-design

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