我在我的生产服务器上运行了一个asp.net网站.我想获得在生产服务器中分析asp.net网站的可能方法,因为我的应用程序非常慢?正如我所说的慢,我不是指静态内容的传递,而是数据库操作和我的c#代码?那有什么建议吗?
asp.net performance profiling query-optimization production-environment
例如,假设您有这样的查询:
SELECT *
FROM table1 t1
JOIN table2 t2 ON t1.field1 = t2.field1 AND t1.year = t2.year
JOIN table3 t3 ON t1.field1 = t3.field1 AND t1.year = t3.year
JOIN table4 t4 ON t3.field2 = t4.field2 AND t3.year = t4.year
WHERE t1.year = '2010'
Run Code Online (Sandbox Code Playgroud)
这样做更快:
SELECT *
FROM table1 t1
JOIN table2 t2 ON t1.field1 = t2.field1 AND t1.year = t2.year AND t2.year = '2010'
JOIN table3 t3 ON t1.field1 = t3.field1 AND t1.year = t3.year AND t3.year = '2010'
JOIN …Run Code Online (Sandbox Code Playgroud) 简单的问题:D.我知道该怎么做,但我必须快速完成.
什么是最有效的方法?
场景:两个表,tableA并且tableB,更新tableA.columnA的tableB.columnB基础上tableA.primarykey = tableB.primarykey.
问题:tableA与tableB各超过10.000.000纪录.
为了填充我的数据库,我有一些这样的循环:
for (int i=0;i<something;++i){
myDatabase.insert(...);
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,需要很长时间.所以我想知道如何改善运行时?我试着只打一次这样的插入:
String queries="";
for (int i=0;i<something;++i){
queries += "my query;";
}
myDatabse.execSQL(queries);
Run Code Online (Sandbox Code Playgroud)
但execSQL函数只插入第一个查询,而不插入其他查询.那我该怎么办?
我们假设我有以下查询:
SELECT地址
FROM地址a,名称n
WHERE a.address_id = n.address_id
GROUP BY n.address_id
HAVING COUNT(*)> = 10
如果这两个表足够大(想想我们在这两个表中是否有整个美国人口)那么在这个SELECT上运行一个EXPLAIN会说Using temporary; Using filesort这通常不好.
如果我们有一个包含许多并发INSERT和SELECT的DB(如此),那么将该GROUP BY a.address_id HAVING COUNT(*) >= 10部分委托给PHP是一个很好的计划来最小化数据库资源?对此进行编码最有效的方法(就计算能力而言)是什么?
编辑:似乎共识是卸载到PHP是错误的举动.那怎么样,我可以改进查询(让我们假设索引已经正确创建)?更详细地说,如何避免DB创建临时表?
除了users表,Wordpress还有一个包含以下列的usersmeta表
无论行是否具有填充的meta_value,每个用户在usersmeta表中都有20行.也就是说,将始终存在的元行添加到users表中会不会更有效率?
我猜测更频繁地查询users表中的信息(例如user_id,username,pass),因此将这些行保持较小的效率更高.这是真的?表格分离还有其他原因吗?
在我的应用程序中优化查询的过程中,我发现了一些奇怪的东西 在代码的给定部分中,我将获得对象,更新一些值,然后保存.从理论上讲,这应该执行2个查询.但事实上它执行3个查询.我在获取对象时选择查询,在保存对象时选择2(另一个选择然后更新!).删除一个查询可能看起来很愚蠢.在这个特定的方法中,我正在更新许多对象,因此我保存的每个查询在数据库上的命中率都会降低1,并且应该加快方法的速度
通过检查查询,两个选择查询是不同的,第一个得到很多东西,并且由它执行的选择很简单.
这是示例代码:
myobject = room.myobjects.get(id=myobject_id) # one query executed here
myobject.color = color
myobject.shape = shape
myobject.place = place
myobject.save() # two queries executed here
Run Code Online (Sandbox Code Playgroud)
查询:
1) "SELECT `rooms_object`.`id`, `rooms_object`.`room_id`, ......FROM `rooms_object` WHERE (`rooms_object`.`id` = %s AND `rooms_object`.`room_id` = %s )"
2) "SELECT (1) AS `a` FROM `rooms_object` WHERE `rooms_object`.`id` = %s LIMIT 1"
3) "UPDATE ......this ones obvious"
Run Code Online (Sandbox Code Playgroud)
我希望save方法能够识别它已经拥有内存中的对象而且它不需要再次获取它......如果可能的话......
我在一个表中运行了大约1,300,000条记录的查询.它需要满足某些WHERE条件的某些记录并将它们插入另一个表中.它首先完全清除目标表.
每次执行时,完成查询所需的时间会大大改善:
1st: 5 minutes, 3 seconds
2nd: 2 minutes, 43 seconds
3rd: 12 seconds
4th: 3 seconds
Run Code Online (Sandbox Code Playgroud)
除了点击Execute之外我什么也没做.我的查询看起来像这样(有些缩写用于长度目的):
DELETE FROM dbo.ConsolidatedLogs --clear target table
DECLARE @ClientID int
DECLARE c CURSOR FOR SELECT ClientID FROM dbo.Clients
OPEN c
FETCH NEXT FROM c INTO @ClientID --foreach LogID
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO dbo.ConsolidatedLogs
(col1, col2)
SELECT col1, col2
FROM dbo.CompleteLogsRaw
WHERE col3 = true AND
ClientID = @ClientID
FETCH NEXT FROM c INTO @ClientID
END
CLOSE c
DEALLOCATE c …Run Code Online (Sandbox Code Playgroud) 我有一个名为Abono的实体,它是Check,Efectivo,Debito等其他几个实体的父类.在我的应用程序中,我使用带有这样的DQL语句的存储库类查询Abono类实例的所有对象(代码是真实类型的简化版本):
$dql = "SELECT ab FROM FranquiciaBundle:Abono AS ab";
return $em->createQuery($dql)
->getResult();
Run Code Online (Sandbox Code Playgroud)
在我的模板中,我正在显示这样的结果(再次,简化代码):
{% for abono in abonos %}
<tr>
<td>{{ abono.id }}</td>
<td>{{ abono.tipo }}</td>
</tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我有5000条记录对表和探查告诉我,该应用程序是打如我所料只是一次数据库的5000倍,而不是,所以我改变阙库使用位getArrayResult()代替getResult(),但问题是,这句话{{ abono.tipo }}是一个方法调用对象,而不是存储在数据库中的属性,因此它永远不会被水合到结果数组中.
所以我的问题是,如何让一个对象数组只攻击一次数据库?
UPDATE:getTipo()类Abono 的方法返回每个对象的Late Static Binding类名,它不是关联.
public function getTipo()
{
$className = get_called_class();
$pos = strrpos($className,'\\');
return substr($className, $pos+1);
}
Run Code Online (Sandbox Code Playgroud) 我有一个表负责存储日志.DDL是这样的:
CREATE TABLE LOG(
"ID_LOG" NUMBER(12,0) NOT NULL ENABLE,
"DATA" DATE NOT NULL ENABLE,
"OPERATOR_CODE" VARCHAR2(20 BYTE),
"STRUCTURE_CODE" VARCHAR2(20 BYTE),
CONSTRAINT "LOG_PK" PRIMARY KEY ("ID_LOG")
);
Run Code Online (Sandbox Code Playgroud)
有这两个指数:
CREATE INDEX STRUCTURE_CODE ON LOG ("OPERATOR_CODE");
CREATE INDEX LOG_01 ON LOG ("STRUCTURE_CODE", "DATA") ;
Run Code Online (Sandbox Code Playgroud)
但是这个查询产生了一个完整的表扫描:
SELECT log.data AS data1,
OPERATOR_CODE,
STRUCTURE_CODE
FROM log
WHERE data BETWEEN to_date('03/03/2008', 'DD-MM-YYYY')
AND to_date('08/03/2015', 'DD-MM-YYYY')
AND STRUCTURE_CODE = '1601';
Run Code Online (Sandbox Code Playgroud)
为什么我总是看到一个FULL TABLE SCAN列DATA和STRUCTURE_CODE?
(我也试过创建两个不同的索引STRUCTURE_CODE,DATA但我总是进行全表扫描)
sql ×5
mysql ×2
sql-server ×2
android ×1
asp.net ×1
constraints ×1
django ×1
doctrine ×1
doctrine-orm ×1
join ×1
oracle ×1
performance ×1
php ×1
profiling ×1
sql-update ×1
sqlite ×1
symfony ×1
wordpress ×1